5

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

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

Root
---> +
---> 1
---> 2
-----> +
-----> 1
-----> 1
---> +
---> 1
---> 1
4

1 回答 1

3

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

于 2013-04-19T22:36:57.007 回答