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.