跳过数字antlr4中的下划线



我正在编写一个标记,可以用下划线解析数字,数字应该以[0-9]中的数字开头。

我:

INT: [0-9]+([0-9]|(('_')->channel(HIDDEN)))*

,它不会为我跳过下划线,包括第一个地方,比如,_1234被解析为_1234, 123_4也被解析为123_4,这让我感到困惑。当它只能被[0-9]捕获时,第一种情况怎么可能不失败,第二种情况怎么可能因为隐藏下划线而失败?

例如:

  1. 如果我想捕获1234_56,我的令牌应该返回123456
  2. 如果我想捕获_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('_','')}

相关内容

  • 没有找到相关文章

最新更新