| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246 |
- Coco/R - Compiler-Compiler V1.53
- Released by Pat Terry 17 September 2002
- Source file: turbo_pascal3.atg
- Listing:
- 1 (* Tags: TURBO3, TURBOPASCAL, TP3, BORLAND *)
- 2 COMPILER Pascal
- 3 (* J & W Pascal - not Turbo Pascal *)
- 4 (* This grammar is not LL(1) *)
- 5
- 6 CHARACTERS
- 7 eol = CHR(13) .
- 8 letter = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" .
- 9 digit = "0123456789".
- 10 noQuote1 = ANY - "'" - eol .
- 11
- 12 IGNORE CHR(9) .. CHR(13)
- 13 IGNORE CASE
- ***** ^ IGNORE CASE must appear earlier
- 14
- 15 COMMENTS FROM "(*" TO "*)"
- 16 COMMENTS FROM "{" TO "}"
- 17
- 18 TOKENS
- 19 identifier = letter { letter | digit } .
- 20 integer = digit { digit } | digit { digit } CONTEXT ("..") .
- 21 real = digit { digit } "." digit { digit }
- 22 [ "E" ["+" | "-"] digit { digit } ]
- 23 | digit { digit } "E" ["+" | "-"] digit { digit } .
- 24 string = "'" { noQuote1 | "''" } "'" .
- 25
- 26 PRODUCTIONS
- ***** ^ could not make deterministic automaton
- 27
- 28 Pascal = "program" NewIdent [ ExternalFiles ] ";"
- 29 Block "." .
- 30
- 31 ExternalFiles = "(" NewIdentList ")" .
- 32
- 33 Block = DeclarationPart StatementPart .
- 34
- 35 DeclarationPart = LabelDeclarations ConstDefinitions
- 36 TypeDefinitions VarDeclarations
- 37 { ProcDeclarations } .
- 38
- 39 (* -------------------------------------------------------------------- *)
- 40
- 41 LabelDeclarations = [ "label" Labels ";" ] .
- 42
- 43 Labels = Label { "," Label } .
- 44
- 45 Label = UnsignedInt .
- 46
- 47 (* -------------------------------------------------------------------- *)
- 48
- 49 ConstDefinitions = [ "const" ConstDef { ConstDef } ] .
- 50
- 51 ConstDef = NewIdent "=" Constant ";" .
- 52
- 53 Constant = [ "+" | "-" ] ( UnsignedNumber | ConstIdent ) | String .
- 54
- 55 UnsignedNumber = UnsignedInt | UnsignedReal .
- 56
- 57 ConstIdent = identifier .
- 58
- 59 (* -------------------------------------------------------------------- *)
- 60
- 61 TypeDefinitions = [ "type" TypeDef { TypeDef } ] .
- 62
- 63 TypeDef = NewIdent "=" Type ";" .
- 64
- 65 Type = SimpleType | [ "packed" ] StructType | "^" TypeIdent .
- 66
- 67 SimpleType = TypeIdent | EnumerationType | SubrangeType .
- 68
- 69 TypeIdent = identifier .
- 70
- 71 EnumerationType = "(" NewIdentList ")" .
- 72
- 73 SubrangeType = Constant ".." Constant .
- 74
- 75 StructType = ArrayType | RecordType | SetType | FileType .
- 76
- 77 ArrayType = "array" "[" IndexList "]" "of" Type .
- 78
- 79 IndexList = SimpleType { "," SimpleType } .
- 80
- 81 RecordType = "record" FieldList "end" .
- 82
- 83 SetType = "set" "of" SimpleType .
- 84
- 85 FileType = "file" "of" Type .
- 86
- 87 FieldList = [ ( fixedPart [ ";" VariantPart ] | VariantPart ) [ ";" ] ] .
- 88
- 89 fixedPart = RecordSection { ";" RecordSection } .
- 90
- 91 RecordSection = NewIdentList ":" Type .
- 92
- 93 VariantPart = "case" VariantSelector "of" Variant { ";" Variant } .
- 94
- 95 VariantSelector = [ NewIdent ":" ] TypeIdent .
- 96
- 97 Variant = CaseLabelList ":" "(" FieldList ")" .
- 98
- 99 (* -------------------------------------------------------------------- *)
- 100
- 101 VarDeclarations = [ "var" VarDecl { VarDecl } ] .
- 102
- 103 VarDecl = NewIdentList ":" Type ";" .
- 104
- 105 (* -------------------------------------------------------------------- *)
- 106
- 107 ProcDeclarations = ( ProcHeading | FuncHeading ) ";" Body ";" .
- 108
- 109 ProcHeading = "procedure" NewIdent [ FormalParams ] .
- 110
- 111 FuncHeading = "function" NewIdent [ FormalParams ] ReturnType .
- 112
- 113 ReturnType = [ (* empty if forward referenced *) ":" TypeIdent ] .
- 114
- 115 Body = Block | "forward" .
- 116
- 117 FormalParams = "(" FormalSection { ";" FormalSection } ")" .
- 118
- 119 FormalSection = [ "var" ] ParamGroup | ProcHeading | FuncHeading .
- 120
- 121 ParamGroup = NewIdentList ":" ParamType .
- 122
- 123 ParamType = TypeIdent
- 124 | "array" "[" IndexSpecList "]" "of" ParamType
- 125 | "packed" "array" "[" IndexSpec "]" "of" TypeIdent .
- 126
- 127 IndexSpecList = IndexSpec { ";" IndexSpec } .
- 128
- 129 IndexSpec = NewIdent ".." NewIdent ":" TypeIdent .
- 130
- 131 (* -------------------------------------------------------------------- *)
- 132
- 133 StatementPart = CompoundStatement .
- 134
- 135 CompoundStatement = "begin" StatementSequence "end" .
- 136
- 137 StatementSequence = Statement { ";" Statement } .
- 138
- 139 Statement = [ Label ":" ]
- 140 [ AssignmentOrCall
- 141 | CompoundStatement
- 142 | GotoStatement
- 143 | WhileStatement
- 144 | RepeatStatement
- 145 | IfStatement
- 146 | CaseStatement
- 147 | ForStatement
- 148 | WithStatement ] .
- 149
- 150 AssignmentOrCall = Designator ( ":=" Expression | [ ActualParams ] ) .
- 151
- 152 ActualParams = "(" ActualParameter { "," ActualParameter } ")" .
- 153
- 154 ActualParameter = Expression [ FieldWidth (* only in i/o *) ] .
- 155
- 156 FieldWidth = ":" IntegerExpression [ ":" IntegerExpression ] .
- 157
- 158 GotoStatement = "goto" Label .
- 159
- 160 WhileStatement = "while" BooleanExpression "do" Statement .
- 161
- 162 RepeatStatement = "repeat" StatementSequence "until" BooleanExpression .
- 163
- 164 IfStatement = "if" BooleanExpression "then" Statement
- 165 [ "else" Statement ] .
- 166
- 167 CaseStatement = "case" OrdinalExpression "of" CaseList "end" .
- 168
- 169 CaseList = OneCase { ";" OneCase } [ ";" ] .
- 170
- 171 OneCase = CaseLabelList ":" Statement .
- 172
- 173 CaseLabelList = CaseLabel { "," CaseLabel } .
- 174
- 175 CaseLabel = Constant .
- 176
- 177 ForStatement = "for" ControlVariable ":=" OrdinalExpression
- 178 ( "to" | "downto" ) OrdinalExpression "do" Statement .
- 179
- 180 ControlVariable = identifier .
- 181
- 182 WithStatement = "with" RecVarList "do" Statement .
- 183
- 184 RecVarList = Designator { "," Designator } .
- 185
- 186 (* -------------------------------------------------------------------- *)
- 187
- 188 IntegerExpression = Expression .
- 189
- 190 BooleanExpression = Expression .
- 191
- 192 OrdinalExpression = Expression .
- 193
- 194 Expression = SimpleExpression [ RelOp SimpleExpression ] .
- 195
- 196 RelOp = "=" | "<" | ">" | "<=" | ">=" | "<>" | "in" .
- 197
- 198 SimpleExpression = ( "+" Term | "-" Term | Term ) { AddOp Term } .
- 199
- 200 AddOp = "+" | "-" | "or" .
- 201
- 202 Term = Factor { MulOp Factor } .
- 203
- 204 MulOp = "*" | "/" | "div" | "mod" | "and" .
- 205
- 206 Factor = Designator [ ActualParams ]
- 207 | UnsignedLiteral
- 208 | SetConstructor
- 209 | "(" Expression ")"
- 210 | "not" Factor .
- 211
- 212 Designator = identifier { "." identifier | "[" ExpList "]" | "^" } .
- 213
- 214 ExpList = Expression { "," Expression } .
- 215
- 216 UnsignedLiteral = UnsignedNumber | "nil" | String .
- 217
- 218 SetConstructor = "[" Member { "," Member } "]" .
- 219
- 220 Member = Expression [ ".." Expression ] .
- 221
- 222 (* -------------------------------------------------------------------- *)
- 223
- 224 NewIdentList = NewIdent { "," NewIdent } .
- 225
- 226 NewIdent = identifier .
- 227
- 228 UnsignedInt = integer .
- 229
- 230 UnsignedReal = real .
- 231
- 232 String = string .
- 233
- 234 END Pascal.
- 2 errors
|