2016-09-30 4 views
2

У меня есть 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; 

Так почему же это, что мой первый блок кода ведет себя иначе, чем два других примеров?

ответ

3

Antlr4 может обрабатывать прямую левую рекурсию, но не косвенную левую рекурсию, где левое рекурсивное правило определяется как правило, которое «прямо или косвенно вызывает себя на левом краю альтернативы» (TDAR; pg 71).

Когда, как и в первом примере, #mathExpression альтернативы вынесена из expression правил, и в отдельную math правило, левая прямая рекурсия становится косвенной, т.е., правила «взаимно левыми-рекурсивные».

Как показано на втором и третьем примерах, типичным решением является простое объединение непрямых леворекурсивных правил в одном правиле.

+0

Не показывает ли первый пример прямую левую рекурсию, что также будет проблемой? У меня нет TDAR, но мне, возможно, придется это получить. –

+0

Antlr4 может обрабатывать прямую левую рекурсию, где рекурсия «вызывает сам» * на левом краю ». Правило 'math' создает косвенную левую рекурсию, поскольку ссылается на * другое * правило на левом краю. Очень рекомендую TDAR. – GRosenberg

+0

Просто просмотрел https://youtu.be/q8p1voEiu8Q?t=38m32s. Я в порядке с «Вот как это» на данный момент. Надеюсь, после прочтения TDAR я лучше пойму, как все работает, а не только * так, как все работает. Спасибо. –

Смежные вопросы