-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathwacc.peg
327 lines (271 loc) · 6.41 KB
/
wacc.peg
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
package main
type WACC Peg {}
#-------------------------------------------------------------------------------
# WACC Language Rules
#-------------------------------------------------------------------------------
WACC <- SPACE BEGIN INCL* ENUMDEF* CLASSDEF* FUNC* STAT END EOT
INCL <- INCLUDE STRLITER SPACE
ENUMDEF <- ENUM IDENT SPACE IS ENUMASSIGN (SEMI ENUMASSIGN)* SEMI? END
ENUMASSIGN <- IDENT SPACE? (EQU INTLITER)?
CLASSDEF <- CLASS IDENT SPACE IS MEMBERDEF* FUNC* END
MEMBERDEF <- TYPE IDENT SPACE GETSET? SEMI SPACE
GETSET <- LCUR (GET / SET) (COMMA (GET / SET))? RCUR
FUNC <- TYPE IDENT LPAR PARAMLIST? RPAR IS STAT END
PARAMLIST <- PARAM ( COMMA PARAM )*
PARAM <- TYPE IDENT SPACE
STAT <- (SKIP
/ CONTINUE
/ BREAK
/ BEGIN STAT END
/ (TYPE / VAR) IDENT SPACE EQU ASSIGNRHS
/ ASSIGNLHS ((EQU ASSIGNRHS) / (OPEQU EXPR) / OPOP)
/ READ ASSIGNLHS
/ FREE EXPR
/ RETURN EXPR?
/ EXIT EXPR
/ PRINTLN EXPR
/ PRINT EXPR
/ FCALL
/ IF EXPR THEN STAT (ELSE LCUR? STAT RCUR?)? FI
/ SWITCH EXPR? ON (CASE EXPR COLON STAT (FALLTHROUGH SEMI?)?)* (DEFAULT COLON STAT)? END
/ DO STAT WHILE EXPR DONE
/ WHILE EXPR DO STAT DONE
/ FOR STAT COMMA EXPR COMMA STAT DO STAT DONE) (SEMI STAT?)?
ASSIGNLHS <- (PAIRELEM
/ ARRAYELEM
/ IDENT) SPACE
ASSIGNRHS <- NEWPAIR LPAR EXPR COMMA EXPR RPAR
/ NEW IDENT LPAR ARGLIST? RPAR
/ ARRAYLITER
/ PAIRELEM
/ FCALL
/ EXPR
OPEQU <- PLUSEQU
/ MINUSEQU
/ STAREQU
/ DIVEQU
/ MODEQU
OPOP <- PLUSPLUS
/ MINUSMINUS
ARGLIST <- EXPR (COMMA EXPR)*
PAIRELEM <- FST EXPR
/ SND EXPR
TYPE <- (BASETYPE / PAIRTYPE) ARRAYTYPE*
BASETYPE <- INT
/ BOOL
/ CHAR
/ STRING
/ VOID
/ CLASSTYPE
/ ENUMTYPE
ENUMTYPE <- ENUM IDENT SPACE
CLASSTYPE <- IDENT SPACE
CLASSOBJ <- IDENT
ARRAYTYPE <- LBRK RBRK
PAIRTYPE <- PAIR LPAR PAIRELEMTYPE COMMA PAIRELEMTYPE RPAR
PAIRELEMTYPE <- (BASETYPE / PAIRTYPE) ARRAYTYPE*
/ PAIR
EXPR <- (INTLITER
/ UNARYOPER EXPR
/ BOOLLITER
/ CHARLITER
/ STRLITER
/ PAIRLITER
/ ARRAYELEM
/ ENUMLITER
/ LPAR EXPR RPAR
/ IDENT) SPACE (BINARYOPER EXPR)*
FCALL <- CALL (CLASSOBJ SPACE ARROW SPACE)? IDENT LPAR ARGLIST? RPAR SPACE
ENUMLITER <- IDENT SPACE ARROW SPACE IDENT SPACE
UNARYOPER <- BANG
/ MINUS
/ LEN
/ ORD
/ CHR
BINARYOPER <- STAR
/ DIV
/ MOD
/ PLUS
/ MINUS
/ GT
/ GE
/ LT
/ LE
/ EQUEQU
/ BANGEQU
/ ANDAND
/ OROR
/ AND
/ OR
IDENT <- (!KEYWORD) (AT)? ([_] / [a-z] / [A-Z])
([_] / [a-z] / [A-Z] / [0-9])*
ARRAYELEM <- IDENT (LBRK EXPR RBRK)+
INTLITER <- INTSIGN? [0-9]+
INTSIGN <- PLUS
/ MINUS
BOOLLITER <- TRUE
/ FALSE
CHARLITER <- SINQUO CH SINQUO
CH <- ESCAPE
/ (![\\'"] .)
STRLITER <- DOUQUO STR DOUQUO
STR <- (ESCAPE
/ (![\\'"] .)
)*
ESCAPE <- '\\' ['\"?\\abfnrtv0]
ARRAYLITER <- LBRK ( EXPR (COMMA EXPR)* )? RBRK
PAIRLITER <- NULL
#-------------------------------------------------------------------------------
# Space Characters and Comments
#-------------------------------------------------------------------------------
SPACE <- ( [ \t\r\n]
/ '#' (![\r\n] .)* [\r\n]
)*
#-------------------------------------------------------------------------------
# Keywords
#-------------------------------------------------------------------------------
BREAK <- 'break' !IDCHAR SPACE
BOOL <- 'bool' !IDCHAR SPACE
CALL <- 'call' !IDCHAR SPACE
CASE <- 'case' !IDCHAR SPACE
CHAR <- 'char' !IDCHAR SPACE
CHR <- 'chr' !IDCHAR SPACE
CLASS <- 'class' !IDCHAR SPACE
CONTINUE <- 'continue' !IDCHAR SPACE
DEFAULT <- 'default' !IDCHAR SPACE
DO <- 'do' !IDCHAR SPACE
DONE <- 'done' !IDCHAR SPACE
ELSE <- 'else' !IDCHAR SPACE
ENUM <- 'enum' !IDCHAR SPACE
EXIT <- 'exit' !IDCHAR SPACE
FALLTHROUGH <- 'fallthrough' !IDCHAR SPACE
FALSE <- 'false' !IDCHAR SPACE
FOR <- 'for' !IDCHAR SPACE
FREE <- 'free' !IDCHAR SPACE
FST <- 'fst' !IDCHAR SPACE
GET <- 'GET' !IDCHAR SPACE
IF <- 'if' !IDCHAR SPACE
INCLUDE <- 'include' !IDCHAR SPACE
INT <- 'int' !IDCHAR SPACE
LEN <- 'len' !IDCHAR SPACE
NEW <- 'new' !IDCHAR SPACE
NEWPAIR <- 'newpair' !IDCHAR SPACE
NULL <- 'null' !IDCHAR SPACE
ORD <- 'ord' !IDCHAR SPACE
PAIR <- 'pair' !IDCHAR SPACE
PRINT <- 'print' !IDCHAR SPACE
PRINTLN <- 'println' !IDCHAR SPACE
READ <- 'read' !IDCHAR SPACE
RETURN <- 'return' !IDCHAR SPACE
SET <- 'SET' !IDCHAR SPACE
SKIP <- 'skip' !IDCHAR SPACE
SND <- 'snd' !IDCHAR SPACE
STRING <- 'string' !IDCHAR SPACE
SWITCH <- 'switch' !IDCHAR SPACE
TRUE <- 'true' !IDCHAR SPACE
VAR <- 'var' !IDCHAR SPACE
VOID <- 'void' !IDCHAR SPACE
WHILE <- 'while' !IDCHAR SPACE
# Substitute Keyword
BEGIN <- ('begin'
/ LCUR) !IDCHAR SPACE
IS <- ('is'
/ LCUR) !IDCHAR SPACE
ON <- ('on'
/ LCUR) !IDCHAR SPACE
THEN <- ('then'
/ LCUR) !IDCHAR SPACE
END <- ('end'
/ RCUR) !IDCHAR SPACE
FI <- ('fi'
/ RCUR) !IDCHAR SPACE
KEYWORD <- ('begin'
/ 'break'
/ 'bool'
/ 'call'
/ 'char'
/ 'chr'
/ 'class'
/ 'continue'
/ 'do'
/ 'done'
/ 'else'
/ 'enum'
/ 'end'
/ 'exit'
/ 'fallthrough'
/ 'false'
/ 'fi'
/ 'for'
/ 'free'
/ 'fst'
/ 'if'
/ 'include'
/ 'int'
/ 'is'
/ 'len'
/ 'new'
/ 'newpair'
/ 'null'
/ 'on'
/ 'ord'
/ 'pair'
/ 'print'
/ 'println'
/ 'read'
/ 'return'
/ 'skip'
/ 'snd'
/ 'string'
/ 'switch'
/ 'then'
/ 'true'
/ 'var'
/ 'void'
/ 'while'
) !IDCHAR
IDCHAR <- [a-z] / [A-Z] / [0-9] / [_]
#-------------------------------------------------------------------------------
# Punctuators
#-------------------------------------------------------------------------------
LBRK <- '[' SPACE
RBRK <- ']' SPACE
LPAR <- '(' SPACE
RPAR <- ')' SPACE
STAREQU <- '*=' SPACE
STAR <- '*' ![=*] SPACE
PLUSPLUS <- '++' SPACE
PLUSEQU <- '+=' SPACE
PLUS <- '+' ![=] SPACE
MINUSMINUS <- '--' SPACE
MINUSEQU <- '-=' SPACE
MINUS <- '-' ![=] SPACE
BANG <- '!' ![=] SPACE
DIV <- '/' ![=] SPACE
DIVEQU <- '/=' SPACE
MOD <- '%' ![=>] SPACE
MODEQU <- '%=' SPACE
LT <- '<' ![=] SPACE
GT <- '>' ![=] SPACE
LE <- '<=' SPACE
GE <- '>=' SPACE
EQUEQU <- '==' SPACE
BANGEQU <- '!=' SPACE
ANDAND <- '&&' SPACE
OROR <- '||' SPACE
AND <- '&' SPACE
OR <- '|' SPACE
SEMI <- ';' SPACE
EQU <- '=' !"=" SPACE
COMMA <- ',' SPACE
COLON <- ':' SPACE
SINQUO <- '\''
DOUQUO <- '\"'
ARROW <- '->'
AT <- '@'
LCUR <- '{'
RCUR <- '}'
#-------------------------------------------------------------------------------
# End of Input
#-------------------------------------------------------------------------------
EOT <- !.