Разбор выражений с подвыражениями в ANTLR

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

(a + (b + C))

or

((a + b))

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

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

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

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

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


person Olhovsky    schedule 07.04.2011    source источник
comment
Не смотрите внимательно на сообщение, на которое вы ссылаетесь: оно изобилует ложной информацией, а грамматика, опубликованная OP, даже близко не соответствует допустимой грамматике ANTLR. Я поражен, что вам удалось откопать этот старый (неправильный!) Вопросы и ответы, в то время как совсем недавно были опубликованы и другие (например: этот или этот ориентирован на C#).   -  person Bart Kiers    schedule 07.04.2011
comment
Или этот: bkiers.blogspot.com/2011/03/ 2-introduction-to-antlr.html   -  person Kobi    schedule 07.04.2011


Ответы (1)


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

parse
  :  addExp EOF
  ;

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

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

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

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

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


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

((a / b)) - x

следующее:

введите здесь описание изображения


и ввод:

(a * (b + C))

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

введите здесь описание изображения

person Bart Kiers    schedule 07.04.2011