当前位置: 首页 > 知识库问答 >
问题:

ANTLR使特定令牌或规则不区分大小写

云煌
2023-03-14

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

>

  • 将我的输入转换为所有小写。这不起作用,因为我语法的某些部分需要区分大小写。

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

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

    例如:

    SENSITIVETOKEN
    :
        'footoken' 
    ;
    
    INSENSITIVETOKEN
    :
        'bootoken'  (some magic here)
    ;
    

    lexer应该将“BOOTOKEN”识别为不敏感的token,而不是将“FOOTOKEN”识别为敏感的token

    谢谢你的帮助^^

  • 共有1个答案

    钮誉
    2023-03-14

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

    示例:

    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')
    ;
    
     类似资料:
    • 现在我得到了:错误。 我知道我的输入被AND和TERM lexer规则匹配,但我希望能够指定TERM是除与AND规则匹配的内容之外的任何内容。

    • 问题内容: MySQL中是否有任何支持区分大小写的排序规则类型。我在MySQL中使用了所有类型的排序规则,它们的名称末尾都带有_ci,因此它们是不区分大小写的排序规则。 问题答案: 根据MySQL手册http://dev.mysql.com/doc/refman/5.0/en/charset- mysql.html, 您应该能够将排序规则设置为区分大小写。您可以通过执行查询来获取归类列表 经过一点

    • 需要注意的方法是和。实际上,我依赖于这样一个事实,即每个节点最终都分解为终端,因此如果一个节点没有被另一个重写处理(例如中的),那么它的每个终端都将位于中。对的每次调用都会添加到索引字段中,我假定该字段与AST和原始文本同步。也就是说,应该同时表示原始文本中的索引和当前标记的索引。 我最近遇到了一个空白问题。语法规则似乎悄无声息地吃掉了空白,而没有在任何解析器规则中提到它。这会导致空白标记无法通过

    • 我想在一个中央Antlr文件中定义公共令牌常量。这样,我就可以定义几个不同的lexer和parser,并在运行时混合和匹配它们。如果它们都共享一组共同的令牌定义,那么它们就可以正常工作。 换句话说,我想看到公共静态final int WORD=2 ,所以他们都同意“2”是一个单词。 我创建了一个名为CommonTokenDefs的文件。g4并添加了如下部分: 并包括 在我的每一个人身上。g4文件。

    • 在我的代码中,我想区分相等和不相等的大小写。我想知道如何有效地做到这一点。目前,我以以下方式实现访问者: 我不确定这是否非常有效,因为/调用,它基本上循环所有子级。这样做了多次,所以我不确定这是否明智。另外,我调用两次。关于后者,我知道我可以缓存在一个局部变量中,但如果需要考虑多个子规则,这将很快导致相当丑陋的代码。 有没有办法更有效地做到这一点?基于某种令牌标识符或分支标识符的switch/ca

    • 我创建了一个非常简单的类test.java 所以我可以使用编译它,之后,我想使用commond查看测试类内部的细节,但实际上我犯了如下错误: java版本“1.6.0_43” java(TM)SE运行时环境(构建1.6.0_43-B01) java HotSpot(TM)64位服务器VM(构建20.14-B01,混合模式)