6 Stimmen

antlr match input mit mehreren Alternativen Fehler

Ich erhalte eine Warnung, wenn antlr v3.1 mit dieser Regel kompiliert

 sentence
:
(CAPITAL_LETTERS_AND_NUMBERS | INT | ANY_WORD ) 
(
    INT
| CAPITAL_LETTERS_AND_NUMBERS
| ANY_WORD 
)*;

Die Warnung lautet:

 5:2: Decision can match input such as "CAPITAL_LETTERS_AND_NUMBERS" using multiple alternatives: 1, 2
 As a result, alternative(s) 2 were disabled for that input
 Semantic predicates were present but were hidden by actions.
 Decision can match input such as "INT" using multiple alternatives: 1, 2
 As a result, alternative(s) 2 were disabled for that input
 Semantic predicates were present but were hidden by actions.

Der Grund dafür, dass ich verwirrt bin, ist die Grammatik, die ziemlich komplex ist, bis ich eine weitere Unterregel an einer anderen Stelle in der Datei einfüge, die ebenfalls Satz verwendet. Es akzeptiert die obige Regel, bis dies geschieht, was seltsam erscheint. Ich bin auf der Suche nach Hinweisen, wie ich am besten vorgehen kann, um das Problem zu beheben und zu verstehen, wie das passieren konnte.

Danke, Richard

10voto

Bart Kiers Punkte 160101

Das ist schwierig. Vor allem bei größeren Grammatiken kann das Ändern (oder Hinzufügen) von Regeln zu Mehrdeutigkeiten führen, die schwer aufzuspüren sind.

ANTLRWorks kann dabei helfen, diese Mehrdeutigkeiten zu finden. Gegeben sei die folgende Grammatik:

grammar T;

parse
  :  other? WORD? EOF
  ;

other
  :  WORD
  ;

WORD
  :  ('a'..'z' | 'A'..'Z')+
  ;

weiß der Parser nicht, wie er mit der parse ordnungsgemäß zu regeln. Eingaben wie foo (eine WORD Token) könnte übereinstimmen mit other EOF y von WORD EOF Das ist der Grund für die Warnung:

Entscheidung kann Eingabe wie "WORD" mit mehreren Alternativen abgleichen

bedeutet.

Die Generierung eines Parsers und eines Lexers unter Verwendung von ANTLRWorks ergibt die folgende Darstellung des Problems:

enter image description here

Ja, mir ist klar, dass dies nur ein triviales Beispiel ist, und dass Ihr Problem ein wenig komplizierter ist, aber es gibt AFAIK hier keinen heiligen Gral. Wenn Sie die Grammatik posten könnten, die einen Parser und Lexer ohne Probleme erzeugt y die bearbeitete Grammatik, die diese Warnungen hervorruft, könnte ich mir ansehen, um zu sehen, ob ich das Problem erkennen kann.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X