Допустим, вы хотите проанализировать ввод:
:3*4*:5*6
Синтаксический анализатор, сгенерированный вашей грамматикой, может сопоставить этот вход в следующие деревья разбора:
![enter image description here](https://i.stack.imgur.com/ki3XJ.png)
и
![enter image description here](https://i.stack.imgur.com/praCu.png)
(я опустил двоеточия, чтобы деревья были более четкими)
Обратите внимание, что вы видите только предупреждение. Путем специального указания ANTLR, что (('*' | '/') atom)*
нужно жадно сопоставлять, например:
factor
: atom (options{greedy=true;}: ('*'^ | '/'^) atom)*
;
синтаксический анализатор "знает", какую альтернативу использовать, и предупреждение не выдается.
EDIT
Я проверил грамматику с помощью ANTLR 3.3 следующим образом:
grammar T;
options {
output=AST;
}
parse
: expr EOF!
;
expr
: factor
;
factor
: atom (options{greedy=true;}: ('*'^ | '/'^) atom)*
;
atom
: INT
| ':'^ expr
;
INT : ('0'..'9')+;
А потом из командной строки:
java -cp antlr-3.3.jar org.antlr.Tool T.g
, который не выдает никакого предупреждения (или ошибки).