【问题标题】:Antlr4 radix number grammarAntlr4 基数语法
【发布时间】:2022-01-23 23:27:56
【问题描述】:
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

这似乎有点奇怪。有什么建议可以纠正吗?谢谢!

【问题讨论】:

    标签: numbers antlr4 grammar


    【解决方案1】:

    ANTLR 的词法分析器以非常一致的方式运行:

    • 使用匹配最多字符的词法分析器规则
    • 当 2 条或更多条规则匹配相同数量的字符时,让第一个定义的“赢”

    因此,像1010 这样的输入将始终成为Octals 令牌。是的,它也匹配HexBinDecimals,但Octals 它首先定义。解析器是否在“看到”2# 令牌后尝试匹配 Bin 令牌并不重要:词法分析器独立于解析器运行。

    解决方案:不要尝试在解析器中匹配/创建标记。将它们保存在词法分析器中:

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

    【讨论】:

    • 非常感谢!这真的很有帮助。我正在为 Postscript 编写语法文件。
    猜你喜欢
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    • 2022-01-09
    • 1970-01-01
    • 2014-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多