有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java antlr3 unicode字符导致错误

我正试图为一个支持unicode的小型DSL编写一个antlr3语法(德语umlauts,äöü196;ä220;ß需要),但我似乎无法让它工作

我已经编写了一个最小测试语法,它应该匹配任何unicode字符序列,比如“xay”(工作正常)或“xäy”(不正常)

语法如下:

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');

对于“xäx”,我得到以下错误:

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

我错过了什么

谢谢


共 (1) 个答案

  1. # 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");