ANTLR лексер патерн [\ p {Emoji}] + соответствует номерам - PullRequest
1 голос
/ 08 февраля 2020

Шаблон лексера ANTLR4 [\ p {Emoji}] + совпадает с числами. Смотрите скриншот. Обратите внимание, что он правильно отклоняет альфа-символы. Есть ли проблема с шаблоном?

enter image description here

Ответы [ 2 ]

2 голосов
/ 08 февраля 2020

\p{Emoji} соответствует всему, что имеет свойство Unicode Emoji. Числа действительно имеют это свойство, поэтому \p{Emoji} правильно их сопоставляет. Хотя почему?

Стандарт Unicode определяет любую кодовую точку, имеющую свойство Emoji, если она может появляться как часть Emoji. Числа могут появляться как части смайликов (например, я думаю, что фигуры с числами на них, которые по их причине считаются смайликами, состоят из фигуры, сопровождаемой соединением, за которым следует число), поэтому они имеют это свойство.

Если вы хотите сопоставлять только те кодовые точки, которые являются смайликами, вы можете просто использовать свойство Emoji_Presentation. Однако это не будет соответствовать комбинированным смайликам.

Если вы хотите сопоставить любую последовательность, которая создает смайлики, я думаю, вы захотите сопоставить что-то вроде "Emoji_Presentation, за которым следует ноль или более из '( Join_Control или Variation_Selector), за которым следует Emoji '"(здесь вы хотите Emoji вместо Emoji_Presentation, потому что здесь разрешены числа).


Однако для целей разрешив смайлики в идентификаторах (в отличие от правила лексера для сопоставления смайликов и ничего больше), вам на самом деле не нужно беспокоиться о том, является ли число частью смайлика или нет, только то, что оно не появляется в качестве первого символа идентификатора. Таким образом, вы можете просто определить свой фрагмент для начального символа, чтобы он включал только Emoji_Presentation, а затем фрагмент для продолжающихся символов, включающий Emoji, а также Join_Control и Variation_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 голосов
/ 08 февраля 2020

Глядя на код , который, кажется, определяет кодовые точки эмодзи:

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

похоже, что он включает цифры ( почему, я не знаю Зацените отличное объяснение sepp2k). Вы всегда можете поставить вопрос , если считаете, что что-то не так.

Вместо этого вы также можете просто использовать класс символов, подобный этому:

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