Antlr(lexer):匹配正确的令牌

时间:2010-10-11 21:47:19

标签: antlr lexer token ambiguous

在我的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 个答案:

答案 0 :(得分:3)

可能有一种复杂的方法可以使词法分析器对上下文敏感,但总的来说,这就是你希望解析器能够处理的内容,并且你希望你的词法分析器只提供一个令牌流。我的建议是重构你的词法分析器以返回DIGITSSIGN,并让你的解析器计算出上下文代表数字的数字。