私は現在、ハッピー&アレックスを使って、おもちゃの言語 のコンパイラのパーサを書いています。任意のレイアウトのオプションが必要なので、私は アレックスの状態をblock
非端末に合わせる前に変更しなければなりません。残念ながら ハッピーに必要な先読みトークンが先に読み取られているようです 私はアレックスの状態を変更するチャンスがあります。ここでハッピー&アレックス - 先読みがパーサーレクサーの通信に影響を与えないようにする
は、問題を実証する小さなスニペットです:
funcDef : header localDefs block
^I have to change alex's state
before the underlying lexer
starts reading the block tokens.
は、この問題に対する一般的なアプローチはありますか?
ブロックの開始位置をどのように知っていますか?私は 'localDefs'は自己終了していないと仮定しているので、ブロックの開始位置を知るために使うことができる字句機能がなければなりません。おそらく少し解明できますか? – rici
@riciブロックはbegin/endキーワードで囲まれているか、またはインデントベースです。基本的にbegin stmts + endまたはstmts autoendとして定義されています。レクサーは、識別変更が検出されたときに自動応答を生成するために、開始が欠落していることを通知する必要があります。全体のアプローチは、より良い方法でなければならない非常にハッキリと感じています。 –
2週間前にこの_exact_問題を解決しました。他の誰かがその上を走るとは思わなかった。 – Alec