В моей грамматике 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, но, похоже, он влияет только на правила синтаксического анализатора.