ANTLR句法pred

时间:2011-12-12 20:37:53

标签: antlr

我有以下ANTLR语法,以Terrence Parr为例。

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

cast:   '(' ID ')' ;

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

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

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

为什么会出现这样的建议或想法?谢谢。

2 个答案:

答案 0 :(得分: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的任何错误或警告。

答案 1 :(得分:0)

如果你在ANTLRWorks中遇到这个错误,我会尝试在示例程序中加载语法,看看你是否得到了同样的错误。 ANTLRWorks有时会在有效输入上给出错误。