【问题标题】:ANTLR syntactic predANTLR 语法预测
【发布时间】:2011-12-12 20:37:52
【问题描述】:

我有以下由 Terrence Parr 作为示例给出的 ANTLR 语法。

grammar b;
backtrack
   :    (cast ';')=> cast ';'
   |   (e ';')=>    e ';'
   |                e '.'
   ;

cast:   '(' ID ')' ;

e   :   '(' e ')'
    |   ID
;

ID  :   'a'..'z'+ ;

但是,当我尝试使用回溯规则解释 (a) 时,我得到了一个 MisMatchedToken 异常。我问这个问题是因为我有一个更大的语法用于编译器。我有确切的问题。如果我删除其中一个规则,一切正常(当然,除了通过删除的规则进行的输入解析),但是当我添加语法谓词时,我在解析时遇到错误,即使语法编译(与 b 完全一样语法)。

任何建议或想法为什么会这样?谢谢。

【问题讨论】:

    标签: antlr


    【解决方案1】:

    ANTLRWorks 中的解释器出了名的漏洞百出,根本不处理任何类型的谓词。所以不要使用它。

    请注意,您说您解析了"a()",但不会正确解析。解析器会抱怨它缺少"."。我猜你的意思是你在解析"a();"

    如果您运行以下演示:

    grammar b;
    
    @parser::members {
      public static void main(String[] args) throws Exception {
        bLexer lexer = new bLexer(new ANTLRStringStream("(a);"));
        bParser parser = new bParser(new CommonTokenStream(lexer));
        parser.backtrack();
      }
    }
    
    backtrack
     : (cast ';')=> cast ';' {System.out.println("cast");}
     | (e ';')=>    e ';'    {System.out.println("e");}
     |              e '.'
     ;
    
    cast
     : '(' ID ')' 
     ;
    
    e
     : '(' e ')'
     | ID
     ;
    
    ID : 'a'..'z'+ ;
    

    通过执行:

    java -cp antlr-3.3.jar org.antlr.Tool b.g
    javac -cp antlr-3.3.jar *.java
    java -cp .:antlr-3.3.jar bParser

    (在 Windows 上,最后一条命令应如下所示:java -cp .;antlr-3.3.jar bParser

    您会看到cast 正在打印到控制台,而没有来自 ANTLR 的任何错误或警告。

    【讨论】:

      【解决方案2】:

      如果您在 ANTLRWorks 中遇到此错误,我会尝试在示例程序中加载语法,看看您是否遇到相同的错误。 ANTLRWorks 有时会在有效输入时出错。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多