Ниже приведены две грамматики. < /p>
В этой грамматике семантические предикаты выполняют «работу». Т.е. Если они ложные, правила не совпадают, и если они правда, правила соответствуют: < /p>
expr
: term
| expr asterisk expr (asterisk expr)*
| expr plus expr (plus expr)*
;
plus: {_input.LT(1).getText().equals("+")}? SPECID;
asterisk: {_input.LT(1).getText().equals("*")}? SPECID;
term
: ALNUMID
| STRID
| LPAREN expr RPAREN
;
< /code>
И в этой грамматике семантические предикаты не работают. Т.е. Если они ложны, правила по -прежнему совпадают с ошибкой BU. < /p>
expr
: add
| mult
| term
;
mult
: term (asterisk) term ((asterisk) term)*
;
add
: (term|mult) plus (term|mult) (plus (term|mult))*
;
plus: {_input.LT(1).getText().equals("+")}? SPECID;
asterisk: {_input.LT(1).getText().equals("*")}? SPECID;
term
: ALNUMID
| STRID
| LPAREN expr RPAREN
;
< /code>
В обоих случаях я пытаюсь запустить простые тесты для анализа 2 + 2 и 2 * 2. < /p>
Можно ли понять заранее, Уилл Определение работы или нет? Какая здесь логика?
Подробнее здесь: https://stackoverflow.com/questions/794 ... n-they-don