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 标记。是的,它也匹配 HexBinDecimals,但 Octals 它首先定义。解析器在“看到”2# 标记后是否尝试匹配 Bin 标记并不重要:词法分析器独立于解析器运行。

解决方案:不要尝试在解析器中使用 match/create 标记。将它们保存在词法分析器中:

radix_number
    : Bin
    | Octals
    | Hex
    | Decimals
    ;

Octals: '8#' Octal+;
Hex: '16#' Hexdecimal+;
Bin: '2#' Binary+;
Decimals: '10#' Digit+;