Я пытаюсь выбрать все маркеры в тексте и потребности соответствовать всем символам 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)+;
Ничто не подобрано.
Есть ли способ сделать это.
Еще одна вещь, которую нужно учитывать, если Вы планируете использовать Unicode заключается в том, что вы должны установить вариант Charvocabulary
, чтобы сказать, что вы хотите позволить любому символу в диапазоне Unicode 0 через FFFE
options
{
charVocabulary='\u0000'..'\uFFFE';
}
по умолчанию вы обычно видите в примерах это
options
{
charVocabulary = '\3'..'\377';
}
, чтобы покрыть точку, сделанную выше. Как правило, если вам нужен как диапазон символов ASCII «A» .. 'z'
и диапазон Unicode, который вы должны сделать правило Lexer Unicode, как:
'\ ufffe "..' \ Ufffe '
Практически говоря, токен: (Unicode) +
полностью бесполезно.
Поскольку все является символом токена, если вы попытаетесь использовать такое правило, чтобы соответствовать программе Java, скажем, он просто будет соответствовать всей программе и вернуть ее к вам как один большой токен.
Вам действительно нужно нарушать ваши персонажи на разные группы, если вы хотите разделить свой вклад в зависимости от значимых фрагментов.
Это может помочь вам взглянуть на то, как это сделал «плюсы». Вот Грамматика BNF для Java , а вот BNF для идентификатора , который показывает, как они взяли на себя неприятности, чтобы выбрать
identifier
::= "a..z,$,_" { "a..z,$,_,0..9,unicode character over 00C0" }