1 : |
jhr |
14 |
(* diderot.grm
|
2 : |
|
|
*
|
3 : |
|
|
* COPYRIGHT (c) 2010 The Diderot Project (http://diderot.cs.uchicago.edu)
|
4 : |
|
|
* All rights reserved.
|
5 : |
|
|
*)
|
6 : |
|
|
|
7 : |
|
|
%name Diderot;
|
8 : |
|
|
|
9 : |
|
|
%tokens
|
10 : |
|
|
: KW_actor ("actor")
|
11 : |
jhr |
25 |
| KW_bool ("bool")
|
12 : |
jhr |
19 |
| KW_die ("die")
|
13 : |
jhr |
25 |
| KW_else ("else")
|
14 : |
jhr |
14 |
| KW_field ("field")
|
15 : |
jhr |
25 |
| KW_if ("if")
|
16 : |
jhr |
14 |
| KW_image ("image")
|
17 : |
jhr |
25 |
| KW_input ("input")
|
18 : |
|
|
| KW_int ("int")
|
19 : |
|
|
| KW_kernel ("kernel")
|
20 : |
jhr |
19 |
| KW_new ("new")
|
21 : |
jhr |
25 |
| KW_real ("real")
|
22 : |
|
|
| KW_stabilize ("stabilize")
|
23 : |
|
|
| KW_string ("string")
|
24 : |
|
|
| KW_tensor ("tensor")
|
25 : |
|
|
| KW_vec ("vec")
|
26 : |
|
|
| OP_eq ("=")
|
27 : |
jhr |
19 |
| OP_orelse ("||")
|
28 : |
|
|
| OP_andalso ("&&")
|
29 : |
|
|
| OP_lt ("<")
|
30 : |
|
|
| OP_lte ("<=")
|
31 : |
|
|
| OP_eqeq ("==")
|
32 : |
|
|
| OP_neq ("!=")
|
33 : |
|
|
| OP_gte (">=")
|
34 : |
|
|
| OP_gt (">")
|
35 : |
jhr |
14 |
| OP_plus ("+")
|
36 : |
|
|
| OP_minus ("-")
|
37 : |
|
|
| OP_star ("*")
|
38 : |
jhr |
19 |
| OP_slash ("/")
|
39 : |
jhr |
14 |
| OP_at ("@")
|
40 : |
|
|
| LP ("(")
|
41 : |
|
|
| RP (")")
|
42 : |
|
|
| LB ("[")
|
43 : |
|
|
| RB ("]")
|
44 : |
|
|
| LCB ("{")
|
45 : |
|
|
| RCB ("}")
|
46 : |
jhr |
25 |
| COMMA (",")
|
47 : |
|
|
| SEMICOLON (";")
|
48 : |
|
|
| HASH ("#")
|
49 : |
jhr |
26 |
| BANG ("!")
|
50 : |
jhr |
14 |
| INT of IntInf.int
|
51 : |
|
|
| FLOAT of FloatLit.float
|
52 : |
|
|
| STRING of string
|
53 : |
jhr |
19 |
| ID of Atom.atom
|
54 : |
jhr |
14 |
;
|
55 : |
|
|
|
56 : |
jhr |
25 |
%defs (
|
57 : |
jhr |
27 |
structure PT = ParseTree
|
58 : |
|
|
structure L = Literal
|
59 : |
|
|
|
60 : |
jhr |
25 |
(* apply a mark constructor to a span and a tree *)
|
61 : |
|
|
fun mark cons (span : AntlrStreamPos.span, tr) = cons{span = span, tree = tr}
|
62 : |
|
|
|
63 : |
jhr |
27 |
(* specialize mark functions for common node types *)
|
64 : |
|
|
val markDecl = mark PT.D_Mark
|
65 : |
|
|
fun markTy (_, e as PT.T_Mark _) = e
|
66 : |
|
|
| markTy (sp, tr) = mark PT.T_Mark (sp, tr)
|
67 : |
|
|
fun markStmt (_, e as PT.S_Mark _) = e
|
68 : |
|
|
| markStmt (sp, tr) = mark PT.S_Mark (sp, tr)
|
69 : |
|
|
fun markExp (_, e as PT.E_Mark _) = e
|
70 : |
|
|
| markExp (sp, tr) = mark PT.E_Mark (sp, tr)
|
71 : |
|
|
|
72 : |
|
|
fun flatten NONE = []
|
73 : |
|
|
| flatten (SOME l) = l
|
74 : |
jhr |
25 |
);
|
75 : |
|
|
|
76 : |
jhr |
14 |
File
|
77 : |
|
|
: Decl+
|
78 : |
|
|
;
|
79 : |
|
|
|
80 : |
|
|
Decl
|
81 : |
jhr |
23 |
: InputDecl
|
82 : |
jhr |
27 |
| VarDecl
|
83 : |
jhr |
14 |
| ActorDecl
|
84 : |
|
|
;
|
85 : |
|
|
|
86 : |
jhr |
23 |
|
87 : |
|
|
(***** Inputs *****)
|
88 : |
|
|
|
89 : |
|
|
InputDecl
|
90 : |
|
|
: "input" Type ID ( "=" Expr )? ";"
|
91 : |
jhr |
27 |
=> (markDecl(FULL_SPAN, PT.D_Input(Type, ID, SR)))
|
92 : |
jhr |
14 |
;
|
93 : |
jhr |
19 |
|
94 : |
jhr |
27 |
(***** variable declarations *****)
|
95 : |
jhr |
19 |
|
96 : |
jhr |
27 |
VarDecl
|
97 : |
jhr |
23 |
: Type ID "=" Expr ";"
|
98 : |
jhr |
27 |
=> (mark PT.VD_Mark (FULL_SPAN, PT.VD_Decl(Type, ID, Expr)))
|
99 : |
jhr |
23 |
;
|
100 : |
|
|
|
101 : |
|
|
|
102 : |
jhr |
19 |
(***** Actors *****)
|
103 : |
|
|
|
104 : |
|
|
ActorDecl
|
105 : |
jhr |
27 |
: "actor" ID "(" Params ")" "{" VarDecl* ActorMethod+ "}"
|
106 : |
|
|
=> (markDecl(FULL_SPAN, PT.D_Actor{
|
107 : |
|
|
name = ID, params = Params, state = VarDecl,
|
108 : |
|
|
methods = ActorMethod
|
109 : |
|
|
}))
|
110 : |
jhr |
19 |
;
|
111 : |
|
|
|
112 : |
|
|
Params
|
113 : |
|
|
: ( Param ( "," Param )* )?
|
114 : |
jhr |
27 |
=> (flatten SR)
|
115 : |
jhr |
19 |
;
|
116 : |
|
|
|
117 : |
|
|
Param
|
118 : |
|
|
: Type ID
|
119 : |
jhr |
27 |
=> (mark PT.P_Mark (FULL_SPAN, PT.P_Param(Type, ID)))
|
120 : |
jhr |
19 |
;
|
121 : |
|
|
|
122 : |
|
|
ActorMethod
|
123 : |
jhr |
24 |
: ID Block
|
124 : |
jhr |
27 |
=> (mark PT.P_Mark (FULL_SPAN, PT.M_Method(ID, Block)))
|
125 : |
jhr |
19 |
;
|
126 : |
|
|
|
127 : |
jhr |
24 |
Block
|
128 : |
jhr |
25 |
: "{" Stmt* "}"
|
129 : |
|
|
=> (markStmt(FULL_SPAN, PT.S_Block Stmt))
|
130 : |
jhr |
24 |
;
|
131 : |
jhr |
19 |
|
132 : |
jhr |
25 |
Stmt
|
133 : |
|
|
: AtomicStmt
|
134 : |
|
|
=> (AtomicStmt)
|
135 : |
|
|
| %try "if" "(" Expr ")" Stmt "else" Stmt
|
136 : |
|
|
=> (markStmt(FULL_SPAN, PT.S_IfThenElse(Expr, Stmt1, Stmt2)))
|
137 : |
|
|
| %try "if" "(" Expr ")" Stmt
|
138 : |
|
|
=> (markStmt(FULL_SPAN, PT.S_IfThen(Expr, Stmt)))
|
139 : |
|
|
;
|
140 : |
|
|
|
141 : |
|
|
AtomicStmt
|
142 : |
|
|
: Block
|
143 : |
|
|
=> (Block)
|
144 : |
jhr |
27 |
| VarDecl
|
145 : |
|
|
=> (PT.S_Decl VarDecl)
|
146 : |
jhr |
25 |
| "stabilize" ";"
|
147 : |
|
|
=> (markStmt(FULL_SPAN, PT.S_Stabilize))
|
148 : |
|
|
| "die" ";"
|
149 : |
|
|
=> (markStmt(FULL_SPAN, PT.S_Die))
|
150 : |
|
|
| "new" ID "(" Arguments ")" ";"
|
151 : |
|
|
=> (markStmt(FULL_SPAN, PT.S_New(ID, Arguments)))
|
152 : |
jhr |
24 |
| ID "=" Expr ";"
|
153 : |
jhr |
25 |
=> (markStmt(FULL_SPAN, PT.S_Assign(ID, Expr)))
|
154 : |
jhr |
24 |
;
|
155 : |
|
|
|
156 : |
|
|
Arguments
|
157 : |
|
|
: ( Expr ("," Expr)* )?
|
158 : |
jhr |
27 |
=> (flatten SR)
|
159 : |
jhr |
24 |
;
|
160 : |
|
|
|
161 : |
|
|
|
162 : |
jhr |
19 |
(***** Types *****)
|
163 : |
|
|
|
164 : |
jhr |
24 |
Type : "image" "<" Dimensions ">"
|
165 : |
jhr |
26 |
=> (markTy(FULL_SPAN, PT.T_Image Dimensions))
|
166 : |
jhr |
24 |
| "tensor" "<" Dimensions ">"
|
167 : |
jhr |
26 |
=> (markTy(FULL_SPAN, PT.T_Tensor Dimensions))
|
168 : |
jhr |
24 |
| "field" "#" Dimension "<" Dimensions ">"
|
169 : |
jhr |
26 |
=> (markTy(FULL_SPAN, PT.T_Field(Dimension, Dimensions)))
|
170 : |
jhr |
23 |
| "kernel" "#" Dimension
|
171 : |
jhr |
26 |
=> (markTy(FULL_SPAN, PT.T_Kernel Dimension))
|
172 : |
jhr |
23 |
| "vec" "<" Dimension ">"
|
173 : |
jhr |
26 |
=> (markTy(FULL_SPAN, PT.T_Vec Dimension))
|
174 : |
jhr |
23 |
| "bool"
|
175 : |
jhr |
26 |
=> (markTy(FULL_SPAN, PT.T_Bool))
|
176 : |
jhr |
19 |
| "int"
|
177 : |
jhr |
26 |
=> (markTy(FULL_SPAN, PT.T_Int))
|
178 : |
jhr |
19 |
| "real"
|
179 : |
jhr |
26 |
=> (markTy(FULL_SPAN, PT.T_Real))
|
180 : |
jhr |
24 |
| "string"
|
181 : |
jhr |
26 |
=> (markTy(FULL_SPAN, PT.T_String))
|
182 : |
jhr |
19 |
;
|
183 : |
|
|
|
184 : |
jhr |
24 |
Dimensions
|
185 : |
|
|
: ( Dimension ("," Dimension)* )?
|
186 : |
jhr |
27 |
=> (flatten SR)
|
187 : |
jhr |
24 |
;
|
188 : |
|
|
|
189 : |
jhr |
23 |
Dimension
|
190 : |
jhr |
25 |
: INT
|
191 : |
jhr |
27 |
=> (INT)
|
192 : |
jhr |
23 |
;
|
193 : |
jhr |
19 |
|
194 : |
|
|
(***** Expressions *****)
|
195 : |
|
|
|
196 : |
|
|
Expr
|
197 : |
|
|
: Expr1 ( "||" Expr1 )*
|
198 : |
|
|
;
|
199 : |
|
|
|
200 : |
|
|
Expr1
|
201 : |
|
|
: Expr2 ( "&&" Expr2 )*
|
202 : |
|
|
;
|
203 : |
|
|
|
204 : |
|
|
Expr2
|
205 : |
|
|
: Expr3 ( CmpOp Expr3 )*
|
206 : |
|
|
;
|
207 : |
|
|
|
208 : |
jhr |
25 |
CmpOp
|
209 : |
jhr |
19 |
: "<" | "<=" | "==" | ">=" | ">"
|
210 : |
|
|
;
|
211 : |
|
|
|
212 : |
|
|
Expr3
|
213 : |
|
|
: Expr4 ( AddOp Expr4 )*
|
214 : |
|
|
;
|
215 : |
|
|
|
216 : |
|
|
AddOp
|
217 : |
|
|
: "+" | "-"
|
218 : |
|
|
;
|
219 : |
|
|
|
220 : |
|
|
Expr4
|
221 : |
|
|
: Expr5 ( MulOp Expr5 )*
|
222 : |
|
|
;
|
223 : |
|
|
|
224 : |
|
|
MulOp
|
225 : |
|
|
: "*" | "/"
|
226 : |
|
|
;
|
227 : |
|
|
|
228 : |
|
|
Expr5
|
229 : |
jhr |
24 |
: Expr6 ( "@" Expr6 | "[" Expr "]" )*
|
230 : |
jhr |
19 |
;
|
231 : |
|
|
|
232 : |
jhr |
25 |
Expr6
|
233 : |
|
|
: AtomExp
|
234 : |
jhr |
27 |
=> (AtomExp)
|
235 : |
jhr |
26 |
| "-" Expr6
|
236 : |
jhr |
27 |
=> (markExpr(FULL_SPAN, PT.E_UnaryOp(uMinus, Expr6)))
|
237 : |
jhr |
26 |
| "!" Expr6
|
238 : |
jhr |
27 |
=> (markExpr(FULL_SPAN, PT.E_UnaryOp(bNot, Expr6)))
|
239 : |
jhr |
25 |
;
|
240 : |
|
|
|
241 : |
jhr |
19 |
AtomExp
|
242 : |
|
|
: ID
|
243 : |
jhr |
27 |
=> (markExpr(FULL_SPAN, PT.E_Var ID))
|
244 : |
jhr |
19 |
| INT
|
245 : |
jhr |
27 |
=> (markExpr(FULL_SPAN, PT.E_Lit(L.Int STRING)))
|
246 : |
jhr |
19 |
| FLOAT
|
247 : |
jhr |
27 |
=> (markExpr(FULL_SPAN, PT.E_Lit(L.Float STRING)))
|
248 : |
jhr |
19 |
| STRING
|
249 : |
jhr |
27 |
=> (markExpr(FULL_SPAN, PT.E_Lit(L.String STRING)))
|
250 : |
jhr |
19 |
| "(" Expr ("," Expr)* ")"
|
251 : |
jhr |
27 |
=> (case SR
|
252 : |
|
|
of [] => Expr
|
253 : |
|
|
| l => markExpr(FULL_SPAN, PT.E_Tuple(Expr::l))
|
254 : |
|
|
(* end case *))
|
255 : |
jhr |
19 |
;
|