【发布时间】:2021-03-06 13:05:29
【问题描述】:
我正在用 OCaml 制作一个 Lisp 解释器。我自然是从前端开始的。到目前为止,我有一个大部分时间都有效的 S 表达式解析算法。对于(a b) 和((a b) (c d)) 这样的简单S 表达式,我的函数ast_as_str 显示输出列表结构不正确。我已经在下面记录了这一点。在对parse 尝试了无数变化之后,似乎没有任何效果。擅长在 OCaml 中编写解析器的人对我如何修复我的代码有建议吗?
type s_expression = Nil | Atom of string | Pair of s_expression * s_expression
let rec parse tokens =
match tokens with
| [] -> Nil
| token :: rest ->
match token with
| "(" -> parse rest
| ")" -> Pair(Nil, parse rest)
| atom -> Pair(Atom atom, parse rest)
let rec ast_as_str ast =
match ast with
| Nil -> "nil"
| Atom a -> Printf.sprintf "%s" a
| Pair(a, b) -> Printf.sprintf "(%s %s)" (ast_as_str a) (ast_as_str b);;
let check_output test = print_endline (ast_as_str (parse test));;
(*
Input:
(a b)
Output:
(a (b (nil nil)))
Almost correct...
*)
check_output ["("; "a"; "b"; ")"];;
(*
Input:
((w x) (y z))
Output:
(w (x (nil (y (z (nil (nil nil)))))))
Incorrect.
*)
check_output ["("; "("; "w"; "x"; ")"; "("; "y"; "z"; ")"; ")"]
【问题讨论】:
标签: parsing ocaml lisp ml s-expression