Utasítások
Statement = [Assignment |
ProcedureCall | IfStatement | CaseStatement | WhileStatement | RepeatStatement |
LoopStatement | WithStatement | EXIT | RETURN [expression]]
Értékadás
Assignment = Designator ":=" Expression
Ha egy e kifejezést, amely T1 típusú értékül adjuk v változónak, amely T2
típusú, az alábbiak történhetnek:
Ha T2 és T1 rekord típusok, akkor T1 csak azon mezõi adódnak értékül,
amelyek T2-ben is szerepelnek; azaz v dinamikus típusa megegyezik a statikus
típusával, és az értékadás nem is változtathja meg.
Ha T2 és T1 mutatók, akkor v dinamikus típusa e dinamikus típusa lesz.
Ha T2 ARRAY n OF CHAR és e olyan karakterlánc, amelynek hossza kisebb n-nél,
akkor a v m indexen felül elemei 0X-ek lesznek.
A NIL konstans bármelyik pointernek értékül adható. Stringet értékül lehet
adni karaktertömböknek, ha a tömb legalább olyan hosszú, mint a string. (A
különbségi rész a vektorban 0 kódú karakterekkel lesz feltöltve.) Byte típusú
változónak lehet CHAR vagy SHORTINT típusú értéket adni.
Példák:
i := 0
p := i = j
x := i + 1
k := log2 ( i + j )
s := { 2, 3, 5, 7, 11, 13 }
a [ i ] := ( x + y ) * ( x - y )
w [ i + 1 ].name := "John"
Eljárás hívás
Kétféle paraméterátadás létezik Oberonban: cím és érték szerinti.
ProcedureCall = Designator [Actual Parameters]
Példák:
ReadInt ( i )
WriteInt ( j * 2 + 1, 6 )
INC ( w [ k ].count )
Szekvencia
Egymástól pontosvesszõvel elválasztott utasítások.
StatementSequence = Statement {";" Statement}
IF utasítás
IfStatement = IF Expression THEN StatementSequence
{ELSIF Expression THEN StatementSequence} [ELSE StatementSequence] END
Példa:
IF ( ch = "A" ) & ( ch <= "Z" ) THEN ReadIdentifier
ELSIF ( ch = "0" ) & ( ch <= "9" ) THEN ReadNumber
ELSIF ch = '"' THEN ReadString( '"' )
ELSIF ch = "'" THEN ReadString( "'" )
ELSE SpecialCharacter
END
CASE utasítás
Ha egyik eset sem teljesül (nincs ELSE sem), akkor hiba
lép fel.
CaseStatement = CASE Expression OF Case {"|" Case} [ELSE
StatementSequence] END
Case = [CaseLabelList ":" StatementSequence]
CaseLabelList = CaseLabels {"," CaseLabels}
CaseLabels = ConstExpression [".." ConstExpression]
Példa:
CASE ch OF
"A" .. "Z" : ReadIdentifier
| "0" .. "9" : ReadNumber
| "'", '"' : ReadString('"')
ELSE SpecialCharacter
END
WHILE utasítás
WhileStatement = WHILE Expression DO
StatementSequence END
Példák:
WHILE i > 0 DO
i := i DIV 2;
k := k + 1
END
WHILE ( t # NIL ) & ( t.key # i ) DO
t := t.left
END
REPEAT utasítás
RepeatStatement = REPEAT StatementSequence UNTIL
Expression
Példa:
REPEAT
i := i + 1;
j := j DIV 2
UNTIL ( i >= j );
FOR utasítás
ForStatement = FOR ident ":=" Expression TO Expression
[BY ConstExpression] DO StatementSequence END
A következõ utasítás:
FOR v := beg TO end BY step DO
statements
END
ekvivalens a következõvel:
temp := end;
v := beg;
IF step > O THEN
WHILE v <= temp DO
statements;
v := v + step
END
ELSE
WHILE v >= temp DO
statements;
v := v + step
END
END
LOOP utasítás
A LOOP utasításból csak az EXIT utasítással lehet kilépni.
LoopStatement = LOOP StatementSequence END
Példa:
LOOP
ReadInt ( i );
IF i = 0 THEN
EXIT
END;
WriteInt ( i );
END
RETURN és EXIT utasítás
A RETURN utasítás (és utána esetlegesen egy
kifejezés) a futó eljárást terminálja a megadott vissztérési értékkel. A
visszatérési értéknek a deklarációban szereplõ típusúnak kell lennie. Több
RETURN utasítás is lehet egy eljárásban, habár csak egy fog végrehajtódni. Az
EXIT utasítás egy LOOP ciklusból lép ki.
WITH utasítás
A WITH utasítás regionális típusõrként funkcionál.
WithStatement = WITH Guard DO StatementSequence
{ "|" Guard DO StatementSequence }
[ ELSE StatementSequence ] END.
Guard = Qualident ":" Qualident.
Ha v egy rekord vagy mutató típusú változó T0 statikus típussal, akkor az alábbi kifejezés
WITH v: T1 DO S1 | v:T2 DO S2 ELSE S3 END
jelentése a következõ: ha v dinamikus típusa T1 akkor S1, ha T2 akkor S2 hajtódik végre,
és v úgy szerepel a továbbiakban, mintha T1 ill. T2 lenne a statikus típusa.
Egyéb esetekben S3 hajtódik végre. T1 és T2 T0 típus kiterjesztései.
Példa:
WITH t : CenterTree DO
i := i.width;
c := t.subnode
END