2010-09-02 18 views
4

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

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

+1

не связанных с вашей проблемой, но я не рекомендую никогда «проглотить» свои исключения: когда дела идут плохо , вы не знаете, что произошло (и где). Вместо 'catch (исключение e) {}', по крайней мере, выполните: catch (исключение e) {e.printStackTrace(); } ' –

+0

Вы правы, сэр :) Урок для меня: прочитайте скопированный код до конца, прежде чем использовать его. – Jhakki

ответ

5

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

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

ANTLRInputStream (InputStream input, String encoding) throws IOException 
+0

Спасибо, это было. Кроме того, я понял, что я использовал antlr.Tool вместо org.antlr.Tool, и это не создавало реализацию Lexer с помощью конструктора, который принимает ANTLRInputStream. – Jhakki

+0

Я знаю, что это длинный выстрел уже более 3 лет спустя. Однако вы знаете, как сделать что-то подобное для C# и ANTLR4? Больше не существует конструктора, который использует кодировку вообще. – SomeoneRandom

+0

Добавлен ответ здесь: http://stackoverflow.com/questions/28126507/antlr4-using-non-ascii-characters-in-token-rules/28129510#28129510 –

Смежные вопросы