| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 |
- COMPILER Oberon
- IGNORE CASE
- (* Oberon grammar extracted from Ulm's Oberon compiler (ulmo)
- Source: src/compiler/OberonParser.om and src/compiler/OberonLex.om
- Coco/R grammar for the Oberon language as implemented by ulmo 0.11.0 *)
- (* ------------------------------------------------------------------ *)
- (* Character classes *)
- (* ------------------------------------------------------------------ *)
- CHARACTERS
- letter = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" .
- digit = "0123456789" .
- hexdigit = digit + "ABCDEF" .
- noQuote = ANY - '"' - "'" .
- eol = CHR(10) .
- IGNORE CHR(9) .. CHR(13)
- COMMENTS FROM "(*" TO "*)" NESTED
- (* ------------------------------------------------------------------ *)
- (* Scanner tokens *)
- (* ------------------------------------------------------------------ *)
- TOKENS
- ident = letter { letter | digit } .
- integer = digit { digit } | digit { hexdigit } "H" .
- real = digit { digit } "." { digit }
- [ ("E" | "D") [ "+" | "-" ] digit { digit } ] .
- charconst = digit { hexdigit } "X" .
- string = '"' { noQuote } '"' .
- (* ------------------------------------------------------------------ *)
- (* Grammar productions *)
- (* ------------------------------------------------------------------ *)
- PRODUCTIONS
- Oberon = CompilationUnit .
- CompilationUnit = DefinitionModule | Module .
- DefinitionModule = "DEFINITION" ident ";"
- [ ImportList ]
- [ DefinitionSequence ]
- "END" ident "."
- .
- DefinitionSequence = { ConstSection | TypeSection | VarSection | DefProcDecl } .
- DefProcDecl = ProcedureHeading ";" .
- Module = "MODULE" ident ";"
- [ ImportList ]
- [ DeclarationSequence ]
- [ "BEGIN" StatementSequence ]
- "END" ident "."
- .
- ImportList = "IMPORT"
- ( ident [ ":=" ident ]
- { "," ident [ ":=" ident ] } )
- ";"
- .
- DeclarationSequence = { ConstSection | TypeSection | VarSection | ProcedureDeclaration ";" }
- { ForwardDeclaration ";" } .
- ConstSection = "CONST" { ConstantDeclaration ";" } .
- TypeSection = "TYPE" { TypeDeclaration ";" } .
- VarSection = "VAR" { VariableDeclaration ";" } .
- ConstantDeclaration = identdef "=" ConstExpression .
- TypeDeclaration = identdef "=" type .
- VariableDeclaration = IdentList ":" type .
- identdef = ident [ "*" ] .
- IdentList = identdef { "," identdef } .
- qualident = ident { "." ident } .
- ConstExpression = expression .
- type = qualident | ArrayType | RecordType
- | PointerType | ProcedureType .
- ArrayType = "ARRAY" length { "," length } "OF" type .
- length = ConstExpression .
- RecordType = "RECORD" [ "(" BaseType ")" ]
- FieldListSequence "END" .
- BaseType = qualident .
- FieldListSequence = FieldList { ";" FieldList } .
- FieldList = [ IdentList ":" type ] .
- PointerType = "POINTER" "TO" type .
- ProcedureType = "PROCEDURE" [ FormalParameters ] .
- FormalParameters = "(" [ FPSection { ";" FPSection } ] ")"
- [ ":" qualident ] .
- FPSection = [ "VAR" ] ident { "," ident } ":" FormalType .
- FormalType = { "ARRAY" "OF" } ( qualident | ProcedureType ) .
- designator = qualident
- { "." ident | "[" ExpList "]"
- | "(" [ ExpList ] ")" | "^" } .
- ExpList = expression { "," expression } .
- expression = SimpleExpression [ relation SimpleExpression ] .
- relation = "=" | "#" | "<" | "<=" | ">" | ">=" | "IN" | "IS" .
- SimpleExpression = [ "+" | "-" ] term { AddOperator term } .
- AddOperator = "+" | "-" | "OR" .
- term = factor { MulOperator factor } .
- MulOperator = "*" | "/" | "DIV" | "MOD" | "&" .
- factor = number | charconst | string | "NIL" | set
- | designator [ ActualParameters ]
- | "(" expression ")" | "~" factor .
- number = integer | real .
- set = "{" [ element { "," element } ] "}" .
- element = expression [ ".." expression ] .
- ActualParameters = "(" [ ExpList ] ")" .
- statement = [ ident IdentTail | IfStatement
- | CaseStatement | WhileStatement | RepeatStatement
- | LoopStatement | WithStatement | "EXIT"
- | "RETURN" [ expression ] ] .
- IdentTail = { "." ident | "[" ExpList "]" | "(" [ ExpList ] ")" | "^" }
- [ ":=" expression | "(" [ ExpList ] ")" ] .
- StatementSequence = statement { ";" statement } .
- IfStatement = "IF" expression "THEN" StatementSequence
- { "ELSIF" expression "THEN" StatementSequence }
- [ "ELSE" StatementSequence ] "END" .
- CaseStatement = "CASE" expression "OF" case { "|" case }
- [ "ELSE" StatementSequence ] "END" .
- case = [ CaseLabelList ":" StatementSequence ] .
- CaseLabelList = CaseLabels { "," CaseLabels } .
- CaseLabels = ConstExpression [ ".." ConstExpression ] .
- WhileStatement = "WHILE" expression "DO" StatementSequence "END" .
- RepeatStatement = "REPEAT" StatementSequence "UNTIL" expression .
- LoopStatement = "LOOP" StatementSequence "END" .
- WithStatement = "WITH" qualident ":" qualident "DO" StatementSequence "END" .
- ProcedureDeclaration = ProcedureHeading ";" ProcedureBody ident .
- ProcedureHeading = "PROCEDURE" [ "*" ] identdef [ FormalParameters ] .
- ProcedureBody = DeclarationSequence [ "BEGIN" StatementSequence ] "END" .
- ForwardDeclaration = "PROCEDURE" "^" ident [ "*" ] [ FormalParameters ] .
- END Oberon.
|