EBNF for Oberon-2


Module ::= MODULE ident ";" [ImportList] DeclSeq [BEGIN StatementSeq] END ident "." ImportList ::= IMPORT [ident ":="] ident {"," [ident ":="] ident} ";" DeclSeq ::= { CONST {ConstDecl ";" } | TYPE {TypeDecl ";"} | VAR {VarDecl ";"} } {ProcDecl ";" | ForwardDecl ";"} ConstDecl ::= IdentDef "=" ConstExpr TypeDecl ::= IdentDef "=" Type VarDecl ::= IdentList ":" Type ProcDecl ::= PROCEDURE [Receiver] IdentDef [FormalPars] ";" DeclSeq [BEGIN StatementSeq] END ident ForwardDecl ::= PROCEDURE "^" [Receiver] IdentDef [FormalPars] FormalPars ::= "(" [FPSection {";" FPSection}] ")" [":" Qualident] FPSection ::= [VAR] ident {"," ident} ":" Type Receiver ::= "(" [VAR] ident ":" ident ")" Type ::= Qualident | ARRAY [ConstExpr {"," ConstExpr}] OF Type | RECORD ["("Qualident")"] FieldList {";" FieldList} END | POINTER TO Type | PROCEDURE [FormalPars] FieldList ::= [IdentList ":" Type] StatementSeq ::= Statement {";" Statement} Statement ::= [ Designator ":=" Expr | Designator ["(" [ExprList] ")" ] | IF Expr THEN StatementSeq {ELSIF Expr THEN StatementSeq} [ELSE StatementSeq] END | CASE Expr OF Case {"|" Case} [ELSE StatementSeq] END | WHILE Expr DO StatementSeq END | REPEAT StatementSeq UNTIL Expr | FOR ident ":=" Expr TO Expr [BY ConstExpr] DO StatementSeq END | LOOP StatementSeq END | WITH Guard DO StatementSeq {"|" Guard DO StatementSeq} [ELSE StatementSeq] END | EXIT | RETURN [Expr] ] Case ::= [CaseLabels {"," CaseLabels} ":" StatementSeq] CaseLabels ::= ConstExpr [".." ConstExpr] Guard ::= Qualident ":" Qualident ConstExpr ::= Expr Expr ::= SimpleExpr [Relation SimpleExpr] SimpleExpr ::= ["+" | "-"] Term {AddOp Term} Term ::= Factor {MulOp Factor} Factor ::= Designator ["(" [ExprList] ")"] | number | character | string | NIL | Set | "(" Expr ")" | " ~ " Factor Set ::= "{" [Element {"," Element}] "}" Element ::= Expr [".." Expr] Relation ::= "=" | "#" | "<" | "<=" | ">" | ">=" | IN | IS AddOp ::= "+" | "-" | OR MulOp ::= " * " | "/" | DIV | MOD | "&" Designator ::= Qualident {"." ident | "[" ExprList "]" | " ^ " | "(" Qualident ")"} ExprList ::= Expr {"," Expr} IdentList ::= IdentDef {"," IdentDef} Qualident ::= [ident "."] ident IdentDef ::= ident [" * " | "-"] ident ::= letter {letter | digit} number ::= integer | real integer ::= digit {digit} | digit {hexDigit} "H" real ::= digit {digit} "." {digit} [ScaleFactor] ScaleFactor ::= ("E" | "D") ["+" | "-"] digit {digit} hexDigit ::= digit | "A" | "B" | "C" | "D" | "E" | "F" digit ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" characterConst ::= digit {hexDigit} "X" string ::= ' " ' {char} ' " ' | " ' " {char} " ' "

Extended Backus-Naur Formalism (EBNF):
| separates alternatives.
[] denotes optionality of the enclosed expression.
{} denote its repetition (possibly 0 times).
Non-terminal symbols start with an upper-case letter (e.g. Statement).
Terminal symbols either start with a lower-case letter (e.g. ident), are all upper-case (e.g. BEGIN), or are enclosed in quotes (e.g. ":=").


From: The Programming Language Oberon-2, H. Mössenböck, N. Wirth,Institut für Computersysteme, ETH Zürich, October 1993.