問題解決のシフトを削減紛争私の文法
-
05-09-2019 - |
質問
ようにしていくの小さなパーサと アイロニー.残念ながら私は"シフトを低減い。文法とっては自分の強みは、まだこの小さなブツです。この文法を発生するエラー:
ExpressionTerm := "asd"
LogicalExpression :=
ExpressionTerm |
LogicalExpression "AND" LogicalExpression |
LogicalExpression "OR" LogicalExpression
どのような"シフトの削減紛争"という意味は、なぜでですか?I収集することになっ文法が曖昧できませんねじれを私のロジックを十分に見。
追加: 明らかに-"デルマウスに共通に見られる"は単にリテラル文字列"デルマウスに共通に見られる".ようなので期待以下の表現を構文解析本文:
asd
asd AND asd
asd AND asd OR asd
asd OR asd AND asd OR asd
追加2: 忘れていたと言うことになると、ルートの文法 LogicalExpression
.
加え3: あぁ、わかった!そこで、このような曖昧性のな表現
asd AND asd OR asd
この二つの異なる方法:
(asd AND asd) OR asd
asd AND (asd OR asd)
がなぜです。OK、きのとやがより強くなるその他(たintededるか).そのエラーが表示された場合もありでオペレート可能です。つまり、この製造も行っておりますが同じエラー:
LogicalExpression := "asd" | LogicalExpression "OR" LogicalExpression
この場合にはこれが欲しい:
asd OR asd OR asd
構文解析されること:
(asd OR asd) OR asd
は曖昧ないということが?
追加4: わかった!
LogicalExpression1 := LogicalExpression1 "OR" LogicalExpression2 | LogicalExpression2
LogicalExpression2 := LogicalExpression2 "AND" LogicalExpression3 | LogicalExpression3
LogicalExpression3 := "NOT" LogicalExpression4 | LogicalExpression4
LogicalExpression4 := "asd" | "(" LogicalExpression1 ")"
これを解析しすべての真偽値表現は、演算子の優先順位としていない->や->います。"asd"に置換することができる現象だ。
解決
ごは曖昧で、それに合モーバイルコンピューティングlookahead.例えば、何が"デルマウスに共通に見られる"?でExpressionTermやたが、あまり効果は出なかった。このシフトを低下させる。疑い、削減-低減に紛争が同じことが言えます。
最LL(1)/LALR(1)発電機を提供しまっていることを求めに対シフトの削減紛争送が優先されます。最もデフォルト最長配列の存在下にシフトの削減、紛争で以上にしばしばこれらの無視できます(一部の調査).(この場合においても必要なものの一期の下で動作が正しく行).
他のヒント
シフトの削減紛争の手段と文法が曖昧なものです。ご再帰的ルール、トークン"デルマウスに共通に見られる"と解釈される可能性もあの一部のいずれか ExpressionTerm
または LogicalExpression
とのパーサできな決めてしまいます。必要な追加のルールを打破し、イタリアで作られています。
シフト削減の紛争につくのもお脳の周辺でparsers.最も簡単な方法を説明するためには終了することができますがこの疑似コード
if (a) then
if (b) then
printf('a + b');
else
print('this could be a + !b or !a');
のelse文が結合の場合.の場合は曖昧な文法、通常の定義を示す値の数が予想化-削減の警告に文法を学びます。
また、お客様の利用できるので、LL(k)またはLL(*)パーサです。これらのパーサは少ないシフトを定義しています。ご用途に応じていくにはどのように、LALR(1)パーサです。
文法が曖昧に LL(1)
または LALR(1)
以来、デルマウスに共通に見られるトークンで置換された ExpressionTerm
とも LogicalExpression
カーブを平坦化文法のルールを解決するシフトを紛争