"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() 以在调用解析器之前将位置重置为流的开头。