我正在尝试为具有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
我错过了什么?
谢谢!
答案 0 :(得分: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");