Antlr4基数语法
Antlr4 radix number grammar
grammar Number;
numbers: (radix_number Whitespace)+;
radix_number
: '2#' Bin
| '8#' Octals
| '16#' Hex
| '10#' Decimals
;
Octals: Octal+;
Hex: Hexdecimal+;
Bin: Binary+;
Decimals: Digit+;
Whitespace
: [ \t\f\r\n]+
;
fragment Digit
: [0-9]
;
fragment Binary
: '0' | '1'
;
fragment Hexdecimal
: [0-9A-Fa-f]
;
fragment Octal
: [0-7]
;
您好,我正在使用上述语法来解析基数。输入“8#12777166 16#0912345678abcdef”有效,但“2#1010 10#1241249”无效并弹出以下错误。
line 1:2 mismatched input '1010' expecting Bin
line 1:10 mismatched input '1241249' expecting Decimals
好像有点奇怪。有什么建议可以纠正吗?谢谢!
ANTLR 的词法分析器以非常一致的方式运行:
- 使用匹配最多字符的词法分析器规则
- 当 2 个或多个规则匹配相同数量的字符时,让第一个定义的规则“获胜”
因此,像 1010
这样的输入将始终成为 Octals
标记。是的,它也匹配 Hex
、Bin
和 Decimals
,但 Octals
它首先定义。解析器在“看到”2#
标记后是否尝试匹配 Bin
标记并不重要:词法分析器独立于解析器运行。
解决方案:不要尝试在解析器中使用 match/create 标记。将它们保存在词法分析器中:
radix_number
: Bin
| Octals
| Hex
| Decimals
;
Octals: '8#' Octal+;
Hex: '16#' Hexdecimal+;
Bin: '2#' Binary+;
Decimals: '10#' Digit+;
grammar Number;
numbers: (radix_number Whitespace)+;
radix_number
: '2#' Bin
| '8#' Octals
| '16#' Hex
| '10#' Decimals
;
Octals: Octal+;
Hex: Hexdecimal+;
Bin: Binary+;
Decimals: Digit+;
Whitespace
: [ \t\f\r\n]+
;
fragment Digit
: [0-9]
;
fragment Binary
: '0' | '1'
;
fragment Hexdecimal
: [0-9A-Fa-f]
;
fragment Octal
: [0-7]
;
您好,我正在使用上述语法来解析基数。输入“8#12777166 16#0912345678abcdef”有效,但“2#1010 10#1241249”无效并弹出以下错误。
line 1:2 mismatched input '1010' expecting Bin
line 1:10 mismatched input '1241249' expecting Decimals
好像有点奇怪。有什么建议可以纠正吗?谢谢!
ANTLR 的词法分析器以非常一致的方式运行:
- 使用匹配最多字符的词法分析器规则
- 当 2 个或多个规则匹配相同数量的字符时,让第一个定义的规则“获胜”
因此,像 1010
这样的输入将始终成为 Octals
标记。是的,它也匹配 Hex
、Bin
和 Decimals
,但 Octals
它首先定义。解析器在“看到”2#
标记后是否尝试匹配 Bin
标记并不重要:词法分析器独立于解析器运行。
解决方案:不要尝试在解析器中使用 match/create 标记。将它们保存在词法分析器中:
radix_number
: Bin
| Octals
| Hex
| Decimals
;
Octals: '8#' Octal+;
Hex: '16#' Hexdecimal+;
Bin: '2#' Binary+;
Decimals: '10#' Digit+;