Frage

Ich habe eine einfache ANTLR Grammatik, die ich gestrippt auf das Wesentliche nach unten, dieses Problem zu demonstrieren, ich habe. Ich verwende ANTLRWorks 1.3.1.

grammar sample;

assignment  :  IDENT ':=' NUM ';' ;

IDENT       :  ('a'..'z')+ ;

NUM         :  ('0'..'9')+ ;

WS          :  (' '|'\n'|'\t'|'\r')+ {$channel=HIDDEN;} ;

Offensichtlich ist diese Aussage durch die Grammatik akzeptiert wird:

x := 99;

Aber auch dieser ist:

x := @!$()()%99***;

Die Ausgabe des ANTLRWorks Interpreter:


(Quelle: barry bei cs.sierracollege.edu )

Was mache ich falsch? Auch andere Proben Grammatiken, die mit ANTLR (wie die Cminus Grammatik) kommen zeigen dieses Verhalten.

War es hilfreich?

Lösung

Wenn Sie an der Konsole Ihres ANTLRWorks IDE aussehen, werden Sie eine Menge von Lexer Fehler sehen.

Versuchen Sie es auf der Kommandozeile:

grammar Sample;

@members {
  public static void main(String[] args) throws Exception {
    ANTLRStringStream in = new ANTLRStringStream("x := @!$()()\%99***;");
    SampleLexer lexer = new SampleLexer(in);
    CommonTokenStream tokens = new CommonTokenStream(lexer);
    SampleParser parser = new SampleParser(tokens);
    parser.assignment();
  }
}

assignment  :  IDENT ':=' NUM ';' ;

IDENT       :  ('a'..'z')+ ;

NUM         :  ('0'..'9')+ ;

WS          :  (' '|'\n'|'\t'|'\r')+ {$channel=HIDDEN;} ;

und dann:

// generate parser/lexer
java -cp antlr-3.2.jar org.antlr.Tool Sample.g

// compile
javac -cp antlr-3.2.jar *.java

// run Windows
java -cp .;antlr-3.2.jar SampleParser
// or run *nix/MacOS
java -cp .:antlr-3.2.jar SampleParser

erzeugt:

line 1:5 no viable alternative at character '@'
line 1:6 no viable alternative at character '!'
line 1:7 no viable alternative at character '$'
line 1:8 no viable alternative at character '('
line 1:9 no viable alternative at character ')'
line 1:10 no viable alternative at character '('
line 1:11 no viable alternative at character ')'
line 1:12 no viable alternative at character '%'
line 1:15 no viable alternative at character '*'
line 1:16 no viable alternative at character '*'
line 1:17 no viable alternative at character '*'
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top