要走两次相同的ANTLR解析器会给出错误消息。这是一个错误吗?

时间:2011-12-05 10:09:51

标签: parsing antlr

我不确定它是否是一个bug。但是使用以下简单的ANTLR语法来识别令牌“程序”,

grammar w;
options{ 
  language = Java;
  ASTLabelType=CommonTree;
}
root : 'program' ;     

以下尝试通过语法TWICE的测试工具虽然编译了

,但仍会显示错误消息
import org.antlr.runtime.*;
import org.antlr.runtime.tree.*;
import antlr.CommonAST;


public class wT{
  public static void main(String[] args) throws Exception {
      wLexer lexer =      new wLexer(new ANTLRStringStream ("program"));
      wParser parser = new wParser(new CommonTokenStream(lexer));
      System.out.println("###Test1");

      parser.root();
      parser.root();
      System.out.println("ok for w.g gramma");

  }
}

ANT调用的错误消息是,

bash-3.2$ ant testrig
Buildfile: /Users/fuzl/while-comp/trunk/_test/build.xml

antlr:

compile:
    [javac] Compiling 1 source file to /Users/fuzl/while-comp/trunk/_test

testrig:
     [java] ###Test1
     [java] ok for w.g gramma
     [java] line 1:7 missing 'program' at '<EOF>'

非常有趣的是,最后一行

     [java] line 1:7 missing 'program' at '<EOF>'

是由于testrig的两次“parser.root()”,当只使用一个parser.root()时,此错误消息消失。

我想parser.root()会更改对象“解析器”。如果是这样,这应该是一个错误,对吗?

1 个答案:

答案 0 :(得分:2)

你已经一直走到输入的末尾 - 当你再次调用它时,没有什么可以解析的。

您可能会发现setCharStream()reset()方法很有用。