Как я соответствую unicode символам в antlr

Я пытаюсь выбрать все маркеры в тексте и потребности соответствовать всем символам 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)+;

Ничто не подобрано.

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

5
задан Bart Kiers 17 January 2010 в 19:24
поделиться

2 ответа

Еще одна вещь, которую нужно учитывать, если Вы планируете использовать Unicode заключается в том, что вы должны установить вариант Charvocabulary , чтобы сказать, что вы хотите позволить любому символу в диапазоне Unicode 0 через FFFE

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

по умолчанию вы обычно видите в примерах это

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

, чтобы покрыть точку, сделанную выше. Как правило, если вам нужен как диапазон символов ASCII «A» .. 'z' и диапазон Unicode, который вы должны сделать правило Lexer Unicode, как: '\ ufffe "..' \ Ufffe '

6
ответ дан 13 December 2019 в 19:27
поделиться

Практически говоря, токен: (Unicode) + полностью бесполезно.

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

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

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

identifier 
  ::= "a..z,$,_" { "a..z,$,_,0..9,unicode character over 00C0" } 
5
ответ дан 13 December 2019 в 19:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: