Clojure 中的语法树生成

Jus*_*mas 5 compiler-construction clojure abstract-syntax-tree

我正在编写一个编译器,真正用于教育目的。我已经从我的输入中生成了令牌并想生成一个 AST。我有一个函数,它接受令牌列表并递归生成 ast。在大多数解析器中,您都有一个指向词法分析器的指针,因此每次处理树中的标记时,您都会推进词法分析器。当您遇到需要在树中生成更深节点的部分时,我不知道如何推进词法分析器,因为您无法修改词法分析器列表的结构。

以这样的 clojure 程序为例(+ 1 2 (+ 1 1))。它会前进到 + 然后递归并正确生成节点,但是词法分析器在生成节点返回后重新处理 + 1 1 ,因此您最终会得到这样的树:

Root
---> +
---> 1
---> 2
-----> +
-----> 1
-----> 1
---> +
---> 1
---> 1
Run Code Online (Sandbox Code Playgroud)

Jul*_*ang 3

在 Lisp/Clojure 中,您可以直接对通过 Lisp 数据结构表示的抽象语法树进行编程。此外,您可以通过编程方式对 Lisp 数据结构进行操作,从而生成宏。所以,总而言之,您已经有了 AST。