Oberon-2

Utasítások

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