У меня такая грамматика:
rule: 'aaa' | 'a' 'a';
Он может успешно проанализировать строку 'aaa', но не может проанализировать 'aa' со следующей ошибкой:
line 1:2 mismatched character '<EOF>' expecting 'a'
К вашему сведению, это проблема лексера, а не парсера, потому что я даже не вызываю парсер. Основная функция выглядит так:
@members {
public static void main(String[] args) throws Exception {
RecipeLexer lexer = new RecipeLexer(new ANTLRInputStream(System.in));
for (Token t = lexer.nextToken(); t.getType() != EOF; t = lexer.nextToken())
System.out.println(t.getType());
}
}
Результат такой же и с более очевидной версией:
rule: AAA | A A;
AAA: 'aaa';
A: 'a';
Очевидно, лексер ANTLR пытается сопоставить входное значение «aa» с правилом AAA, которое не выполняется. Помимо того, что ANTLR является парсером LL (*) или чем-то еще, лексер должен работать отдельно от парсера и уметь разрешать двусмысленность. Грамматика прекрасно работает со старым добрым lex (или flex), но не похоже на ANTLR. Так в чем проблема?
Спасибо за помощь!
a
вместоaaa
, учитывая одинa
в качестве входных данных. - person Dervall   schedule 30.08.2012A=4 AAA=5
Он предпочитаетaaa
a
. И он может анализироватьaaa
иa
, но неaa
. - person K J   schedule 30.08.2012