Итак, мне было интересно, что делает парсер таким:
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
без введения операций, действующих более чем на два операнда.