問題タブ [menhir]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
compiler-construction - メンヒルのセマンティック アクション
割り当て言語用の小さなコンパイラを構築しています。
次のルールを検討してください。
セマンティック アクションは、var_block が最初に認識されたときにトリガーされますか?それとも、生成の最後 (この場合は RPAREN) に達したときにトリガーされますか?
ocaml - モジュラーパーサー仕様で「決して役に立たない」優先順位警告を抑制しますか?
menhir で未使用の優先順位警告を抑制することは可能ですか?
バックグラウンド:
いくつかLib.mly
のルールを備えたコア パーサーとA.mly
、. すべての言語で単一のレクサーの使用をサポートするために、すべてのトークンが で定義されており、アノテーションを使用し、未使用のトークンの警告を抑制するように拡張しました。これは非常に役立ちます。ただし、次の形式の多くの警告が表示されます。B.mly
Lib.mly
Lib.mly
external_tokens(Lib)
_tags
myocamlbuild.ml
--unused-tokens
これらは、私が実際に対処したい他の警告を見つけるのを難しくします. 演算子のさまざまなサブセットがさまざまな言語で使用されているため、それらを適切に並べ替える単一の「グローバル」な優先順位が必要です。ヒントをありがとう!
parsing - OCaml レクサーで「先読み」を実行するにはどうすればよいですか / 語彙素をロールバックするにはどうすればよいですか?
さて、私は最初のパーサーを OCaml で書いていますが、すぐにどうにかして無限ループを持つパーサーを作成することができました。
特に注目すべきは、Scheme 仕様の規則に従って識別子を lex しようとしていることです (明らかに、自分が何をしているのかわかりません)。また、識別子の後に区切り文字が続くことを要求する言語がいくつかあります。現在の私のアプローチは、メインのレクサーによって消費されるべきではない文字delimited_identifier
の1つを含む正規表現を持つことです...そして、それが一致すると、その語彙素の読み取りは(まあ、私のラッパー)によって元に戻されます、実際の識別子のみを食べるサブレクサーに渡される前に、うまくいけばデリミタをバッファーに残して、親レクサーによって別の語彙素として食べられるようにします。delimiter
Sedlexing.rollback
私はMenhirとSedlexを使用しており、主に@smolkajのocaml-parsing
example-repo とRWO の解析の章の例を合成しています。これが私の現在のパーサーとレクサーの最も簡単な削減です:
…そして…</p>
(はい、基本的にノーオペレーション/可能な限り簡単なことです。私は学ぼうとしています! :x
)
残念ながら、この組み合わせにより、解析オートマトンで無限ループが発生します。
私は解析と字句解析、およびこれらすべてに不慣れです。どんなアドバイスも大歓迎です。きっと初心者のミスだと思いますが…</p>
ありがとう!