我正在编写一个编译器,真的是为了教育目的。我已经从我的输入中生成了令牌,并且想要生成一个 AST。我有一个函数,它获取令牌列表并递归生成 ast。在大多数解析器中,您都有一个指向词法分析器的指针,因此每次处理树中的标记时,您都会推进词法分析器。当您遇到需要在树中生成更深节点的部分时,我不知道如何推进词法分析器,因为您无法修改词法分析器列表的结构。
以这样的 clojure 程序为例(+ 1 2 (+ 1 1))
。它会前进到 + 然后递归并正确生成节点,但是词法分析器在生成节点返回后重新处理 + 1 1 ,所以你最终得到一棵像这样的树:
Root
---> +
---> 1
---> 2
-----> +
-----> 1
-----> 1
---> +
---> 1
---> 1