Грамматика ANTLR, которая ведет себя странно

#parsing #antlr #grammar

#синтаксический анализ #antlr #грамматика

Вопрос:

Я не понимаю, почему следующая грамматика antlr не генерирует дерево для ввода «b b b», но она генерирует дерево для ввода «a a a»

 statement
  |
a a a 
 

У вас есть какие-то идеи? Спасибо.

 grammar Test2;

options {
  language = Java;
}

statement: ( a|b )*;

a: 'a';

b: 'b';

WS: ('n'|' '|'t'|'r'|'f')  {$channel=HIDDEN;};
 

Может ли кто-нибудь попробовать это в плагине ANTLR IDE eclipse
http://antlrv3ide.sourceforge.net /

В моем Eclipse она ведет себя странно, как я сообщал выше.

Ответ №1:

Он распознает оба "a a a" и "b b b" , как и должно быть. Чтобы проверить это самостоятельно, добавьте в свое правило небольшую инструкцию debug-print statement :

 grammar Test2;

options {
  language = Java;
}

statement: ( a|b )* {System.out.println("parsed: "   $text);};

a: 'a';

b: 'b';

WS: ('n'|' '|'t'|'r'|'f')  {$channel=HIDDEN;};
 

а затем протестируйте анализатор со следующим классом:

 import org.antlr.runtime.*;

public class Main {
  public static void main(String[] args) throws Exception {
    Test2Lexer lexer = new Test2Lexer(new ANTLRStringStream(args[0]));
    Test2Parser parser = new Test2Parser(new CommonTokenStream(lexer));
    parser.statement();
  }
}
 

После генерации лексера и синтаксического анализатора и компиляции всех .java исходных файлов:

 java -cp antlr-3.3.jar org.antlr.Tool Test2.g
javac -cp antlr-3.3.jar *.java
 

вы можете протестировать анализатор с "a a a" помощью ввода as:

 java -cp .:antlr-3.3.jar Main "a a a"
parsed: a a a
 

и с "b b b" вводом в качестве:

 java -cp .:antlr-3.3.jar Main "b b b"
parsed: b b b
 

Как вы можете видеть, в обоих случаях сообщение об ошибке не выдается, и входные данные выводятся обратно на консоль.

Я предполагаю, что вы используете интерпретатор ANTLRWorks. Не делайте этого. Общеизвестно, что она глючит. Либо используйте отладчик ANTLRWorks (это здорово!), Либо используйте небольшой тестовый класс, который вы пишете сами (похожий на мой Main класс).

Редактировать

Обратите внимание, что плагин ANTLR IDE Eclipse использует интерпретатор от ANTLRWorks, AFAIK.

Комментарии:

1. Вы правы, Барт. Спасибо. В этом случае интерпретатор ANTLRWorks глючит.

2. @Bart: Просто наткнулся на этот ответ. Спасибо за указатель на ANTLRWorks: запуск моего тестового примера, который не удался в ANTLRWorks, отлично работал с сгенерированным анализатором. Не могу поверить, сколько времени я потратил впустую — было бы лучше, если бы интерпретатор в ANTLRWorks был просто отключен, чтобы предотвратить эту путаницу!