私は演算子の優先順位を持たない文法を作ろうとしていますが、1つの演算子を使うか、かっこで囲むかのどちらかが必要です。 (簡略化のために有効な演算子のリストの代わりにid|int_literal etc
と+
の代わりにtest
を使用)。したがって、たとえば:backtrack = trueを使用せずにこれを解決するにはどうすればよいですか?
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;
しかし、 '+'の重複がなければこれを行う方法はありますか?より多くの演算子がある場合、長いリストを2回複製することは醜いものになります。 –
'(テスト)'は有効ですか? –
はい。それは有効です。 –