Antlr (лексер): соответствие правильному токену - PullRequest
2 голосов
/ 12 октября 2010

В моей грамматике Antlr3 у меня есть несколько «перекрывающихся» правил лексера, например:

NAT: ('0' .. '9')+ ;
INT: ('+' | '-')? ('0' .. '9')+ ;
BITVECTOR: ('0' | '1')* ;

Хотя токены типа 100110 и 123 могут соответствовать более чем одному из этих правил, всегда определяется контекстом, каким из них оно должно быть. Пример:

s: a | b | c ;
a: '<' NAT '>' ;
b: '{' INT '}' ;
c: '[' BITVECTOR ']' ;

Ввод {17} должен затем соответствовать {, INT и } , но лексер уже решил, что 17 - это NAT-токен. Как я могу предотвратить это поведение? Параметр backtrack уже установлен в значение true, но, похоже, он влияет только на правила синтаксического анализатора.

1 Ответ

3 голосов
/ 12 октября 2010

Может быть сложный способ сделать лексер контекстно-зависимым, но в целом это то, что вы хотите, чтобы парсер позаботился, и вы хотите, чтобы ваш лексер просто предоставлял поток токенов. Я рекомендую реорганизовать ваш лексер так, чтобы он возвращал DIGITS и SIGN и позволить вашему анализатору определить, какое число цифры представляют в контексте.

...