跳过数字 antlr4 中的下划线

Skip underscore in numbers antlr4

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

我做到了:

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

它不会为我跳过下划线,包括第一位,例如,_1234 被解析为 _1234 并且 123_4 也被解析为 123_4让我感到困惑。第一个case只能被[0-9]捕获怎么会不失败,第二个case隐藏下划线怎么会失败呢?

例如:

  1. 如果我想捕获1234_56,我的token应该return123456
  2. 如果我想捕获_1234,我的token应该return1234

这条规则

INT: [0-9]+ ([0-9]|(('_')->channel(HIDDEN)))* ;
由于 -> channel 命令的位置,

将生成 lexer command placement 错误。生成错误意味着生成的 lexer/parser 不应被视为有效。操作可以是微妙的,也可以是难以预测的。

为了有效,命令必须存在于词法分析器规则的右边缘。它不能简单地嵌入到规则中。

最好的建议是使用词法分析器只接受有效的输入文本(,不要尝试重写input 文本到其他形式)。

INT: [0-9]+ ([0-9]|'_')* ;

在执行最终的输出操作时——对解析器规则或树遍历器的操作——然后 INT 标记值可以转换为所需的输出形式。

你可以试试python

示例:

INTLIT: ( OCT | HEX | BIN | DEC ) {self.text = self.text.replace('_','')}