2013-10-08 4 views
1

Итак, мне было интересно, что делает анализатор, как:Что именно делает грамматические правила левыми рекурсивными в antlr?

line  : expression EOF; 
expression : m_expression (PLUS m_expression)?; 
m_expression: basic (TIMES basic)?; 
basic  : NUMBER | VARIABLE | (OPENING expression CLOSING) | expression; 

леворекурсивным и недействительным, в то время как синтаксический анализатор, как

line  : expression EOF; 
expression : m_expression (PLUS m_expression)?; 
m_expression: basic (TIMES basic)?; 
basic  : NUMBER | VARIABLE | (OPENING expression CLOSING); 

действует и работает, хотя определение «основной» по-прежнему относится к выражению. В частности, я хотел бы быть в состоянии разобрать выражения в виде

a+b+c 

без введения операции, действующие на более чем двух операндов.

ответ

1

вызов вызовов вызовов вызова m_expression вызывает basic, который вызывает выражение ..., которое косвенно остается рекурсивным и плохим как для v3 antlr, так и для v4. Определение левой рекурсии означает, что вы можете вернуться к тому же правилу, не потребляя токен. У вас есть токен OPENING перед выражением во втором экземпляре.