跳过数字 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隐藏下划线怎么会失败呢?
例如:
- 如果我想捕获
1234_56
,我的token应该return123456
- 如果我想捕获
_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('_','')}
我正在编写一个可以解析带下划线的数字的令牌,该数字应以 [0-9] 中的数字开头。
我做到了:
INT: [0-9]+([0-9]|(('_')->channel(HIDDEN)))*
它不会为我跳过下划线,包括第一位,例如,_1234
被解析为 _1234
并且 123_4
也被解析为 123_4
让我感到困惑。第一个case只能被[0-9]捕获怎么会不失败,第二个case隐藏下划线怎么会失败呢?
例如:
- 如果我想捕获
1234_56
,我的token应该return123456
- 如果我想捕获
_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('_','')}