2012-04-20 3 views
0

Я пытаюсь написать грамматику antlr3 для небольшого DSL с поддержкой unicode (необходимо для немецких умляутов, äöüÄÖÜß), но я не могу заставить его работать.символы unicode antlr3 вызывают ошибку

Я написал минимальную грамматику теста, который должен соответствовать любой последовательности символов Юникода, как «XAY» (который работает просто отлично) или «Xay» (который не делает.)

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

grammar X; 

@lexer::header { 
import org.antlr.runtime.ANTLRInputStream; 
import org.antlr.runtime.ANTLRStringStream; 
import org.antlr.runtime.CommonTokenStream; 
import java.io.ByteArrayInputStream; 
import java.io.IOException; 
} 

@lexer::members { 

    public static void main(String[] args) throws Exception { 
     ANTLRInputStream stream = new ANTLRInputStream(new ByteArrayInputStream("x\u00C4y".getBytes()), "utf-8"); 
     XLexer lex = new XLexer(stream); 
     CommonTokenStream c = new CommonTokenStream(lex); 
     XParser p = new XParser(c); 
     p.x(); 
    } 

} 

x : UTF8+; 

UTF8 : ('\u0000'..'\uF8FF'); 

Для "х" Я получаю следующее сообщение об ошибке:

line 1:1 mismatched character '?' expecting set null 

Что я упускаю?

Спасибо!

+2

Возможный дубликат [Что такое кодировка символов и почему я должен беспокоиться о нем] (http://stackoverflow.com/questions/10611455/ what-is-character-encoding-and-why-should-i-bother-with-it) – Raedwald

ответ

1

Я скомпилировал вашу грамматику (используя Antlr 3.4), и это сработало для меня без проблем. Вот что я сделал именно:

$ java -jar antlr-3.4-complete-no-antlrv2.jar X.g 
$ javac -cp antlr-3.4-complete-no-antlrv2.jar XLexer.java XParser.java 
$ CLASSPATH=$CLASSPATH:./antlr-3.4-complete-no-antlrv2.jar:./XLexer.class:./XParser.class java XLexer 

Я также вставить код, чтобы напечатать строку STDOUT перед разбором его, и он напечатал ожидаемую строку xÄy.

Одна идея, хотя: Возможно, ваша кодировка по умолчанию (который, я думаю, указывается в file.encoding собственности на JVM времени запуска) устанавливается на нечто иное, чем UTF-8. Чтобы проверить это, попробуйте указать кодировку явно при вызове getBytes():

ANTLRInputStream stream = new ANTLRInputStream(new ByteArrayInputStream("x\u00C4y".getBytes("UTF-8")), "utf-8"); 
+0

Yessss! Большое спасибо! Указание charset в getBytes() сделал трюк! – fscld

+1

@fscld Ну. В этом случае вы можете подумать о принятии ответа. – jogojapan

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