2012-04-20 64 views
0

我正在嘗試爲支持Unicode的小型DSL編寫antlr3語法(德語變音符號需要),但似乎無法使其工作。antlr3 Unicode字符導致錯誤

我寫的應該是匹配的Unicode字符的任意序列的最小測試語法,如「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'); 

對於 「XAX」 我發現了以下錯誤:

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

我缺少什麼?

謝謝!

+2

的可能的複製[什麼是字符編碼,爲什麼我要這麼做吧](http://stackoverflow.com/questions/10611455/什麼是字符編碼和爲什麼我應該打擾它) – Raedwald 2016-01-21 13:18:45

回答

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

一個想法,雖然:也許你默認編碼(其中,我認爲,在JVM啓動時間的file.encoding屬性指定)設置爲UTF-8以外的其他東西。爲了測試這一點,嘗試在呼叫明確指定編碼getBytes()

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

Yessss!非常感謝!在getBytes()中指定字符集有訣竅! – fscld 2012-04-23 10:57:10

+1

@fscld好吧。在這種情況下,你可能會考慮接受答案.. – jogojapan 2012-04-23 11:00:01