
[英]Antlr3 grammar generates parsering error on encountering the Pound char
[英]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.