非常接近让它工作,但在使用 OCaml 的 StringMap 时遇到问题。本质上,我正在制作一个计算器,它从 ocamllex 接收词汇流......所以这里应该用逗号分隔我们的表达式,而等号意味着我们将为变量赋值。
我意识到,在分配变量时,我无法查找它们,因为我在函数的 Var 案例中添加的未找到密钥的行中出现 (Fatal error: exception Not_found)。我不知道将 StringMap.empty 放在哪里或如何使其在此函数中可见......我想知道为什么它找不到我在 equals 情况下添加的内容?
这是我的代码。
open Ast
module StringMap = Map.Make(String)
let varMap = StringMap.empty
let rec parser = function
Lit(x) -> x
| Binop(e1, op, e2) -> (
let v1 = parser e1 and v2 = parser e2 in
match op with
Add -> v1 + v2
| Sub -> v1 - v2
| Mul -> v1 * v2
| Div -> v1 / v2
)
| Var(v) -> StringMap.find v varMap
| Statements(e1, e2) -> ignore(parser e1); parser e2
| Equals(v, e1) -> StringMap.add v e1 varMap; parser e1
let _ =
let LexingBuffer = Lexing.from_channel stdin in
let expression = Parser.expression Scanner.token LexingBuffer in
let result = parser expression in
print_endline (string_of_int result)