問題タブ [shift-reduce-conflict]
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.
parsing - あいまいな文法やプロダクション ルールが問題ないのはいつですか? (バイソンシフト/警告を減らす)
shift/reduce エラーの解決に関するドキュメントやハウツーは確かにたくさんあります。bison のドキュメントでは、正しい解決策は通常、それらを単に期待して対処することであると示唆しています。
あなたがこのようなものを持っているとき:
次のように簡単に解決できます。
私の質問は次のとおりです。文法を少しあいまいにして %expect shift/reduce の問題を残す方が良いですか、それとも文法を調整してそれらを回避する方が良いですか? バランスがあり、作者のニーズに基づいているのではないかと思いますが、よくわかりません。
oslo - シフトリデュースとリデュースリデュースコンフリクト
私はこれに頭を悩ませているので、shift reduce と reduce reduce conflict を理解する助けが必要です。なぜ問題なのか理解できない文法があります。文法を添付することもできますが、これが実際にどのように機能するかを知りたいです。
最初の質問は、MGrammer が作成するパーサーの種類は何ですか? 私が理解しているように、shift reduce と reduce reduce の競合はパーサーの種類によって異なります。
2 番目の質問です。reduce reduce conflict とは何を意味し、shift reduce conflict とは何を意味するのでしょうか?
私は字句解析の基礎と形式的な文法を知っていますが、言語設計に携わってからしばらく経っているので、ここでのヘルプは大いに当てはまります。
アップデート:
私は空白を重要視する言語を扱っていますが、MGramar でこれを行う可能性について疑問に思っています。あいまいさを解決するために先読みが必要ですか?
parsing - ポストインクリメント演算子からの YACC シフト/削減競合を修正するには?
YACC (実際には Bison) で文法を書いていますが、シフト/リデュースの問題があります。これは、後置インクリメント演算子とデクリメント演算子を含めることによって生じます。以下は、文法の縮小版です。
Bison は、12 個のシフト/リデュースの競合があることを教えてくれましたが、接尾辞のインクリメントとデクリメントの行をコメントアウトすると、問題なく動作します。この競合を修正する方法を知っている人はいますか? この時点で、LL(k) パーサー ジェネレーターに移行することを検討しています。これにより、はるかに簡単になりますが、LALR 文法は常に、より自然に記述できるように見えました。GLR も検討していますが、優れた C/C++ GLR パーサー ジェネレーターを知りません。
parsing - 文法での shift-reduce 競合の解決に関する問題
Ironyを使用して小さなパーサーを作成しようとしています。残念ながら、「シフト削減の競合」が発生します。文法は私の得意分野ではなく、この 1 つの小さなことを完了するだけで済みます。エラーを生成する簡略化された文法は次のとおりです。
「shift-reduce 競合」とは何を意味し、どうすれば解決できますか? それは私の文法があいまいであることを意味していると私は推測していますが、私は自分の論理を十分にひねってその方法を理解することはできません.
追加:明確にするために - 「asd」は単なるリテラル文字列「asd」です。したがって、次の式がこの文法によって解析されると予想されます。
追加 2:言い忘れましたが、文法の語根は ですLogicalExpression
。
追加 3:ああ、わかった! あいまいさは、
次の 2 つの異なる方法で解釈できます。
しかし、どうすればこれを解決できますか?OK、AND または OR のどちらか一方を他方よりも強くすることができます (いずれにせよ意図していました)。しかし、オペレーターが 1 人しかいない場合でもエラーが表示されるようになりました。つまり、これも同じエラーを生成します。
この場合、私はこれが欲しい:
これに解析されます:
これを行うためのあいまいでない方法は何ですか?
追加 4:わかりました!
これは、演算子の優先順位を NOT->AND->OR として、すべてのブール式を解析します。「asd」は、用語を意図した表現に置き換えることができます。
parsing - Shift / Reduceの競合を支援する-モデル化を試みる(XA)*(XB)*
EBNF式をモデル化しようとしています
これを表すように見えるyacc(MPPGを使用しています)文法を作成しましたが、テスト式と一致しません。
私が一致させようとしているテストケースは
レクサーからのトークンストリームは
文法解析では、「Shift / Reduce競合、KW_Declareの状態6」があると示されています。「%leftPrologHeaderList PrologBodyList」でこれを解決しようとしましたが、どちらの解決策も機能しません。
KW_Declare KW_Namespace KW_Variable Separatorはすべて、値が「declare」、「naemsapce」、「variable」、「;」のトークンです。
parsing - 明確な文法で shift-reduce 競合を解決する方法
LALR(1) パーサー ジェネレーター (Bison ですが、問題はそのツールに固有のものではありません) を使用して単純な文法を解析しようとしていますが、shift-reduce の競合が発生しています。これらの修正について私が見つけたドキュメントやその他の情報源は、次の1つ以上を言う傾向があります:
- 文法があいまいな場合 (if-then-else のあいまいさなど)、言語を変更してあいまいさを修正します。
- 演算子の優先順位の問題である場合は、優先順位を明示的に指定してください。
- デフォルトの解像度を受け入れ、ジェネレーターに文句を言わないように伝えます。
ただし、これらのどれも私の状況には当てはまらないようです: 私が知る限り、文法は明確です (もちろん、先読みの文字が 1 つしかないためあいまいですが)、演算子は 1 つしかなく、デフォルトの解決では解析エラーが発生します正しく形成された入力で。文法の定義を作り直して、上記のバケツに当てはまらない shift-reduce 競合を取り除くテクニックはありますか?
具体的に言うと、問題の文法は次のとおりです。
その意図は、"[A-Za-z]+" または "[A-Za-z] -> [A-Za-z]+" の形式のセミコロンで区切られた行を解析することです。
yacc - bison shift/reduce problem 移動 add op を部分式に
もともと例ではこれがありました
「もっとシンプル」にしたかったので、これを書きました(加算と減算の両方で「+」を実行することに気づきました。ただし、これは例です)
これで、シフト/リデュース エラーが発生します。まったく同じはずです-_-(私にとって)。これを修正するにはどうすればよいですか?
編集:物事を明確にするために。最初のものには警告/エラーはありません。%left を使用して優先順位を設定します (また、%right を = およびその他の右側の操作に使用します)。ただし、サブ式に入ると適用されないようです。
yacc - '(' ではなく ')' に shift reduce/conflict があるのはなぜですか?
私は次のような構文を持っています
と
および (var)
私のルールは次のようなものです
問題は、それが ) に属している%(CommaLoop)
かどうかを判断できないように見えることです% (val)
が、( の代わりに ) に文句を言うのです。一体何ですか? 文句を言う(
べきではありませんか? どうすればエラーを修正できますか?%(
トークンを作成することは良い解決策ですが$(
、これを行う前にエラーではない理由を確認したいと思います。
yacc - コンフリクトを解決するために Bison/Yacc にシフトし、削減しないように指示する
私が理解しているシフト/リデュースの競合があるルールがある状況があります。可能な限り最後の瞬間 (行末) まで削減しないというルールが必要です。ですから、常にシフトしていると言いたいです。どうすればいいですか?
grammar - yacc シフト削減問題
文法の単純な部分だと思うのですが、yacc からエラーが発生しています。%prec をどこかに追加する必要があることはわかっていますが、どこにあるのかよくわかりません。
エラーは次のとおりです。
したがって、ID は単なる変数名であり、Ref は変数への参照です。