繁体   English   中英

antlr3 Unicode字符导致错误

[英]antlr3 unicode characters cause error

我正在尝试为具有unicode支持的小型DSL(需要德国变音符äöüÄÖÜß)编写antlr3语法,但是我似乎无法使其正常工作。

我编写了一个最小的测试语法,该语法应该可以与任何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

我想念什么?

谢谢!

我编译了您的语法(使用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");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM