2016-03-28 15 views
0

ANTLR 4.5 gibt mir eine "nicht übereinstimmende Eingabe 'String []' erwartete 'String'", aber ich verstehe nicht, warum die '[]' enthalten sind das Token.ANTLR4 geben nicht übereinstimmende Eingabe wegen Klammern in einem Token enthalten

Ich habe die Grammatik nach unten auf das Nötigste gestrippt, um das Problem zu zeigen:

grammar Test;  
@header 
{ 
package parser; 
} 

mainClass : 'class' ID '{' 'void' 'main' '(' 'String' '[' ']' ID ')' '}' ; 

ID : [a-zA-Z] [a-zA-z0-9]* ; 

WS : [ \t\f\r\n]+ -> channel(HIDDEN); 

Der Eingang ist:

class A 
{ 
    void main(String[] args) 
} 

Wenn ich ‚String []‘ dann die Eingabe erfolgreich analysiert.

Wenn ich die Token aus dem Syntaxbaum ausdrucke, sehen sie alle wie erwartet aus, außer dass 'String []' als ein ID-Token und nicht als 3 separate Tokens angezeigt wird.

Ich habe versucht, die 'String', '[' und ']' Token explizit zu definieren, aber das Ergebnis ist das gleiche.

Ich kann einfach nicht herausfinden, was falsch ist.

+0

Nur was mir in den Sinn kommt, ist, dass deine Lexer-Regeln sich gegenseitig bekämpfen. Versuchen Sie, sie in benannte Regeln zu konvertieren, nicht nur in Literalregeln, und versuchen Sie, mit der Reihenfolge der Regeln zu spielen. – Divisadero

Antwort

0

Versuchen Sie, für jedes Ihrer Token eine Lexer-Regel zu definieren. Ich frage mich, wie Sie Ihren Parser mit dieser Grammatik erzeugen könnten. ANTLR spuckt normalerweise eine Nachricht aus, dass Lexer-Token nicht implizit aus Literalen generiert werden können.

0

Oh die Gefahren zu sehen, was Sie dort erwarten.

Ich habe alle Tokens geändert, um mit demselben Ergebnis explizit zu sein.

Ich änderte dann die ID lexer Regel, um 2 Fragmente zu verwenden, eins für Buchstaben und eins für Ziffer und es funktionierte!

Ich wechselte auf die ursprüngliche Regel zurück und es funktionierte immer noch.

Eine sehr sorgfältige Überprüfung der Version in dieser Frage zeigte, dass das Problem in der ID-Lexer-Regel im Großbuchstabenbereich war. Es hatte A-Z, sollte aber A-Z sein. Der Bereich A-z beinhaltet \[]^_' daher das Problem.