]> Joshua Wise's Git repositories - snipe.git/blame - parse/l4.grm
Initial import of l4c
[snipe.git] / parse / l4.grm
CommitLineData
1144856b
JW
1(* L4 Compiler
2 * L4 grammar
0a24e44d
JW
3 * Author: Kaustuv Chaudhuri <kaustuv+@cs.cmu.edu>
4 * Modified: Frank Pfenning <fp@cs.cmu.edu>
5 * Modified: Joshua Wise <jwise@andrew.cmu.edu>
6 * Modified: Chris Lu <czl@andrew.cmu.edu>
7 *)
8
9structure A = Ast
1144856b
JW
10structure AU = AstUtils
11structure AUP = AstUtils.Program
0a24e44d
JW
12
13(* for simplicity, we only mark expressions, not statements *)
14
15(* mark e with region (left, right) in source file *)
16fun mark (e, (left, right)) = A.Marked (Mark.mark' (e, ParseState.ext (left, right)))
17fun markstm (e, (left, right)) = A.MarkedStm (Mark.mark' (e, ParseState.ext (left, right)))
1144856b
JW
18fun markfunction (e, (left, right)) = A.MarkedFunction (Mark.mark' (e, ParseState.ext (left, right)))
19fun marktypedef (e, (left, right)) = A.MarkedTypedef (Mark.mark' (e, ParseState.ext (left, right)))
0a24e44d
JW
20
21(* create lval from expression; here just an id *)
22(* generates error if not an identifier *)
23fun make_lval (A.Var(id)) ext = id
24 | make_lval (A.Marked(marked_exp)) ext =
25 make_lval (Mark.data marked_exp) (Mark.ext marked_exp)
26 | make_lval _ ext = ( ErrorMsg.error ext "not a variable" ;
27 Symbol.bogus )
28
0a24e44d 29%%
1144856b 30%header (functor L4LrValsFn (structure Token : TOKEN))
0a24e44d
JW
31
32%term
33 EOF
34 | SEMI
35 | INTNUM of Word32.word
36 | IDENT of Symbol.symbol
37 | RETURN
38 | PLUS | MINUS | STAR | SLASH | PERCENT | LSH | RSH | LOGOR | LOGAND | BITAND | BITXOR | BITOR | BITNOT | BANG
39 | ASSIGN | PLUSEQ | MINUSEQ | STAREQ | SLASHEQ | PERCENTEQ | LSHEQ | RSHEQ | BITANDEQ | BITXOREQ | BITOREQ
40 | EQ | NEQ | LT | LE | GT | GE
41 | IF | ELSE | WHILE | FOR | CONTINUE | BREAK
42 | LBRACE | RBRACE
43 | LPAREN | RPAREN
44 | UNARY | ASNOP (* dummy *)
1144856b 45 | EXTERN | VAR | INT | COLON | COMMA | STRUCT | NULL | LBRACKET | RBRACKET | ARROW | DOT | NEW
0a24e44d
JW
46
47%nonterm
48 program of A.program
1144856b 49 | programx of A.program
0a24e44d
JW
50 | stms of A.stm list
51 | stm of A.stm
52 | simp of A.stm
53 | return of A.stm
54 | exp of A.exp
6ade8b0a 55 | explist of A.exp list
0a24e44d 56 | control of A.stm
1144856b 57 | asnop of A.oper
0a24e44d
JW
58 | block of A.stm list
59 | simpoption of A.stm option
60 | elseoption of A.stm list option
6ade8b0a
JW
61 | idents of A.ident list
62 | vtype of A.vtype
1144856b
JW
63 | decls of A.program
64 | extdecl of A.ident * A.function
6ade8b0a
JW
65 | paramlist of A.variable list
66 | param of A.variable
1144856b
JW
67 | typedecl of A.ident * A.typedef
68 | memberlist of (A.ident * A.vtype) list
69 | member of (A.ident * A.vtype)
70 | function of A.ident * A.function
6ade8b0a
JW
71 | vardecl of A.variable list
72 | vardecls of A.variable list
0a24e44d
JW
73
74%verbose (* print summary of errors *)
75%pos int (* positions *)
76%start program
77%eop EOF
78%noshift EOF
79
1144856b 80%name L4
0a24e44d
JW
81
82%left LOGOR
83%left LOGAND
84%left BITOR
85%left BITXOR
86%left BITAND
87%left EQ NEQ
88%left LT LE GT GE
89%left LSH RSH
90%left PLUS MINUS
91%left STAR SLASH PERCENT
92%right UNARY
1144856b 93%left LPAREN LBRACKET ARROW DOT
0a24e44d
JW
94
95%%
96
1144856b
JW
97program : programx (programx)
98
99programx : decls (decls)
100 | programx function (AUP.append_function programx function)
6ade8b0a
JW
101
102vtype : INT (A.Int)
1144856b
JW
103 | IDENT (A.Typedef IDENT)
104 | vtype STAR (A.Pointer vtype)
105 | vtype LBRACKET RBRACKET
106 (A.Array vtype)
6ade8b0a 107
1144856b
JW
108decls : (Symbol.empty, Symbol.empty)
109 | typedecl decls (AUP.append_typedef decls typedecl)
110 | extdecl decls (AUP.append_function decls extdecl)
6ade8b0a
JW
111
112extdecl : EXTERN vtype IDENT LPAREN RPAREN SEMI
1144856b 113 (IDENT, markfunction (A.Extern (vtype, []), (EXTERNleft, SEMIright)))
6ade8b0a 114 | EXTERN vtype IDENT LPAREN paramlist RPAREN SEMI
1144856b 115 (IDENT, markfunction (A.Extern (vtype, paramlist), (EXTERNleft, SEMIright)))
6ade8b0a
JW
116
117paramlist : param COMMA paramlist (param :: paramlist)
118 | param ([param])
119
120param : IDENT COLON vtype (IDENT, vtype)
121
1144856b
JW
122typedecl : STRUCT IDENT LBRACE RBRACE SEMI
123 (IDENT, marktypedef (A.Struct ([]), (STRUCTleft, SEMIright)))
124 | STRUCT IDENT LBRACE memberlist RBRACE SEMI
125 (IDENT, marktypedef (A.Struct (memberlist), (STRUCTleft, SEMIright)))
126
127memberlist : member memberlist (member :: memberlist)
128 | member ([member])
129
130member : IDENT COLON vtype SEMI (IDENT, vtype)
6ade8b0a 131
1144856b
JW
132function : vtype IDENT LPAREN paramlist RPAREN LBRACE vardecls stms RBRACE
133 (IDENT, markfunction (A.Function (vtype, paramlist, vardecls, stms), (vtypeleft, RBRACEright)))
134 | vtype IDENT LPAREN RPAREN LBRACE vardecls stms RBRACE
135 (IDENT, markfunction (A.Function (vtype, [], vardecls, stms), (vtypeleft, RBRACEright)))
6ade8b0a
JW
136
137vardecls : ([])
138 | vardecl vardecls (vardecl @ vardecls)
139
140vardecl : VAR idents COLON vtype SEMI
141 (map (fn x => (x, vtype)) idents)
142
143idents : IDENT ([IDENT])
144 | IDENT COMMA idents (IDENT :: idents)
0a24e44d
JW
145
146stms : ([])
147 | stm stms (stm :: stms)
148
6ade8b0a
JW
149stm : simp SEMI (simp)
150 | control (control)
151 | SEMI (A.Nop)
0a24e44d 152
1144856b
JW
153simp : exp ASSIGN exp %prec ASNOP
154 (A.Assign(exp1, exp2))
155 | exp asnop exp %prec ASNOP
156 (A.AsnOp(asnop, exp1, exp2))
157 | exp (markstm (A.Effect (exp), (expleft, expright)))
0a24e44d
JW
158
159control : IF LPAREN exp RPAREN block elseoption
160 (markstm ((A.If (exp, block, elseoption)), (IFleft, elseoptionright)))
161 | WHILE LPAREN exp RPAREN block
162 (markstm ((A.While (exp, block)), (WHILEleft, blockright)))
163 | FOR LPAREN simpoption SEMI exp SEMI simpoption RPAREN block
164 (markstm ((A.For (simpoption1, exp, simpoption2, block)), (FORleft, blockright)))
165 | CONTINUE SEMI (markstm ((A.Continue), (CONTINUEleft, SEMIright)))
166 | BREAK SEMI (markstm ((A.Break), (BREAKleft, SEMIright)))
167 | RETURN exp SEMI (markstm ((A.Return exp), (RETURNleft, SEMIright)))
168
169elseoption : ELSE block (SOME block)
170 | (NONE)
171
172simpoption : (NONE)
173 | simp (SOME simp)
174
175block : stm ([stm])
176 | LBRACE stms RBRACE (stms)
177
178exp : LPAREN exp RPAREN (exp)
179 | INTNUM (mark (A.ConstExp(INTNUM),(INTNUMleft,INTNUMright)))
180 | IDENT (mark (A.Var(IDENT), (IDENTleft,IDENTright)))
1144856b
JW
181 | exp DOT IDENT (mark (A.Member(exp, IDENT), (expleft, IDENTright)))
182 | exp ARROW IDENT (mark (A.DerefMember(exp, IDENT), (expleft, IDENTright)))
183 | STAR exp %prec UNARY (mark (A.Dereference(exp), (STARleft, expright)))
184 | exp LBRACKET exp RBRACKET
185 (mark (A.ArrIndex(exp1, exp2), (exp1left, exp2right)))
0a24e44d
JW
186 | exp PLUS exp (mark (A.OpExp (A.PLUS, [exp1,exp2]), (exp1left,exp2right)))
187 | exp MINUS exp (mark (A.OpExp (A.MINUS, [exp1,exp2]), (exp1left,exp2right)))
188 | exp STAR exp (mark (A.OpExp (A.TIMES, [exp1,exp2]), (exp1left,exp2right)))
189 | exp SLASH exp (mark (A.OpExp (A.DIVIDEDBY, [exp1,exp2]), (exp1left,exp2right)))
190 | exp PERCENT exp (mark (A.OpExp (A.MODULO, [exp1,exp2]), (exp1left,exp2right)))
191 | exp LSH exp (mark (A.OpExp (A.LSH, [exp1,exp2]), (exp1left,exp2right)))
192 | exp RSH exp (mark (A.OpExp (A.RSH, [exp1,exp2]), (exp1left,exp2right)))
193 | exp LOGOR exp (mark (A.OpExp (A.LOGOR, [exp1,exp2]), (exp1left,exp2right)))
194 | exp LOGAND exp (mark (A.OpExp (A.LOGAND, [exp1,exp2]), (exp1left,exp2right)))
195 | exp BITOR exp (mark (A.OpExp (A.BITOR, [exp1,exp2]), (exp1left,exp2right)))
196 | exp BITAND exp (mark (A.OpExp (A.BITAND, [exp1,exp2]), (exp1left,exp2right)))
197 | exp BITXOR exp (mark (A.OpExp (A.BITXOR, [exp1,exp2]), (exp1left,exp2right)))
198 | exp EQ exp (mark (A.OpExp (A.EQ, [exp1,exp2]), (exp1left,exp2right)))
199 | exp NEQ exp (mark (A.OpExp (A.NEQ, [exp1,exp2]), (exp1left,exp2right)))
200 | exp LT exp (mark (A.OpExp (A.LT, [exp1,exp2]), (exp1left,exp2right)))
201 | exp LE exp (mark (A.OpExp (A.LE, [exp1,exp2]), (exp1left,exp2right)))
202 | exp GT exp (mark (A.OpExp (A.GT, [exp1,exp2]), (exp1left,exp2right)))
203 | exp GE exp (mark (A.OpExp (A.GE, [exp1,exp2]), (exp1left,exp2right)))
1144856b 204 | NULL (mark (A.Null, (NULLleft, NULLright)))
6ade8b0a 205 | IDENT LPAREN RPAREN (mark (A.FuncCall(IDENT, []), (IDENTleft, RPARENright)))
6ade8b0a
JW
206 | IDENT LPAREN explist RPAREN
207 (mark (A.FuncCall(IDENT, explist), (IDENTleft, RPARENright)))
1144856b
JW
208 | NEW LPAREN vtype RPAREN
209 (mark (A.New (vtype), (NEWleft, RPARENright)))
210 | NEW LPAREN vtype LBRACKET exp RBRACKET RPAREN
211 (mark (A.NewArr (vtype, exp), (NEWleft, RPARENright)))
0a24e44d
JW
212 | MINUS exp %prec UNARY (mark (A.OpExp (A.NEGATIVE, [exp]), (MINUSleft,expright)))
213 | BITNOT exp %prec UNARY (mark (A.OpExp (A.BITNOT, [exp]), (BITNOTleft,expright)))
214 | BANG exp %prec UNARY (mark (A.OpExp (A.BANG, [exp]), (BANGleft,expright)))
215
6ade8b0a
JW
216explist : exp ([exp])
217 | exp COMMA explist (exp :: explist)
218
1144856b
JW
219asnop : PLUSEQ (A.PLUS)
220 | MINUSEQ (A.MINUS)
221 | STAREQ (A.TIMES)
222 | SLASHEQ (A.DIVIDEDBY)
223 | PERCENTEQ (A.MODULO)
224 | LSHEQ (A.LSH)
225 | RSHEQ (A.RSH)
226 | BITOREQ (A.BITOR)
227 | BITANDEQ (A.BITAND)
228 | BITXOREQ (A.BITXOR)
This page took 0.045926 seconds and 4 git commands to generate.