代码之家  ›  专栏  ›  技术社区  ›  Barry Brown

Antlr-Lexer不匹配标记

  •  1
  • Barry Brown  · 技术社区  · 15 年前

    我有一个简单的Antlr语法,我已经把它简化到了最基本的部分来演示我遇到的这个问题。我正在使用AntlWorks 1.3.1。

    grammar sample;
    
    assignment  :  IDENT ':=' NUM ';' ;
    
    IDENT       :  ('a'..'z')+ ;
    
    NUM         :  ('0'..'9')+ ;
    
    WS          :  (' '|'\n'|'\t'|'\r')+ {$channel=HIDDEN;} ;
    

    显然,这种说法被语法所接受:

    x := 99;
    

    但这一个也是:

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

    AntlWorks解释器的输出:

    ANTLR Interpreter diagram http://cs.sierracollege.edu/~barry/antlr-lexer.png

    我做错什么了?即使是其他与antlr一起提供的示例语法(例如cminus语法)也会表现出这种行为。

    1 回复  |  直到 15 年前
        1
  •  2
  •   Bart Kiers    15 年前

    如果您查看AntlWorks IDE的控制台,您将看到很多lexer错误。

    在命令行中尝试:

    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;} ;
    

    然后:

    // 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
    

    将产生:

    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 '*'