Skip to content

Instantly share code, notes, and snippets.

@tkurtbond
Last active June 3, 2022 14:31
Show Gist options
  • Save tkurtbond/ab25234f62cf7293507b1eb81d5d3609 to your computer and use it in GitHub Desktop.
Save tkurtbond/ab25234f62cf7293507b1eb81d5d3609 to your computer and use it in GitHub Desktop.
Coco/R grammar for Oberon-2, from Appendix B of the Oberon-2 report.
COMPILER Oberon2_app_b
CHARACTERS
letter = 'A' .. 'Z' + 'a' .. 'z'.
digit = "0123456789".
hexDigit = digit + 'A' .. 'F'.
sqChar = ANY - '"'.
dqChar = ANY - "'".
TOKENS
ident = letter {letter | digit}.
integer = digit {digit} | digit {hexDigit} "H".
real = digit {digit} "." {digit} [("E" | "D")["+" | "-"] digit {digit}].
character = digit {hexDigit} "X".
string = '"' {sqChar} '"' | "'" {dqChar} "'".
COMMENTS FROM "(*" TO "*)" NESTED
PRODUCTIONS
number = integer | real.
/* The productions from here down to the next comment are straight from Appendix 2 of the Oberon-2 report. */
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 ["*" | "-"].
/* The productions from Appendix B of the Oberon-2 report end here. */
Oberon2_app_b = Module.
END Oberon2_app_b.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment