問題タブ [reduce-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.
oslo - シフトリデュースとリデュースリデュースコンフリクト
私はこれに頭を悩ませているので、shift reduce と reduce reduce conflict を理解する助けが必要です。なぜ問題なのか理解できない文法があります。文法を添付することもできますが、これが実際にどのように機能するかを知りたいです。
最初の質問は、MGrammer が作成するパーサーの種類は何ですか? 私が理解しているように、shift reduce と reduce reduce の競合はパーサーの種類によって異なります。
2 番目の質問です。reduce reduce conflict とは何を意味し、shift reduce conflict とは何を意味するのでしょうか?
私は字句解析の基礎と形式的な文法を知っていますが、言語設計に携わってからしばらく経っているので、ここでのヘルプは大いに当てはまります。
アップデート:
私は空白を重要視する言語を扱っていますが、MGramar でこれを行う可能性について疑問に思っています。あいまいさを解決するために先読みが必要ですか?
yacc - リデュースではなくバイソンシフト。reduce/reduce エラーあり
私の言語で私は書くことができます
私のグラマーは、ステートメント間の改行をサポートしていません。else は if でのみ使用できます。ルールにoptionalNLを追加すると
else の前の optionalNL は、3 つの reduce/reduce を引き起こします。理由は、IfExpr の 2 番目のルールを使用して削減できるか、式の間に多くの改行を許可する exprLoop に削減できるためです。
私が何をしても (optionalNL と ELSE の前に %prec を書いてみました)、常に exprLoop に縮小されます。削減する代わりに、この時点で (optionalNL else に) シフトするように bison に指示するにはどうすればよいですか? (exprLoop に、else をエラーにします)。
テストするサンプルファイル
y.output http://www.pastie.org/707448
代替 .y および出力。\n を見て先を見越しており、ルールを縮小するか続行するかはわかりません。ルールの順序を変更して、異なる結果を取得します。しかし、常に \n を期待するか、常に else を期待するため、1 つのルールは常に無視されます。状態 15
Kinopiko さん、ご回答ありがとうございます。
私は彼のコードを競合がないように変更し、より柔軟にすることに取り組みました。ここに私のファイルがあります
test.y
test.y
コンパイル後に自動実行されるテスト ファイル
parsing - shift-reduce/reduce-reduceの無料文法を作成する
私はsableccで言語パーサーのような単純なJavaを実装しようとしていますが、、およびステートメントを実装するときに常に問題が発生していshift-reduce
ます。reduce-reduce
if
while
block
たとえば、私は次のことを検討しました。
stmts
= stmt*
;
stmt
= if_stmt
| block_stmt
| while_stmt
;
block_stmt
= { stmts }
| ;
;
while_stmt
= while
(
predicate
)
{
stmts
}
|while
(
predicate
)
;
この文法は、例えば、あなたが何かの形をしているときに問題を引き起こします
;
パーサーは、 (から)だけを減らすか、 (から)block_stmt
完全に減らすかを知ることができません。while (true);
while_stmt
私はshift-reduce
/reduce-reduce
問題の理由をどこでも読んでいて、私はそれらを理解していると思います。しかし、1つはそれらの原因を知ることであり、もう1つはまったく異なることは、私がそれらを回避するように文法を構造化する方法を知ることです。私は非常に異なる方法で文法を実装しようとしましたが、それでも問題が発生します。
ss
特定の/問題から実行しようとするのではなく、rr
この種の問題を回避するために、そのようなものに従うための一種のパラダイムが必要だと思いますか?私の問題への取り組み方は完全に間違っているに違いないと思います:(
これらすべての落とし穴に陥ることなく文法をゼロから構築する方法に関するリソースはありますか?この問題に関するリソースは、非常に簡単である(明らかなif then else
問題を述べている)か、完全にフラグが立てられた文法である傾向があります。
bison - バイソンリデュース/リデュース
私は Bison の解析が初めてで、それがどのように機能するのか理解できません。私は次の文法を持っています。ここでは、問題を強調するために最小限を維持しています。
ご覧の'~'
とおり、後続の式の種類に応じて、さまざまな関数を演算子に適用したいと考えています。ただし、これにより 2 つの reduce/reduce 競合が発生します。
もちろん、composite_expr ルールを次のように書き直すと...
...その後、競合はありませんが、 isまたは かどうかわからなくなったため、 do_something_1()
orを呼び出すことができません。do_something_2()
expr
variable_expr
composite_expr
これを行うことができる他の方法はありますか?そもそも競合を削減/削減する理由を誰かが説明できますか?
これは簡略化されたバージョンであり、実際にはルールcomposite_expr
が非常に長いことに注意してください。したがって、それを複製することは問題外です。
bison - 構文エラーがあることをbisonに伝えるにはどうすればよいですか?
何が起こるかというと、ASTを分析した後、ルールが終了したときにエラーがあるかどうかがわかるという特定のケースがあります。運が悪かったのでyyerror( "blah")を試しました。
エラーがあるとは言えないので、別のルールを終了し、reduce/reduceの競合が発生します。片方が無効で、もう片方を見ずに無効になっていることはわかっているが、ユーザーはbcに苦しんでいるので、これは面倒です。このブランチを無視する方法がわかりません。bc無効です。
この問題を解決するにはどうすればよいですか?
c - YACC文法は競合を減らす/減らす
XMLファイルの有効性をチェックするための次の文法があります。ファイルは要素で始まり、次にルートノードです。
1つのreduce/reduce競合が発生していますが、それを見つける方法がわかりません。どんな助けでもいただければ幸いです。
haskell - 幸せ:対立を減らす/減らす
なぜこれが競合の削減/削減に関する警告を発するのか
しかし、次は大丈夫ですか?
bison - バイソンでこの削減/削減の競合を解決するにはどうすればよいですか?
これは[ファイル名]からの抜粋です。出力状態94
opt_at_typeは次のように定義されます。
なぜそれが起こっているのか教えてくれませんか?
bison - EBNF から Bison へ - エラーの削減/削減
この EBNF を bison に変換する必要があります。
割り当て、if、while ステートメント、proc_func_ を変換すると、bison でエラーが発生しません。ただし、これをバイソンで入力すると、複合ステートメントが翻訳されます。
削減/削減エラーがあります。
なぜreduce/reduceエラーがあるのか 、それは私には意味がないので、誰かが私に説明してもらえますか。とても感謝しております。
前もって感謝します。
grammar - 削減-削減の競合を伴う単純なあいまいな文法
論理式を解析するための次の単純な文法は、reduce/reduceの競合を引き起こします。
バイソンからのステータスレポートには次のものがあります。
問題は、「(a)+1<2」の解析方法がわからないことだと思います。この文法をどのように明確にしますか?出来ますか?