ocamlyaccとocamllexを使って文法を書くときに、変数内の文をどのように処理するのかと思いました。yacc/bison(ocamlを使用)で変数参照を処理する方法
問題は、フォーム
var x = y + z
var b = true | f;
のステートメントは両方の正確でなければならないが、第2ケースf
にブール変数である第一の場合に変数は数値を意味することです。私はこれを持って書いている文法で
:
両方var_ref
以外の端末が同じに減らすため、明らかに動作しないことができ、(競合を削減/削減)
numeric_exp_val:
| nint { Syntax.Int $1 }
| FLOAT { Syntax.Float $1 }
| LPAREN; ne = numeric_exp; RPAREN { ne }
| INCR; r = numeric_var_ref { Syntax.VarIncr (r,1) }
| DECR; r = numeric_var_ref { Syntax.VarIncr (r,-1) }
| var_ref { $1 }
;
boolean_exp_val:
| BOOL { Syntax.Bool $1 }
| LPAREN; be = boolean_exp; RPAREN { be }
| var_ref { $1 }
;
。しかし、私は構文解析フェーズ中に(静的に)(変数参照に関して)ほとんど行われている型チェックをしたいと思います。
だからこそ、私は可変参照を持ち、この構造を保持するのが最善の方法であると思っています。
let rec compile_numeric_exp exp =
match exp with
Int i -> [Push (Types.I.Int i)]
| Float f -> [Push (Types.I.Float f)]
| Bop (BNSum,e1,e2) -> (compile_numeric_exp e1) @ (compile_numeric_exp e2) @ [Types.I.Plus]
| Bop (BNSub,e1,e2) -> (compile_numeric_exp e1) @ (compile_numeric_exp e2) @ [Types.I.Minus]
| Bop (BNMul,e1,e2) -> (compile_numeric_exp e1) @ (compile_numeric_exp e2) @ [Types.I.Times]
| Bop (BNDiv,e1,e2) -> (compile_numeric_exp e1) @ (compile_numeric_exp e2) @ [Types.I.Div]
| Bop (BNOr,e1,e2) -> (compile_numeric_exp e1) @ (compile_numeric_exp e2) @ [Types.I.Or]
| VarRef n -> [Types.I.MemoryGet (Memory.index_for_name n)]
| VarIncr ((VarRef n) as vr,i) -> (compile_numeric_exp vr) @ [Push (Types.I.Int i);Types.I.Plus;Types.I.Dupe] @ (compile_assignment_to n)
| _ -> []
私はちょうど構文解析段階から型チェックを分割しました。型推論を利用してパワフルにパースして自動的にチェックする可能性は本当に魅力的です:) – Jack