"Mismatched input <EOF>" 语法非常简单
"Mismatched input <EOF>" with very simple grammar
我是 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) {</p>
<pre><code> 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
实际上是 <EOF>
并且 vsopListenerImpl 包含两个方法 "enterProgram" 和 "exitProgram" 只在标准输出上打印)
值得注意的是,当我调试并查看 "tokens" 变量时,它包含以下 ArrayList:
[[@0,0:0='{',<1>,1:0], [@1,1:1='}',<2>,1:1], [@2,2:1='EOF',<-1>,1:2]]
(这似乎正确地代表了不同的标记)。
我已经阅读了很多其他 Whosebug 问题,但我仍然不知道为什么使用如此简单的语法和输入会出现此错误。
感谢您的帮助。
这是做什么用的?
tokens.consume();
while(!tokens.get(tokens.index()).getText().equals("EOF"))
tokens.consume();
据我所知,这没有任何用处。
这段代码消耗了令牌流中的所有令牌,因此没有更多的令牌留给解析器。解析器看到一个空流(由单个 <EOF>
标记组成),因此出现错误。
完全删除它或调用 tokens.reset()
以在调用解析器之前将位置重置为流的开头。
我是 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) {</p>
<pre><code> 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
实际上是 <EOF>
并且 vsopListenerImpl 包含两个方法 "enterProgram" 和 "exitProgram" 只在标准输出上打印)
值得注意的是,当我调试并查看 "tokens" 变量时,它包含以下 ArrayList:
[[@0,0:0='{',<1>,1:0], [@1,1:1='}',<2>,1:1], [@2,2:1='EOF',<-1>,1:2]]
(这似乎正确地代表了不同的标记)。
我已经阅读了很多其他 Whosebug 问题,但我仍然不知道为什么使用如此简单的语法和输入会出现此错误。
感谢您的帮助。
这是做什么用的?
tokens.consume();
while(!tokens.get(tokens.index()).getText().equals("EOF"))
tokens.consume();
据我所知,这没有任何用处。
这段代码消耗了令牌流中的所有令牌,因此没有更多的令牌留给解析器。解析器看到一个空流(由单个 <EOF>
标记组成),因此出现错误。
完全删除它或调用 tokens.reset()
以在调用解析器之前将位置重置为流的开头。