Эти правила, по сути, одинаковы:
arithexpr
: term (MULOP term)*
;
term : factor (MULOP factor)*
;
Если вы их объедините, вы получите:
arithexpr: factor (MULOP factor)* (MULOP factor (MULOP factor)*)*
, который содержит неопределенность (какой из двух токенов MULOP должен совпадатьпосле начальных factor
?). Но из переписанного легко увидеть, что делать:
arithexpr: factor (MULOP factor)*;
, который заменяет оригинальные правила term
и arithexpr
.