diff options
author | Andreas Baumann <mail@andreasbaumann.cc> | 2018-09-30 21:28:10 +0200 |
---|---|---|
committer | Andreas Baumann <mail@andreasbaumann.cc> | 2018-09-30 21:28:10 +0200 |
commit | a68c1c8e9c4dcf834ca2e89ab4f73a3eaaeab28e (patch) | |
tree | 6d518ea0e2bafbd4723c59f4032b8d85305f2d26 /old | |
parent | 9e5c8a8491c6bd1aff0cddb093c55a580f7fcbb1 (diff) | |
download | compilertests-a68c1c8e9c4dcf834ca2e89ab4f73a3eaaeab28e.tar.gz compilertests-a68c1c8e9c4dcf834ca2e89ab4f73a3eaaeab28e.tar.bz2 |
first working compilation with ec
Diffstat (limited to 'old')
-rw-r--r-- | old/modula2.ebnf | 613 |
1 files changed, 613 insertions, 0 deletions
diff --git a/old/modula2.ebnf b/old/modula2.ebnf new file mode 100644 index 0000000..1f92125 --- /dev/null +++ b/old/modula2.ebnf @@ -0,0 +1,613 @@ + * [1]Home + * [2]News + * [3]Development + * [4]Community + +The GNU Modula-2 front end to GCC + + [5]Prev [6]Next + * [7]Overview + * [8]Using + * [9]Obtaining + * [10]Licence + * [11]GNU Project + * [12]Contributing + * [13]Internals + * [14]EBNF + * [15]Libraries + * [16]Indices + +EBNF of GNU Modula-2 + + This chapter contains the EBNF of GNU Modula-2. This grammer currently + supports both PIM and ISO dialects. The rules here are automatically + extracted from the grammer files in GNU Modula-2 and serve to document + the syntax of the extensions described earlier and how they fit in with + the base language. + + Note that the first six productions are built into the lexical analysis + phase. +Ident := is a builtin and checks for an identifier + =: + + +Integer := is a builtin and checks for an integer + =: + + +Real := is a builtin and checks for an real constant + =: + + +string := is a builtin and checks for an string constant + =: + + +FileUnit := ( DefinitionModule | ImplementationOrProgramModule ) + + =: + + +ProgramModule := 'MODULE' Ident [ Priority ] ';' { Import } + Block Ident '.' + =: + + +ImplementationModule := 'IMPLEMENTATION' 'MODULE' Ident [ Priority ] + ';' { Import } Block Ident '.' + =: + + +ImplementationOrProgramModule := ImplementationModule | + ProgramModule + =: + + +Number := Integer | Real + =: + + +Qualident := Ident { '.' Ident } + =: + + +ConstantDeclaration := Ident '=' ConstExpression + =: + + +ConstExpression := SimpleConstExpr [ Relation SimpleConstExpr ] + =: + + +Relation := '=' | '#' | '<>' | '<' | '<=' | '>' | '>=' | + 'IN' + =: + + +SimpleConstExpr := UnaryOrConstTerm { AddOperator ConstTerm } + =: + + +UnaryOrConstTerm := '+' ConstTerm | '-' ConstTerm | + ConstTerm + =: + + +AddOperator := '+' | '-' | 'OR' + =: + + +ConstTerm := ConstFactor { MulOperator ConstFactor } + =: + + +MulOperator := '*' | '/' | 'DIV' | 'MOD' | 'REM' | + 'AND' | '&' + =: + + +ConstFactor := Number | ConstString | ConstSetOrQualidentOrFunction | + '(' ConstExpression ')' | + 'NOT' ConstFactor | ConstAttribute + =: + + +ConstString := string + =: + + +ComponentElement := ConstExpression [ '..' ConstExpression ] + =: + + +ComponentValue := ComponentElement [ 'BY' ConstExpression ] + =: + + +ArraySetRecordValue := ComponentValue { ',' ComponentValue } + =: + + +Constructor := '{' [ ArraySetRecordValue ] '}' + =: + + +ConstSetOrQualidentOrFunction := Constructor | Qualident [ Constructor | + ConstActualParameter +s ] + =: + + +ConstActualParameters := '(' [ ExpList ] ')' + =: + + +ConstAttribute := '__ATTRIBUTE__' '__BUILTIN__' '(' '(' ConstAttributeExpression + + ')' ')' + =: + + +ConstAttributeExpression := Ident | '<' Qualident ',' Ident + '>' + =: + + +Element := ConstExpression [ '..' ConstExpression ] + =: + + +ByteAlignment := '<*' AttributeExpression '*>' + =: + + +OptAlignmentExpression := [ AlignmentExpression ] + =: + + +AlignmentExpression := '(' ConstExpression ')' + =: + + +Alignment := [ ByteAlignment ] + =: + + +TypeDeclaration := Ident '=' Type Alignment + =: + + +Type := SimpleType | ArrayType | RecordType | SetType | + PointerType | ProcedureType + =: + + +SimpleType := Qualident [ SubrangeType ] | + Enumeration | SubrangeType + =: + + +Enumeration := '(' IdentList ')' + =: + + +IdentList := Ident { ',' Ident } + =: + + +SubrangeType := '[' ConstExpression '..' ConstExpression ']' + =: + + +ArrayType := 'ARRAY' SimpleType { ',' SimpleType } 'OF' Type + =: + + +RecordType := 'RECORD' [ DefaultRecordAttributes ] FieldListSequence + 'END' + =: + + +DefaultRecordAttributes := '<*' AttributeExpression '*>' + =: + + +RecordFieldPragma := [ '<*' FieldPragmaExpression { ',' FieldPragmaExpression } + + '*>' ] + =: + + +FieldPragmaExpression := Ident [ '(' ConstExpression ')' ] + =: + + +AttributeExpression := Ident '(' ConstExpression ')' + =: + + +FieldListSequence := FieldListStatement { ';' FieldListStatement } + =: + + +FieldListStatement := [ FieldList ] + =: + + +FieldList := IdentList ':' Type RecordFieldPragma | + 'CASE' CaseTag 'OF' Varient { '|' Varient } [ + 'ELSE' FieldListSequence ] 'END' + =: + + +TagIdent := [ Ident ] + =: + + +CaseTag := TagIdent [ ':' Qualident ] + =: + + +Varient := [ VarientCaseLabelList ':' FieldListSequence ] + =: + + +VarientCaseLabelList := VarientCaseLabels { ',' VarientCaseLabels } + =: + + +VarientCaseLabels := ConstExpression [ '..' ConstExpression ] + =: + + +CaseLabelList := CaseLabels { ',' CaseLabels } + =: + + +CaseLabels := ConstExpression [ '..' ConstExpression ] + =: + + +SetType := ( 'SET' | 'PACKEDSET' ) 'OF' SimpleType + =: + + +PointerType := 'POINTER' 'TO' Type + =: + + +ProcedureType := 'PROCEDURE' [ FormalTypeList ] + =: + + +FormalTypeList := '(' ( ')' FormalReturn | + ProcedureParameters ')' FormalReturn ) + =: + + +FormalReturn := [ ':' OptReturnType ] + =: + + +OptReturnType := '[' Qualident ']' | Qualident + =: + + +ProcedureParameters := ProcedureParameter { ',' ProcedureParameter } + =: + + +ProcedureParameter := '...' | 'VAR' FormalType | + FormalType + =: + + +VarIdent := Ident [ '[' ConstExpression ']' ] + =: + + +VariableDeclaration := VarIdentList ':' Type Alignment + =: + + +VarIdentList := VarIdent { ',' VarIdent } + =: + + +Designator := Qualident { SubDesignator } + =: + + +SubDesignator := '.' Ident | '[' ExpList ']' | + '^' + =: + + +ExpList := Expression { ',' Expression } + =: + + +Expression := SimpleExpression [ Relation SimpleExpression ] + =: + + +SimpleExpression := [ '+' | '-' ] Term { AddOperator Term } + =: + + +Term := Factor { MulOperator Factor } + =: + + +Factor := Number | string | SetOrDesignatorOrFunction | + '(' Expression ')' | 'NOT' Factor | + ConstAttribute + =: + + +SetOrDesignatorOrFunction := ( Qualident [ Constructor | + SimpleDes [ ActualParameters ] ] | + + Constructor ) + =: + + +SimpleDes := { '.' Ident | '[' ExpList ']' | + '^' } + =: + + +ActualParameters := '(' [ ExpList ] ')' + =: + + +Statement := [ AssignmentOrProcedureCall | + IfStatement | CaseStatement | + WhileStatement | RepeatStatement | + LoopStatement | ForStatement | + WithStatement | AsmStatement | + 'EXIT' | 'RETURN' [ Expression ] | + RetryStatement ] + =: + + +RetryStatement := 'RETRY' + =: + + +AssignmentOrProcedureCall := Designator ( ':=' Expression | + 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 ';' ( ProcedureBlock + Ident ) + =: + + +DefineBuiltinProcedure := [ '__ATTRIBUTE__' '__BUILTIN__' '(' + '(' Ident ')' ')' | + '__INLINE__' ] + =: + + +ProcedureHeading := 'PROCEDURE' DefineBuiltinProcedure ( Ident + [ FormalParameters ] +) + =: + + +Builtin := [ '__BUILTIN__' | '__INLINE__' ] + =: + + +DefProcedureHeading := 'PROCEDURE' Builtin ( Ident [ DefFormalParameters ] ) + =: + + +ProcedureBlock := { Declaration } [ 'BEGIN' BlockBody ] 'END' + =: + + +Block := { Declaration } InitialBlock FinalBlock 'END' + =: + + +InitialBlock := [ 'BEGIN' BlockBody ] + =: + + +FinalBlock := [ 'FINALLY' BlockBody ] + =: + + +BlockBody := NormalPart [ 'EXCEPT' ExceptionalPart ] + =: + + +NormalPart := StatementSequence + =: + + +ExceptionalPart := StatementSequence + =: + + +Declaration := 'CONST' { ConstantDeclaration ';' } | + 'TYPE' { TypeDeclaration ';' } | + 'VAR' { VariableDeclaration ';' } | + ProcedureDeclaration ';' | + ModuleDeclaration ';' + =: + + +DefFormalParameters := '(' [ DefMultiFPSection ] ')' FormalReturn + =: + + +DefMultiFPSection := DefExtendedFP | FPSection [ ';' DefMultiFPSection ] + =: + + +FormalParameters := '(' [ MultiFPSection ] ')' FormalReturn + =: + + +MultiFPSection := ExtendedFP | FPSection [ ';' MultiFPSection ] + =: + + +FPSection := NonVarFPSection | VarFPSection + =: + + +DefExtendedFP := DefOptArg | '...' + =: + + +ExtendedFP := OptArg | '...' + =: + + +VarFPSection := 'VAR' IdentList ':' FormalType + =: + + +NonVarFPSection := IdentList ':' FormalType + =: + + +OptArg := '[' Ident ':' FormalType [ '=' ConstExpression ] ']' + =: + + +DefOptArg := '[' Ident ':' FormalType '=' ConstExpression ']' + =: + + +FormalType := { 'ARRAY' 'OF' } Qualident + =: + + +ModuleDeclaration := 'MODULE' Ident [ Priority ] ';' { Import + } + [ Export ] Block Ident + =: + + +Priority := '[' ConstExpression ']' + =: + + +Export := 'EXPORT' ( 'QUALIFIED' IdentList | + 'UNQUALIFIED' IdentList | + IdentList ) ';' + =: + + +Import := 'FROM' Ident 'IMPORT' IdentList ';' | + 'IMPORT' IdentList ';' + =: + + +DefinitionModule := 'DEFINITION' 'MODULE' [ 'FOR' string ] Ident + ';' { Import } [ Export ] { Definition } + 'END' Ident '.' + =: + + +Definition := 'CONST' { ConstantDeclaration ';' } | + 'TYPE' { Ident ( ';' | '=' Type Alignment ';' ) } | + 'VAR' { VariableDeclaration ';' } | + DefProcedureHeading ';' + =: + + +AsmStatement := 'ASM' [ 'VOLATILE' ] '(' AsmOperands ')' + =: + + +NamedOperand := '[' Ident ']' + =: + + +AsmOperandName := [ NamedOperand ] + =: + + +AsmOperands := string [ ':' AsmList [ ':' AsmList [ ':' TrashList ] ] ] + =: + + +AsmList := [ AsmElement ] { ',' AsmElement } + =: + + +AsmElement := AsmOperandName string '(' Expression ')' + =: + + +TrashList := [ string ] { ',' string } + =: + +References + + 1. https://www.nongnu.org/gm2/homepage.html + 2. https://www.nongnu.org/gm2/news.html + 3. https://www.nongnu.org/gm2/development.html + 4. https://www.nongnu.org/gm2/community.html + 5. https://www.nongnu.org/gm2/internals.html + 6. https://www.nongnu.org/gm2/libraries.html + 7. https://www.nongnu.org/gm2/overview.html + 8. https://www.nongnu.org/gm2/using.html + 9. https://www.nongnu.org/gm2/obtaining.html + 10. https://www.nongnu.org/gm2/licence.html + 11. https://www.nongnu.org/gm2/gnu_project.html + 12. https://www.nongnu.org/gm2/contributing.html + 13. https://www.nongnu.org/gm2/internals.html + 14. https://www.nongnu.org/gm2/ebnf.html + 15. https://www.nongnu.org/gm2/libraries.html + 16. https://www.nongnu.org/gm2/indices.html |