ANTLR: сканирование символов Юникода



Проблема: не удается получить символ 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]


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

443   1  

1 ответ:

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

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

ANTLRInputStream (InputStream input, String encoding) throws IOException

Comments

    Ничего не найдено.