COMPILER Mod2 /* COCO/R Grammar for Modula-2 based on "Programming in Modula-2 */ CHARACTERS eol = CHR(10) . letter = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" . octDigit = "01234567" . digit = octDigit + '89' . hexDigit = digit + 'ABCDEF' . noQuote1 = ANY - "'" - eol . noQuote2 = ANY - '"' - eol . IGNORE CHR(9).. CHR(13) COMMENTS FROM '(*' TO '*)' NESTED TOKENS ident = letter { letter | digit } . integer = digit { digit } | digit { digit } CONTEXT ("..") | octDigit { octDigit } ("B" | "C") | digit { hexDigit } "H" . real = digit { digit } "." { digit } [ "E" [ "+" | "-" ] digit { digit } ] . string = "'" { noQuote1 } "'" | '"' { noQuote2 } '"' . PRODUCTIONS Mod2 = DefinitionModule | [ "IMPLEMENTATION" ] ProgramModule . Number = integer | real . QualIdent = ident { "." ident } . ConstantDeclaration = ident "=" ConstExpression . ConstExpression = Expression . TypeDeclaration = ident "=" Type . Type = SimpleType | ArrayType | RecordType | SetType | PointerType | ProcedureType . SimpleType = QualIdent | Enumeration | SubrangeType . Enumeration = "(" IdentList ")" . IdentList = ident { "," ident } . SubrangeType = [ ident ] "[" ConstExpression ".." ConstExpression "]" . ArrayType = "ARRAY" SimpleType { "," SimpleType } "OF" Type . RecordType = "RECORD" FieldListSequence "END" . FieldListSequence = FieldList { ";" FieldList } . FieldList = [ IdentList ":" Type | "CASE" [ ident ] ":" QualIdent "OF" Variant { "|" Variant } [ "ELSE" FieldListSequence ] "END" ] . Variant = [ CaseLabelList ":" FieldListSequence ] . CaseLabelList = CaseLabels { "," CaseLabels } . CaseLabels = ConstExpression [ ".." ConstExpression ] . SetType = "SET" "OF" SimpleType . PointerType = "POINTER" "TO" Type . ProcedureType = "PROCEDURE" [ FormalTypeList ] . FormalTypeList = "(" [ [ "VAR" ] FormalType { "," [ "VAR" ] FormalType } ] ")" [ ":" QualIdent ] . VariableDeclaration = IdentList ":" Type . Designator = QualIdent { "." ident | "[" ExpList "]" | "^" } . ExpList = Expression { "," Expression } . Expression = SimpleExpression [ Relation SimpleExpression ] . Relation = "=" | "#" | "<" |"<=" | ">" | ">=" | "IN" . SimpleExpression = [ "+" | "-" ] Term { AddOperator Term } . AddOperator = "+" | "-" | "OR" . Term = Factor { MulOperator Factor } . MulOperator = "*" |"/" | "DIV" | "MOD" | "AND" . Factor = Number | string | Set | "NOT" Factor | Designator [ ActualParameters ] | "(" Expression ")" . Set = [ QualIdent ] "{" [ Element { "," Element } ] "}" . Element = Expression [ ".." Expression ] . ActualParameters = "(" [ ExpList ] ")" . Statement = [ Assignment | ProcedureCall | IfStatement | CaseStatement | WhileStatement | RepeatStatement | LoopStatement | ForStatement | WithStatement | "EXIT" | "RETURN" [ Expression ] ] . Assignment = Designator ":=" Expression . ProcedureCall = Designator [ ActualParameters ] . 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 ] . WhileStatement = "WHILE" Expression "DO" StatementSequence "END" . RepeatStatement = "REPEAT" StatementSequence "UNTIL" Expression . ForStatement = "FOR" ident ":=" Expression "TO" Expression [ "BY" ConstExpression ] "DO" StatementSequence "END" . LoopStatement = "LOOP" StatementSequence "END" . WithStatement = "WITH" Designator "DO" StatementSequence "END" . ProcedureDeclaration = ProcedureHeading ";" Block ident . ProcedureHeading = "PROCEDURE" ident [ FormalParameters ] . Block = { Declaration } [ "BEGIN" StatementSequence ] "END" . Declaration = "CONST" { ConstantDeclaration ";" } | "TYPE" { TypeDeclaration ";" } | "VAR" { VariableDeclaration ";" } | ProcedureDeclaration ";" | ModuleDeclaration ";" . FormalParameters = "(" [ FPSection { ";" FPSection } ] ")" [ ":" QualIdent ] . FPSection = [ "VAR" ] IdentList ":" FormalType . FormalType = [ "ARRAY" "OF" ] QualIdent . ModuleDeclaration = "MODULE" ident [ Priority ] ";" [ Import ] [ Export ] Block ident . Priority = "[" ConstExpression "]" . Export = "EXPORT" [ "QUALIFIED" ] IdentList ";" . Import = [ "FROM" ident ] "IMPORT" IdentList ";" . DefinitionModule = "DEFINITION" "MODULE" ident ";" { Import } { Definition } "END" ident "." . Definition = "CONST" { ConstantDeclaration ";" } | | "TYPE" { ident [ "=" Type ] ";" } | "VAR" { VariableDeclaration ";" } | ProcedureHeading ";" . ProgramModule = "MODULE" ident [ Priority ] ";" { Import } Block ident "." . END Mod2.