44 |
| LCB ("{") |
| LCB ("{") |
45 |
| RCB ("}") |
| RCB ("}") |
46 |
| COMMA (",") |
| COMMA (",") |
47 |
| SEMICOLON (";") |
| SEMI (";") |
48 |
| HASH ("#") |
| HASH ("#") |
49 |
| BANG ("!") |
| BANG ("!") |
50 |
| INT of IntInf.int |
| INT of IntInf.int |
56 |
%defs ( |
%defs ( |
57 |
structure PT = ParseTree |
structure PT = ParseTree |
58 |
structure L = Literal |
structure L = Literal |
59 |
|
structure Op = Operators |
60 |
|
|
61 |
(* apply a mark constructor to a span and a tree *) |
(* apply a mark constructor to a span and a tree *) |
62 |
fun mark cons (span : AntlrStreamPos.span, tr) = cons{span = span, tree = tr} |
fun mark cons (span : AntlrStreamPos.span, tr) = cons{span = span, tree = tr} |
67 |
| markTy (sp, tr) = mark PT.T_Mark (sp, tr) |
| markTy (sp, tr) = mark PT.T_Mark (sp, tr) |
68 |
fun markStmt (_, e as PT.S_Mark _) = e |
fun markStmt (_, e as PT.S_Mark _) = e |
69 |
| markStmt (sp, tr) = mark PT.S_Mark (sp, tr) |
| markStmt (sp, tr) = mark PT.S_Mark (sp, tr) |
70 |
fun markExp (_, e as PT.E_Mark _) = e |
fun markExpr (_, e as PT.E_Mark _) = e |
71 |
| markExp (sp, tr) = mark PT.E_Mark (sp, tr) |
| markExpr (sp, tr) = mark PT.E_Mark (sp, tr) |
72 |
|
|
73 |
(* build an application for an infix binary operator *) |
(* build an application for an infix binary operator *) |
74 |
fun mkBinApp (e1, rator, e2) = PT.E_BinOp(e1, rator, e2) |
fun mkBinApp (e1, rator, e2) = PT.E_BinOp(e1, rator, e2) |
83 |
| mkRBinExp (e, (id, e')::r) = mkBinApp(e, id, mkRBinExp(e', r)) |
| mkRBinExp (e, (id, e')::r) = mkBinApp(e, id, mkRBinExp(e', r)) |
84 |
|
|
85 |
fun flatten NONE = [] |
fun flatten NONE = [] |
86 |
| flatten (SOME l) = l |
| flatten (SOME(x, xs)) = x::xs |
87 |
|
|
88 |
); |
); |
89 |
|
|
90 |
File |
File |
93 |
|
|
94 |
Decl |
Decl |
95 |
: InputDecl |
: InputDecl |
96 |
| VarDecl |
| VarDecl => (PT.D_Var VarDecl) |
97 |
| ActorDecl |
| ActorDecl |
98 |
; |
; |
99 |
|
|
135 |
|
|
136 |
ActorMethod |
ActorMethod |
137 |
: ID Block |
: ID Block |
138 |
=> (mark PT.P_Mark (FULL_SPAN, PT.M_Method(ID, Block))) |
=> (mark PT.M_Mark (FULL_SPAN, PT.M_Method(ID, Block))) |
139 |
; |
; |
140 |
|
|
141 |
Block |
Block |
208 |
(***** Expressions *****) |
(***** Expressions *****) |
209 |
|
|
210 |
Expr |
Expr |
211 |
: Expr1 ( "||" Expr1 )* |
: AndExpr ( "||" AndExpr => (Op.orElse, AndExpr) )* |
212 |
|
=> (mkLBinExp (AndExpr, SR)) |
213 |
; |
; |
214 |
|
|
215 |
Expr1 |
AndExpr |
216 |
: Expr2 ( "&&" Expr2 )* |
: CmpExpr ( "&&" CmpExpr => (Op.andAlso, CmpExpr) )* |
217 |
|
=> (mkLBinExp (CmpExpr, SR)) |
218 |
; |
; |
219 |
|
|
220 |
Expr2 |
CmpExpr |
221 |
: Expr3 ( CmpOp Expr3 )* |
: AddExpr ( CmpOp AddExpr )* |
222 |
|
=> (mkLBinExp (AddExpr, SR)) |
223 |
; |
; |
224 |
|
|
225 |
CmpOp |
CmpOp |
226 |
: "<" | "<=" | "==" | ">=" | ">" |
: "<" => (Op.lt) | "<=" => (Op.lte) |
227 |
|
| "==" => (Op.equ) | "!=" => (Op.neq) |
228 |
|
| ">=" => (Op.gte) | ">" => (Op.gt) |
229 |
; |
; |
230 |
|
|
231 |
Expr3 |
AddExpr |
232 |
: Expr4 ( AddOp Expr4 )* |
: MulExpr ( AddOp MulExpr )* |
233 |
|
=> (mkLBinExp (MulExpr, SR)) |
234 |
; |
; |
235 |
|
|
236 |
AddOp |
AddOp |
237 |
: "+" | "-" |
: "+" => (Op.plus) | "-" => (Op.minus) |
238 |
; |
; |
239 |
|
|
240 |
Expr4 |
MulExpr |
241 |
: Expr5 ( MulOp Expr5 )* |
: SelExpr ( MulOp SelExpr )* |
242 |
|
=> (mkLBinExp (SelExpr, SR)) |
243 |
; |
; |
244 |
|
|
245 |
MulOp |
MulOp |
246 |
: "*" | "/" |
: "*" => (Op.times) | "/" => (Op.divide) |
247 |
; |
; |
248 |
|
|
249 |
Expr5 |
SelExpr |
250 |
: Expr6 ( "@" Expr6 | "[" Expr "]" )* |
: PrefixExpr ( "@" PrefixExpr => (Op.at, PrefixExpr) | "[" Expr "]" => (Op.sub, Expr) )* |
251 |
|
=> (mkRBinExp (PrefixExpr, SR)) |
252 |
; |
; |
253 |
|
|
254 |
Expr6 |
PrefixExpr |
255 |
: AtomExp |
: AtomExp |
256 |
=> (AtomExp) |
=> (AtomExp) |
257 |
| "-" Expr6 |
| "-" PrefixExpr |
258 |
=> (markExpr(FULL_SPAN, PT.E_UnaryOp(uMinus, Expr6))) |
=> (markExpr(FULL_SPAN, PT.E_UnaryOp(Op.uMinus, PrefixExpr))) |
259 |
| "!" Expr6 |
| "!" PrefixExpr |
260 |
=> (markExpr(FULL_SPAN, PT.E_UnaryOp(bNot, Expr6))) |
=> (markExpr(FULL_SPAN, PT.E_UnaryOp(Op.bNot, PrefixExpr))) |
261 |
; |
; |
262 |
|
|
263 |
AtomExp |
AtomExp |
264 |
: ID |
: ID |
265 |
=> (markExpr(FULL_SPAN, PT.E_Var ID)) |
=> (markExpr(FULL_SPAN, PT.E_Var ID)) |
266 |
| INT |
| INT |
267 |
=> (markExpr(FULL_SPAN, PT.E_Lit(L.Int STRING))) |
=> (markExpr(FULL_SPAN, PT.E_Lit(L.Int INT))) |
268 |
| FLOAT |
| FLOAT |
269 |
=> (markExpr(FULL_SPAN, PT.E_Lit(L.Float STRING))) |
=> (markExpr(FULL_SPAN, PT.E_Lit(L.Float FLOAT))) |
270 |
| STRING |
| STRING |
271 |
=> (markExpr(FULL_SPAN, PT.E_Lit(L.String STRING))) |
=> (markExpr(FULL_SPAN, PT.E_Lit(L.String STRING))) |
272 |
| "(" Expr ("," Expr)* ")" |
| "(" Expr ("," Expr)* ")" |