ANTLR Как создать переписывание правила перезаписи на значение метода? - PullRequest
2 голосов
/ 20 декабря 2011

Я пытаюсь создать текст узла перезаписи правил перезаписи в возвращаемое значение метода.

Но когда я использую правило переписывания, анализатор анализирует только первый узел, а затем останавливается без каких-либо исключений. Без парсера правила перезаписи работает нормально.

Вот мой неработающий пример:

grammar test01;

options
{
    output=AST; 
}

@members{
  public String MyTestFun(){
    return "test";
  }
}

test : id+;

   id   : ID -> {MyTestFun()}; // With this rule only first node is parsed
// id   : ID -> {"test"};      // and with this rule too

ID   : ('a'..'z')+;

Итак, вопрос в том, как создать текст перезаписи правила перезаписи правила для значения метода?

1 Ответ

0 голосов
/ 20 декабря 2011

Нельзя поместить String справа от стрелки перезаписи -> между { ... }.Это должен быть экземпляр Tree (CommonTree является значением по умолчанию).

Это работает:

grammar test01;

options {
  output=AST;
}

@members{
  public CommonTree myTestFun(){
    CommonToken token = new CommonToken(ID, "test");
    return new CommonTree(token);
  }

  public static void main(String[] args) throws Exception {
    test01Lexer lexer = new test01Lexer(new ANTLRStringStream("foo"));
    test01Parser parser = new test01Parser(new CommonTokenStream(lexer));
    CommonTree tree = (CommonTree)parser.test().getTree();
    System.out.println(tree.toStringTree());
  }
}

test : id+;
id   : ID  -> {myTestFun()};

ID   : ('a'..'z')+;

Если вы сейчас запускаете демонстрацию, выполнив:

java -cp antlr-3.3.jar org.antlr.Tool test01.g
javac -cp antlr-3.3.jar *.java
java -cp .:antlr-3.3.jar test01Parser

(в Windows последняя команда: java -cp .;antlr-3.3.jar test01Parser)

вывод test выводится на консоль.

Обратите внимание, чтоесли вы измените тип возвращаемого значения myTestFun() на CommonToken, вы получите исключение приведения класса:

Исключение в потоке "main" java.lang.ClassCastException: org.antlr.runtime.CommonToken нельзя преобразовать в org.antlr.runtime.tree.Tree

Когда у вас есть output=AST внутри вашего options { ... }, вы должны использовать экземпляр Tree.

...