1

演算子の優先順位がない文法を作成しようとしていますが、1つの演算子を使用するか、括弧で囲む必要があります。(簡単にするために、ここでは有効な演算子のリストの代わりに、および代わりにtest使用id|int_literal etcします)。+したがって、たとえば:

test + test ///valid!
(test + test) + test ///valid!
(test + test) + (test + test) /// valid!
test + test + test /// invalid!

backtrack = trueを必要としないこのための文法を書く方法はありますか?ここでは左再帰が実際には意味をなさないと思います。構文述語がどのように役立つかはわかりません。

これが私が持っているものです(必須backtrack=true):

fragment
bexpr : 'test' | '(' cbebr ')';

fragment
cbexpr : bexpr '+' bexpr;

expr : bexpr | cbexpr;
4

1 に答える 1

1

文法からグローバルバックトラックを削除する方法を確認することをお勧めします。

あいまいさは、の両方の選択肢がでexpr始まる可能性があるという事実にありますbexpr。このあいまいさを取り除く必要があります。+重要なのは、それが式全体である場合にのみ、括弧なしで発生するという観察にあります。したがって、最終的には次のようになります。

expr : operand ('+' operand)?;
operand : '(' expr ')' | 'test';

つまり、演算子式がオペランドとして使用される場合は、括弧で囲む必要があります。

于 2012-05-07T02:17:07.877 に答える