跳过数字中的下划线antlr4

时间:2016-10-14 23:08:45

标签: regex antlr4

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

我做了:

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

并且它不会跳过我的下划线,包括第一位,比如,_1234被解析为_1234123_4也被解析为123_4这让我感到困惑。如果第一种情况只能被[0-9]捕获,那么第一种情况怎么可能没有失败?第二种情况怎么可能无法隐藏下划线?

例如:

  1. 如果我要捕获1234_56,我的令牌应返回123456
  2. 如果我要捕获_1234,我的令牌应返回1234

1 个答案:

答案 0 :(得分:1)

此规则

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

将生成-> channel错误。生成错误意味着生成的词法分析器/解析器不应被视为有效。操作可能是微妙的,非常难以预测。

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

最佳建议是使用词法分析器仅接受有效的输入文本(,而不是尝试将输入文本重写为其他文本形式)。

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

执行最终输出操作时 - 对解析器规则或树步行者的操作 - INT令牌值可以转换为所需的输出格式。

相关问题