我正在编写一个标记,可以用下划线解析数字,数字应该以[0-9]中的数字开头。
我:
INT: [0-9]+([0-9]|(('_')->channel(HIDDEN)))*
,它不会为我跳过下划线,包括第一个地方,比如,_1234
被解析为_1234
, 123_4
也被解析为123_4
,这让我感到困惑。当它只能被[0-9]捕获时,第一种情况怎么可能不失败,第二种情况怎么可能因为隐藏下划线而失败?
例如:
- 如果我想捕获
1234_56
,我的令牌应该返回123456
- 如果我想捕获
_1234
,我的令牌应该返回1234
此规则
INT: [0-9]+ ([0-9]|(('_')->channel(HIDDEN)))* ;
由于-> channel
命令的位置,将生成lexer command placement
错误。生成错误意味着生成的词法分析器/解析器不应该被认为是有效的。操作可以是微妙的,也可以是不可预测的。
要有效,该命令必须存在于词法分析器规则的右边缘。它不能简单地嵌入到规则中。
最好的建议是使用词法分析器只接受有效的输入文本(即:,而不是尝试将输入文本重写为其他形式)。INT: [0-9]+ ([0-9]|'_')* ;
在执行最终的输出操作时——解析器规则或树漫步器上的操作——INT
令牌值可以转换为所需的输出形式。
你可以用python试试
的例子:
INTLIT: ( OCT | HEX | BIN | DEC ) {self.text = self.text.replace('_','')}