【问题标题】:ANTLR lexer patern [\p{Emoji}]+ is matching numbersANTLR 词法分析器模式 [\p{Emoji}]+ 匹配数字
【发布时间】:2020-02-08 09:00:30
【问题描述】:

ANTLR4 词法分析器模式 [\p{Emoji}]+ 匹配数字。见截图。请注意,它正确拒绝 alpha 字符。模式有问题吗?

【问题讨论】:

    标签: antlr antlr4 lexer


    【解决方案1】:

    \p{Emoji} 匹配具有 Unicode Emoji 属性的所有内容。数字确实具有该属性,因此\p{Emoji} 匹配它们是正确的。为什么呢?

    Unicode 标准将任何代码点定义为具有 Emoji 属性,前提是它可以作为 Emoji 的一部分出现。数字可以作为表情符号的一部分出现(例如,我认为上面有数字的形状,因为它们算作表情符号,由一个形状,后跟一个连接,然后是数字组成),所以它们具有该属性。

    如果您只想匹配本身就是表情符号的代码点,则可以改用Emoji_Presentation 属性。但是,这将无法匹配组合的表情符号。

    如果你想匹配任何创建表情符号的序列,我想你会想匹配类似“Emoji_Presentation,后跟零个或多个'(Join_ControlVariation_Selector),然后是@987654327 @'"(这里你需要Emoji 而不是Emoji_Presentation,因为那是允许数字的地方)。


    但是,为了在标识符中允许表情符号(与词法分析器规则匹配表情符号相反),您实际上不必担心数字是否是表情符号的一部分,仅此而已它不会作为标识符的第一个字符出现。因此,您可以简单地将起始字符的片段定义为仅包含Emoji_Presentation,然后将后续字符的片段定义为包含Emoji 以及Join_ControlVariation_Selector

    所以这样的事情会起作用:

    fragment IdStart
        : [_\p{Alpha}\p{General_Category=Other_Letter}\p{Emoji_Presentation}]
        ;
    
    fragment IdContinue
        : IdStart
        // The `\p{Number}` might be redundant, I'm not sure. I don't know
        // whether there are any (non-ascii) numeric codepoints that don't
        // also have the `Emoji` property.
        | [\p{Number}\p{Emoji}\p{Join_Control}\p{Variation_Selector}]
        ;
    
    Identifier: IdStart IdContinue*;
    

    当然,这是假设您实际上想要允许除表情符号之外的字符。您问题中的定义仅包括表情符号(或者无论如何都包含),但由于它被称为Identifier,我假设您只是删除了其他允许的类别以简化它。

    【讨论】:

    • 感谢您的详细解释。我没有意识到有使用数字作为连接对的组成部分的表情符号,但这很有意义。您的解释使我能够更正我的词法分析器规则。非常感谢您的宝贵时间。
    【解决方案2】:

    看看the code 似乎定义了表情符号代码点:

    UnicodeSet emojiRKUnicodeSet = new UnicodeSet("[\\p{GCB=Regional_Indicator}\\*#0-9\\u00a9\\u00ae\\u2122\\u3030\\u303d]");
    

    它看起来包含数字(为什么,我不知道,请查看 sepp2k 的出色解释)。 如果您认为有问题,可以随时raise an issue

    您也可以只使用这样的字符类:

    Identifier
     : [\u00a9\u00ae\u2000-\u3300\ud83c\ud000-\udfff\ud83d\ud000-\udfff\ud83e\ud000-\udfff]+
     ;
    

    【讨论】:

    • 我没有注意到他们设置定义中的错误。谢谢指点!回复:定义我自己的模式 - 是的,但我更喜欢使用命名属性方法。该集合由作者维护,使用 Unicode 更改等进行更新。
    • @dleuck 这不是一个错误,它与 Unicode 标准所说的完全一致。 Unicode 标准只是对 Emoji 属性的定义有些混乱。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多