&#34;输入不匹配<eof>&#34;语法非常简单

时间:2016-03-19 10:20:45

标签: parsing antlr4

我是ANTLR的新手,我做了以下非常简单的语法:


grammar vsop;
entry:
    program EOF;
program:
    LBRACE RBRACE;

LBRACE : 
    '{';
RBRACE :
    '}';
WS : 
    [ \t\r\n] -> skip;

当我使用输入&#34; {}&#34;进行尝试时,我收到以下错误: 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包含两种方法&#34; enterProgram&#34;和&#34; exitProgram&#34;只做标准输出上的打印件)

值得注意的是,当我调试并查看&#34;令牌&#34;变量,它包含以下ArrayList: <EOF>(似乎正确代表了不同的令牌)。

我已经阅读了很多其他stackoverflow问题,但我仍然不知道为什么我会用这么简单的语法和输入得到这个错误。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

这是为了什么?

tokens.consume();
while(!tokens.get(tokens.index()).getText().equals("EOF"))
    tokens.consume();

据我所知,这没有任何用处。

此代码使用令牌流中的所有令牌,因此解析器不再有任何令牌。解析器看到一个空流(由一个<EOF>令牌组成),因此出现错误。

完全删除它,或者在调用解析器之前调用tokens.reset()将位置重置为流的开头。