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 に答える