Как мне сопоставить символы юникода в antlr - PullRequest
5 голосов
/ 17 января 2010

Я пытаюсь выделить все токены в тексте, и мне нужно сопоставить все символы Ascii и Unicode, вот как я их выложил.

fragment CHAR     :  ('A'..'Z') | ('a'..'z');
fragment DIGIT    :  ('0'..'9');
fragment UNICODE  :  '\u0000'..'\u00FF';

Теперь, если я напишу свое правило токена как:

TOKEN  :  (CHAR|DIGIT|UNICODE)+;

Я получаю «Решение может соответствовать вводу, такому как« 'A' .. 'Z' », используя несколько альтернатив: 1, 3 В результате альтернатива (ы) 3 были отключены для этого входа " «Решение может соответствовать вводу, такому как« 0 ».. 9», используя несколько альтернатив: 2, 3 В результате альтернатива (ы) 3 были отключены для этого входа "

И ничто не соответствует: А также если я напишу это как

TOKEN  :  (UNICODE)+;

Ничто не соответствует.

Есть ли способ сделать это.

Ответы [ 2 ]

6 голосов
/ 19 января 2010

Еще одна вещь, которую следует учитывать, если вы планируете использовать Unicode, это то, что вы должны установить опцию charvocabulary, чтобы сказать, что вы хотите разрешить любой символ в диапазоне Unicode от 0 до FFFE

options
{
charVocabulary='\u0000'..'\uFFFE';
}

Значение по умолчанию, которое вы обычно видите в примерах:

options
{
charVocabulary = '\3'..'\377';
}

Для того, чтобы охватить вышеизложенное.Обычно, если вам нужен диапазон символов ascii 'A'..'Z' и диапазон юникода, вы можете создать правило лексера юникода, например: '\u0080'..'\ufffe'

5 голосов
/ 17 января 2010

На практике TOKEN: (UNICODE)+ совершенно бесполезен.

Поскольку все является символом токена, если вы попытаетесь использовать такое правило для сопоставления с программой Java, скажем, оно просто сопоставит всю программу и вернет его вам как один большой токен.

Вам действительно нужно разбить персонажей на разные группы, если вы хотите разделить входные данные на осмысленные фрагменты.

Это может помочь вам взглянуть на то, как "профи" сделали это. Вот грамматика BNF для Java , а вот BNF для идентификатора , который показывает, как они потрудились сгруппировать

identifier 
  ::= "a..z,$,_" { "a..z,$,_,0..9,unicode character over 00C0" } 
...