Чтобы пройти два раза один и тот же анализатор ANTLR выдает сообщение об ошибке. Это ошибка? - PullRequest
1 голос
/ 05 декабря 2011

Я не уверен, является ли это ошибкой или нет. Но со следующей простой грамматикой ANTLR, которая распознает маркер «программа»,

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

Следующая тестовая установка, которая пытается пройти грамматику ДВАЖДЫ, выдает сообщение об ошибке, хотя она компилирует

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>'

происходит из-за двойного «parser.root ()» testrig, и это сообщение об ошибке исчезает, когда используется только один parser.root ().

Я полагаю, что parser.root () изменяет объект "parser". Если так, то это должно быть ошибкой, верно?

1 Ответ

2 голосов
/ 05 декабря 2011

Вы уже прошли весь путь до конца ввода - ничего не осталось для анализа при повторном вызове.

Возможно, вы найдете setCharStream() или reset() полезных методов.

...