54 |
; |
; |
55 |
|
|
56 |
%defs ( |
%defs ( |
57 |
|
structure PT = ParseTree |
58 |
|
structure L = Literal |
59 |
|
|
60 |
(* apply a mark constructor to a span and a tree *) |
(* apply a mark constructor to a span and a tree *) |
61 |
fun mark cons (span : AntlrStreamPos.span, tr) = cons{span = span, tree = tr} |
fun mark cons (span : AntlrStreamPos.span, tr) = cons{span = span, tree = tr} |
62 |
|
|
63 |
|
(* 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 |
); |
); |
75 |
|
|
76 |
File |
File |
79 |
|
|
80 |
Decl |
Decl |
81 |
: InputDecl |
: InputDecl |
82 |
| GlobalDecl |
| VarDecl |
83 |
| ActorDecl |
| ActorDecl |
84 |
; |
; |
85 |
|
|
88 |
|
|
89 |
InputDecl |
InputDecl |
90 |
: "input" Type ID ( "=" Expr )? ";" |
: "input" Type ID ( "=" Expr )? ";" |
91 |
|
=> (markDecl(FULL_SPAN, PT.D_Input(Type, ID, SR))) |
92 |
; |
; |
93 |
|
|
94 |
(***** Global declarations *****) |
(***** variable declarations *****) |
95 |
|
|
96 |
GlobalDecl |
VarDecl |
97 |
: Type ID "=" Expr ";" |
: Type ID "=" Expr ";" |
98 |
|
=> (mark PT.VD_Mark (FULL_SPAN, PT.VD_Decl(Type, ID, Expr))) |
99 |
; |
; |
100 |
|
|
101 |
|
|
102 |
(***** Actors *****) |
(***** Actors *****) |
103 |
|
|
104 |
ActorDecl |
ActorDecl |
105 |
: "actor" ID "(" Params ")" "{" ActorState* ActorMethod+ "}" |
: "actor" ID "(" Params ")" "{" VarDecl* ActorMethod+ "}" |
106 |
|
=> (markDecl(FULL_SPAN, PT.D_Actor{ |
107 |
|
name = ID, params = Params, state = VarDecl, |
108 |
|
methods = ActorMethod |
109 |
|
})) |
110 |
; |
; |
111 |
|
|
112 |
Params |
Params |
113 |
: ( Param ( "," Param )* )? |
: ( Param ( "," Param )* )? |
114 |
|
=> (flatten SR) |
115 |
; |
; |
116 |
|
|
117 |
Param |
Param |
118 |
: Type ID |
: Type ID |
119 |
; |
=> (mark PT.P_Mark (FULL_SPAN, PT.P_Param(Type, ID))) |
|
|
|
|
ActorState |
|
|
: Type ID "=" Expr ";" |
|
120 |
; |
; |
121 |
|
|
122 |
ActorMethod |
ActorMethod |
123 |
: ID Block |
: ID Block |
124 |
|
=> (mark PT.P_Mark (FULL_SPAN, PT.M_Method(ID, Block))) |
125 |
; |
; |
126 |
|
|
127 |
Block |
Block |
141 |
AtomicStmt |
AtomicStmt |
142 |
: Block |
: Block |
143 |
=> (Block) |
=> (Block) |
144 |
|
| VarDecl |
145 |
|
=> (PT.S_Decl VarDecl) |
146 |
| "stabilize" ";" |
| "stabilize" ";" |
147 |
=> (markStmt(FULL_SPAN, PT.S_Stabilize)) |
=> (markStmt(FULL_SPAN, PT.S_Stabilize)) |
148 |
| "die" ";" |
| "die" ";" |
149 |
=> (markStmt(FULL_SPAN, PT.S_Die)) |
=> (markStmt(FULL_SPAN, PT.S_Die)) |
150 |
| "new" ID "(" Arguments ")" ";" |
| "new" ID "(" Arguments ")" ";" |
151 |
=> (markStmt(FULL_SPAN, PT.S_New(ID, Arguments))) |
=> (markStmt(FULL_SPAN, PT.S_New(ID, Arguments))) |
|
| Type ID "=" Expr ";" |
|
|
=> (markStmt(FULL_SPAN, PT.S_Decl(Type, ID, Expr))) |
|
152 |
| ID "=" Expr ";" |
| ID "=" Expr ";" |
153 |
=> (markStmt(FULL_SPAN, PT.S_Assign(ID, Expr))) |
=> (markStmt(FULL_SPAN, PT.S_Assign(ID, Expr))) |
154 |
; |
; |
155 |
|
|
156 |
Arguments |
Arguments |
157 |
: ( Expr ("," Expr)* )? |
: ( Expr ("," Expr)* )? |
158 |
|
=> (flatten SR) |
159 |
; |
; |
160 |
|
|
161 |
|
|
183 |
|
|
184 |
Dimensions |
Dimensions |
185 |
: ( Dimension ("," Dimension)* )? |
: ( Dimension ("," Dimension)* )? |
186 |
|
=> (flatten SR) |
187 |
; |
; |
188 |
|
|
189 |
Dimension |
Dimension |
190 |
: INT |
: INT |
191 |
|
=> (INT) |
192 |
; |
; |
193 |
|
|
194 |
(***** Expressions *****) |
(***** Expressions *****) |
231 |
|
|
232 |
Expr6 |
Expr6 |
233 |
: AtomExp |
: AtomExp |
234 |
|
=> (AtomExp) |
235 |
| "-" Expr6 |
| "-" Expr6 |
236 |
|
=> (markExpr(FULL_SPAN, PT.E_UnaryOp(uMinus, Expr6))) |
237 |
| "!" Expr6 |
| "!" Expr6 |
238 |
|
=> (markExpr(FULL_SPAN, PT.E_UnaryOp(bNot, Expr6))) |
239 |
; |
; |
240 |
|
|
241 |
AtomExp |
AtomExp |
242 |
: ID |
: ID |
243 |
|
=> (markExpr(FULL_SPAN, PT.E_Var ID)) |
244 |
| INT |
| INT |
245 |
|
=> (markExpr(FULL_SPAN, PT.E_Lit(L.Int STRING))) |
246 |
| FLOAT |
| FLOAT |
247 |
|
=> (markExpr(FULL_SPAN, PT.E_Lit(L.Float STRING))) |
248 |
| STRING |
| STRING |
249 |
|
=> (markExpr(FULL_SPAN, PT.E_Lit(L.String STRING))) |
250 |
| "(" Expr ("," Expr)* ")" |
| "(" Expr ("," Expr)* ")" |
251 |
|
=> (case SR |
252 |
|
of [] => Expr |
253 |
|
| l => markExpr(FULL_SPAN, PT.E_Tuple(Expr::l)) |
254 |
|
(* end case *)) |
255 |
; |
; |