我正在编写一个可以使用下划线解析数字的令牌,该数字应该以[0-9]中的数字开头。
我做了:
INT: [0-9]+([0-9]|(('_')->channel(HIDDEN)))*
并且它不会跳过我的下划线,包括第一位,比如,_1234
被解析为_1234
而123_4
也被解析为123_4
这让我感到困惑。如果第一种情况只能被[0-9]捕获,那么第一种情况怎么可能没有失败?第二种情况怎么可能无法隐藏下划线?
例如:
1234_56
,我的令牌应返回123456
_1234
,我的令牌应返回1234
答案 0 :(得分:1)
此规则
INT: [0-9]+ ([0-9]|(('_')->channel(HIDDEN)))* ;
由于lexer command placement
命令的位置,将生成-> channel
错误。生成错误意味着生成的词法分析器/解析器不应被视为有效。操作可能是微妙的,非常难以预测。
要生效,该命令必须存在于词法分析器规则的右边缘。它不能简单地嵌入规则中。
最佳建议是使用词法分析器仅接受有效的输入文本(即,而不是尝试将输入文本重写为其他文本形式)。
INT: [0-9]+ ([0-9]|'_')* ;
执行最终输出操作时 - 对解析器规则或树步行者的操作 - INT
令牌值可以转换为所需的输出格式。