2012-04-20 31 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