2010-01-17 5 views
5

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

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)+; 

Ничего получает соответствие.

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

+3

«\ u0000» .. «\ u00FF» не распространяется на «все символы Юникода», это только охватывает первые 256. –

+0

Это тоже. Я пропустил это! –

+0

Правда, но я думал, что Java еще не поддерживает пятизначный Unicode. – Lezan

ответ

5

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

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

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

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

Чтобы покрыть точку, указанную выше. В общем, если вам необходимо как диапазон 'A'..'Z' символов ASCII и диапазон Юникода вы бы сделать правило юникода лексического анализатора, как: '\u0080'..'\ufffe'

+1

Примечание. Параметр «charVocabulary» недоступен в antlr3, поскольку по умолчанию используется unicode. –

5

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

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

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

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

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