我是ANTLR的新手,我做了以下非常简单的语法:
grammar vsop;
entry:
program EOF;
program:
LBRACE RBRACE;
LBRACE :
'{';
RBRACE :
'}';
WS :
[ \t\r\n] -> skip;
当我使用输入" {}"进行尝试时,我收到以下错误:
line 2:0 mismatched input 'EOF' expecting '{'
这是我使用的Java代码:
(其中每个public static void main(String[] args) {
String stringToProcess = "{}"; ANTLRInputStream input = new ANTLRInputStream(stringToProcess); vsopLexer lexer = new vsopLexer(input); CommonTokenStream tokens = new CommonTokenStream(lexer); tokens.consume(); while(!tokens.get(tokens.index()).getText().equals("EOF")) tokens.consume(); vsopParser parser = new vsopParser(tokens); ParseTreeWalker ptw = new ParseTreeWalker(); vsopListenerImpl vl = new vsopListenerImpl(); ParseTree tree = parser.entry(); ptw.walk(vl, tree); }
String stringToProcess = "{}"; ANTLRInputStream input = new ANTLRInputStream(stringToProcess); vsopLexer lexer = new vsopLexer(input); CommonTokenStream tokens = new CommonTokenStream(lexer); tokens.consume(); while(!tokens.get(tokens.index()).getText().equals("EOF")) tokens.consume(); vsopParser parser = new vsopParser(tokens); ParseTreeWalker ptw = new ParseTreeWalker(); vsopListenerImpl vl = new vsopListenerImpl(); ParseTree tree = parser.entry(); ptw.walk(vl, tree); }
实际上是EOF
,其中vsopListenerImpl包含两种方法" enterProgram"和" exitProgram"只做标准输出上的打印件)
值得注意的是,当我调试并查看"令牌"变量,它包含以下ArrayList:
<EOF>
(似乎正确代表了不同的令牌)。
我已经阅读了很多其他stackoverflow问题,但我仍然不知道为什么我会用这么简单的语法和输入得到这个错误。
感谢您的帮助。
答案 0 :(得分:0)
这是为了什么?
tokens.consume();
while(!tokens.get(tokens.index()).getText().equals("EOF"))
tokens.consume();
据我所知,这没有任何用处。
此代码使用令牌流中的所有令牌,因此解析器不再有任何令牌。解析器看到一个空流(由一个<EOF>
令牌组成),因此出现错误。
完全删除它,或者在调用解析器之前调用tokens.reset()
将位置重置为流的开头。