ANTLR грамматика, которая ведет себя странно - PullRequest
3 голосов
/ 30 октября 2011

Я не понимаю, почему следующая грамматика 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/

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

1 Ответ

5 голосов
/ 30 октября 2011

Он распознает как "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" в качестве ввода:

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 классу).

EDIT

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

...