У меня есть следующая грамматика:ANTLR лексер не LOOKAHEAD на всех
rule: 'aaa' | 'a' 'a';
Он может успешно разбирать строку «ааа», но он не может разобрать «аа» со следующей ошибкой:
line 1:2 mismatched character '<EOF>' expecting 'a'
FYI, это проблема лексера, а не парсер, потому что я даже не называю синтаксический анализатор. Основная функция выглядит следующим образом:
@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 лексер пытается соответствовать входному «аа» с правилом AAA, который терпит неудачу. Кроме того, ANTLR является парсером LL (*) или что-то еще, лексер должен работать отдельно от анализатора, и он должен иметь возможность разрешать двусмысленность. Грамматика отлично работает с хорошим старым lex (или flex), но это не похоже на ANTLR. Так в чем проблема?
Спасибо за помощь!
Как определить маркеры в вашем лексере? Полагаю, что lexer предпочитает совпадение для 'a' вместо' aaa', учитывая один вход 'a'. – Dervall
ANTLR жадный. –
@Dervall Файл токена выглядит так: 'A = 4 AAA = 5' Он предпочитает' aaa' '' ''. И он может анализировать 'aaa' и' a', но не 'aa'. –