【问题标题】:ANTLR Make specific token or rule case insensitiveANTLR 使特定令牌或规则不区分大小写
【发布时间】:2023-03-12 05:30:02
【问题描述】:

我正在寻找一种在我的 ANLTR 解析器中使某些特定令牌不区分大小写的方法。 我已经尝试过的:

  1. 将我的输入转换为全小写。这对某些人来说不起作用 我的部分语法要求区分大小写。

  2. 保存标记的大写和小写版本。这也不起作用,因为这样我的词法分析器文件变得太大(打破了 ANTLR 的 64k 限制)。

我希望存在一些正则表达式技巧,或者可能是一个 ANTLR 标志,告诉解析器以不同方式处理某些标记。


一个例子:

SENSITIVETOKEN
:
    'footoken' 
;

INSENSITIVETOKEN
:
    'bootoken'  (some magic here)
;

词法分析器应该"BOOTOKEN"识别为INSENSITIVETOKEN
不是 "FOOTOKEN"SENSITIVETOKEN


感谢您的帮助! ^^

【问题讨论】:

    标签: antlr antlr4


    【解决方案1】:

    一种可能的解决方案是声明单字母片段并基于这些片段构造标记。

    例子:

    INSENSITIVETOKEN
    :
        B O O T O K E N
    ;
    
    fragment B: ('B'|'b');
    fragment O: ('O'|'o');
    fragment T: ('T'|'t');
    fragment K: ('K'|'k');
    fragment E: ('E'|'e');
    fragment N: ('N'|'n');
    

    或者,如果不区分大小写的标记不多,只需:

    INSENSITIVETOKEN
    :
        ('B'|'b')('O'|'o')('O'|'o')('T'|'t')('O'|'o')('K'|'k')('E'|'e')('N'|'n')
    ;
    

    【讨论】:

    • 注意:你可以让这个更短,例如fragment B: [bB];
    • 感谢您的快速回答。但是我现在的语法文件大约是 4700 行。我认为我无法手动更改这一切。
    • @JakobSachs,由于这些不区分大小写的规则是语法的一部分,因此您必须更改语法才能获得所需的结果。我认为没有其他解决方案可以实现它。
    • @PavelSmirnov 好的,谢谢。我想我会尝试编写一个自动更改它的脚本。
    猜你喜欢
    • 1970-01-01
    • 2014-10-31
    • 2019-06-19
    • 2018-10-17
    • 2011-02-01
    • 2011-03-18
    • 2011-05-11
    • 2014-05-10
    • 1970-01-01
    相关资源
    最近更新 更多