私は実際に教育目的でコンパイラを書いています。入力からトークンを生成しましたが、AST を生成したいと考えています。トークンのリストを取得し、再帰して ast を生成する関数があります。ほとんどのパーサーでは、レクサーへのポインターがあるため、ツリーでトークンを処理するたびにレクサーを進めます。レクサーリストの構造を変更できないため、ツリー内のより深いノードを生成する必要がある部分にヒットしたときに、レクサーを進める方法がわかりません。
このような clojure プログラムの例として(+ 1 2 (+ 1 1))
。+ に進み、再帰して適切にノードを生成しますが、レクサーはノードの生成から戻った後に + 1 1 を再処理するため、次のようなツリーになります。
Root
---> +
---> 1
---> 2
-----> +
-----> 1
-----> 1
---> +
---> 1
---> 1