Очень близко к тому, чтобы заставить это работать, но возникли проблемы с StringMap от OCaml. По сути, я делаю калькулятор, который получает из ocamllex лексический поток ... поэтому здесь запятые должны разделять наши выражения, а знаки равенства означают, что мы будем присваивать значение переменной.
Я понял, что при назначении переменных я не могу их искать, потому что получаю (Fatal error: исключение Not_found) строки, где не могу найти ключ, который я добавил в случае Var функции. Я не знаю, куда поместить StringMap.empty или как сделать его видимым в этой функции ... Мне было интересно, почему он не может найти то, что я добавляю в случае равенства?
Вот мой код.
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)