0

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_ingredientliquefy_ingredientを他のルールと競合させずに含めることは可能ですか? 前者は実際には私が推測する他のすべてと競合し、後者はliquefy_mixing_bowlと競合します。このような厄介な文法に対処する最善の方法は何でしょうか?

ちなみに、WS (スペースやタブなどの空白) を無視チャネルに設定していません。区切り記号として WS トークンを使用して文法を指定します。

また、antlr4ruby コマンドを実行してパーサー/レクサー コードを生成しても、警告はまったく表示されません。

ヒント、ヒント、または啓発は、ここで本当に感謝しています:)

前もって感謝します。

4

0 に答える 0