2011-12-12 99 views
0

我有以下ANTLR语法,它是Terrence Parr给出的一个例子。ANTLR语法pred

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

cast: '(' ID ')' ; 

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

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

然而,当我试图解释(a)与原路返回规则,我得到一个MisMatchedToken例外。我问这个问题是因为我有一个更大的语法,我用它来编译器。我在那里遇到了确切的问题。如果我删除了其中一条规则,那么一切正常(当然,除了通过删除规则的输入分析之外),但是当我添加语法谓词时,我会在解析时得到一个错误,即使语法编译(与b完全一样语法)。

任何建议或想法,为什么这可能是?谢谢。

回答

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的任何错误或警告。

0

如果你在ANTLRWorks中遇到这个错误,我会尝试在示例程序中加载语法,看看你是否得到相同的错误。 ANTLRWorks有时可能会对有效输入提供错误。