Rog*_*llo 7 unicode grammar antlr token antlr4
在ANTRL4书的第74页上,它表示只需通过以下方式指定其代码点,就可以在语法中使用任何Unicode字符:
'\uxxxx'
Run Code Online (Sandbox Code Playgroud)
其中xxxx
是Unicode代码点的十六进制值.
所以我在ID令牌的令牌规则中使用了这种技术:
grammar ID;
id : ID EOF ;
ID : ('a' .. 'z' | 'A' .. 'Z' | '\u0100' .. '\u017E')+ ;
WS : [ \t\r\n]+ -> skip ;
Run Code Online (Sandbox Code Playgroud)
当我试图解析这个输入时:
G?nter
Run Code Online (Sandbox Code Playgroud)
ANTLR抛出一个错误,说它无法识别?
.(ŭ字符是十六进制016D,因此它在指定的范围内)
我做错了什么?
ANTLR已准备好接受16位字符,但默认情况下,许多语言环境将以字节(8位)读取字符.使用Java库从文件读取时,需要指定适当的编码.如果您正在使用TestRig
,或许通过别名/脚本grun
,那么使用参数-encoding utf-8
或其他.如果查看该类的源代码,您将看到以下机制:
InputStream is = new FileInputStream(inputFile);
Reader r = new InputStreamReader(is, encoding); // e.g., euc-jp or utf-8
ANTLRInputStream input = new ANTLRInputStream(r);
XLexer lexer = new XLexer(input);
CommonTokenStream tokens = new CommonTokenStream(lexer);
...
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5313 次 |
最近记录: |