ANTLR: MismatchedTokenException с похожими литералами - PullRequest
1 голос
/ 10 августа 2010

У меня есть следующее

rule : A B;

A : 'a_e' | 'a';
B : '_b';

Введите:

a_b    //dont work
a_e_b  //works

Почему у лексера проблемы с этим? Когда ANTLR совпадает с 'a_' в 'a_b', не следует ли ему вернуться назад или использовать lookahead или что-то, чтобы увидеть, что он не может соответствовать токену A, а затем решить сопоставить токен A как 'a', а затем перейти к совпадению токена B как '_b'?

Я думаю, что я неправильно понял кое-что о том, как работает antlr. Я попытался прочитать об этом в документе ANTLR и Google. Но у меня мало опыта работы с лексерами и парсерами.

Большое спасибо за любую помощь.

1 Ответ

1 голос
/ 09 декабря 2011

Вам нужно использовать синтаксический предикат, чтобы различать 'a', '_', 'e' и 'b'.

Будет работать следующее:

grammar T;

rule : A B;

B : '_b';
A :     ('a_e')=>'a_e'
    | 'a'  ;

Эторазбирает 'a_e_b' и 'a_b', как вы ожидаете.

Рекомендовать проверить главу 13 «Справочника по ANTLR».

...