Что именно делает правила грамматики леворекурсивными в 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

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


person Sanuuu    schedule 08.10.2013    source источник


Ответы (1)


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

person Terence Parr    schedule 08.10.2013