ruby用のantlr を使用して、antlr を使い始めたばかりです。バージョンは 3.2.1 です
シェフ言語用のパーサーを作成しようとしていますが、文法が頭を悩ませています:P基本的な概念が欠けていると確信していますが、それを理解できませんでした.
3つの文法を作成しました。主なものは、(もちろん) レシピを解析するレシピ パーサーです。レシピが解析されたら、材料と指示 (メソッド セクション) を解析する他の 2 つの文法を使用しました。
私の問題は、最後のもの、「混合ボウルに入れる」、「液化する」などの指示を解析するものにあります。いくつかのルールを除いて、すべてがうまく機能します。その長さのため、Instructions.g のソースを paste.bin に投稿しました。
何が起こっているかは次のとおりです。
ルールCombine_ingredient_into_mixing_bowlまたはdivide_ingredient_into_mixing_bowlのコメントを外すと、パーサーは他のほとんどすべてのルール (put_ingredient_into_mixing_bowl など) を認識しなくなります。これは私には奇妙に思えます。なぜなら、それらは互いにオーバーライドしていないように見えるからです (もちろん、何らかの形でオーバーライドしています)。エラーが表示されます:「行 0:-1 の入力が一致しません」「WS が必要です」
かき混ぜる_混合_ボウルは何にも一致しませんが、実際には正常に機能する他のルールと何ら変わりはありません。次のエラーが表示されます:「行 0:-1 の入力が一致しません」「セット nil が必要です」
ルールverb_the_ingredientとliquefy_ingredientを他のルールと競合させずに含めることは可能ですか? 前者は実際には私が推測する他のすべてと競合し、後者はliquefy_mixing_bowlと競合します。このような厄介な文法に対処する最善の方法は何でしょうか?
ちなみに、WS (スペースやタブなどの空白) を無視チャネルに設定していません。区切り記号として WS トークンを使用して文法を指定します。
また、antlr4ruby コマンドを実行してパーサー/レクサー コードを生成しても、警告はまったく表示されません。
ヒント、ヒント、または啓発は、ここで本当に感謝しています:)
前もって感謝します。