Решение ANTLR может соответствовать вводу, используя несколько альтернатив - PullRequest
8 голосов
/ 31 октября 2011

У меня есть этот простой грамматик:

expr: factor;

factor: atom (('*' ^ | '/'^) atom)*;

atom: INT
    | ':' expr;

INT: ('0'..'9')+

, когда я его запускаю, он говорит:

Решение может соответствовать вводу, например '*', используя несколько альтернатив 1,2

Решение может соответствовать вводу, такому как '/', используя несколько альтернатив 1,2

Я не могу определить неоднозначность.Как указывают красные стрелки?Любая помощь будет оценена.

enter image description here

1 Ответ

7 голосов
/ 31 октября 2011

Допустим, вы хотите проанализировать ввод:

:3*4*:5*6

Синтаксический анализатор, сгенерированный вашей грамматикой, может сопоставить этот вход в следующие деревья разбора:

enter image description here

и

enter image description here

(я опустил двоеточия, чтобы деревья были более четкими)

Обратите внимание, что вы видите только предупреждение. Путем специального указания 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

, который не выдает никакого предупреждения (или ошибки).

...