ANTLR: сканирование символов Unicode - PullRequest
5 голосов
/ 03 сентября 2010

Проблема: не удается заставить символ Unicode печатать правильно.

Вот моя грамматика:

options { k=1; filter=true;
 // Allow any char but \uFFFF (16 bit -1)
charVocabulary='\u0000'..'\uFFFE'; 
}

ANYCHAR :'$'
|    '_' { System.out.println("Found underscore: "+getText()); }
|    'a'..'z' { System.out.println("Found alpha: "+getText()); }
|    '\u0080'..'\ufffe' { System.out.println("Found unicode: "+getText()); }
; 

Фрагмент кода основного метода, вызывающего лексер:

public static void main(String[] args) {
SimpleLexer simpleLexer = new SimpleLexer(System.in);
while(true) {
try {
Token t = simpleLexer.nextToken();
System.out.println("Token : "+t);

} catch(Exception e) {}

}
}

Для ввода "ठ" я получаю следующий вывод:

Found unicode: 
Token : ["à",<5>,line=1,col=7]
Found unicode: 
Token : ["¤",<5>,line=1,col=8]
Found unicode:  
Token : [" ",<5>,line=1,col=9]

Похоже, что лексер рассматривает символ Unicode "ठ" как три отдельных символа.Моя цель - отсканировать и напечатать "ठ".

1 Ответ

6 голосов
/ 03 сентября 2010

Ваша проблема не в сгенерированном лексере ANTLR, а в потоке Java, который вы передаете ему. Поток читает только байты (не интерпретирует их в кодировке), и вы видите последовательность UTF-8.

Если его ANTLR 3, вы можете использовать конструктор ANTLRInputStream , который принимает кодирование в качестве параметра:

ANTLRInputStream (InputStream input, String encoding) throws IOException
...