Разбор выражений с подвыражениями в ANTLR - PullRequest
1 голос
/ 07 апреля 2011

Я пытаюсь разобрать рекурсивные выражения в ANTLR, такие как:

(a + (b + C))

или

((a + b))

Я прочитал это предполагаемое решение: Грамматика ANTLR для выражений

Однако, когда я пытаюсь создать правило, такое как:

ParenthesisExpression: '(' (ParenthesisExpression | Expression) ')';

ANTLR жалуется, что "Rule ParenthesisExpression является леворекурсивным".

Как я могу разобрать выражения, которыеможет иметь внутри себя подвыражения одинаковой формы?

1 Ответ

4 голосов
/ 07 апреля 2011

Вы можете сделать что-то вроде этого:

parse
  :  addExp EOF
  ;

addExp
  :  multExp (('+' | '-') multExp)*
  ;

multExp
  :  atom (('*' | '/') atom)*
  ;

atom
  :  ID
  |  '(' addExp ')'
  ;

ID    : 'a'..'z' | 'A'..'Z';

Чем ближе вы подходите к правилу atom, тем выше приоритет: поэтому + и - имеют наименьший приоритет, за которыми следуют * и / и, наконец, ID и ( ... ) имеет наивысший приоритет.


Анализирует ввод:

((a / b)) - x

следующим образом:

enter image description here


и ввод:

(a * (b + C))

анализируется как:

enter image description here

...