我有以下ANTLR语法,以Terrence Parr为例。
grammar b;
backtrack
: (cast ';')=> cast ';'
| (e ';')=> e ';'
| e '.'
;
cast: '(' ID ')' ;
e : '(' e ')'
| ID
;
ID : 'a'..'z'+ ;
但是,当我尝试用回溯规则解释(a)
时,我得到一个MisMatchedToken异常。我问这个问题是因为我有一个更大的语法,我用它来编译器。我有确切的问题。如果我删除其中一个规则一切正常(当然,删除规则的输入解析除外)但是当我添加语法谓词时,我解析时会出错,即使语法编译(与b完全一样)语法)。
为什么会出现这样的建议或想法?谢谢。
答案 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有时会在有效输入上给出错误。