【问题标题】:antlr3 unicode characters cause errorantlr3 unicode 字符导致错误
【发布时间】:2012-04-20 13:06:33
【问题描述】:

我正在尝试为支持 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

我错过了什么?

谢谢!

【问题讨论】:

标签: java unicode antlr antlr3


【解决方案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");

【讨论】:

  • 是的!非常感谢!在 getBytes() 中指定字符集就成功了!
猜你喜欢
  • 2019-05-13
  • 1970-01-01
  • 2012-06-24
  • 1970-01-01
  • 2012-02-07
  • 1970-01-01
  • 1970-01-01
  • 2014-12-18
  • 2017-01-17
相关资源
最近更新 更多