У меня есть expression
, это коллекция моих других вещей на верхнем уровне. В expression
У меня есть math
, то есть expression (op) expression
. С этим яКогда/Почему в Antlr происходит взаимная левая рекурсия?
следующие наборы правил взаимно левой рекурсивный [выражение, математика]
compileUnit : expression EOF;
expression
: parens
| operation
| math
| variable
| number
| comparisonGroup
;
math : expression op=(ADD | SUBSTRACT | MULTIPLY | DIVIDE) expression #mathExpression;
ОДНАКО!
Это не проблемно
expression
: parens
| operation
| expression op=(ADD | SUBSTRACT | MULTIPLY | DIVIDE) expression
| variable
| number
| comparisonGroup
;
И ни это -
math : op=(ADD | SUBSTRACT | MULTIPLY | DIVIDE) expression expression #mathExpression;
Так почему же это, что мой первый блок кода ведет себя иначе, чем два других примеров?
Не показывает ли первый пример прямую левую рекурсию, что также будет проблемой? У меня нет TDAR, но мне, возможно, придется это получить. –
Antlr4 может обрабатывать прямую левую рекурсию, где рекурсия «вызывает сам» * на левом краю ». Правило 'math' создает косвенную левую рекурсию, поскольку ссылается на * другое * правило на левом краю. Очень рекомендую TDAR. – GRosenberg
Просто просмотрел https://youtu.be/q8p1voEiu8Q?t=38m32s. Я в порядке с «Вот как это» на данный момент. Надеюсь, после прочтения TDAR я лучше пойму, как все работает, а не только * так, как все работает. Спасибо. –