ANTLR4:在令牌规则中使用非ASCII字符

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,因此它在指定的范围内)

我做错了什么?

Ter*_*arr 9

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)

  • - 根据我的回答,编码继续下去 (3认同)
  • `java -Dfile.encoding = UTF-8 org.antlr.v4.runtime.misc.TestRig ID ...` (3认同)
  • 你没有在语法上使用TestRig.这就是antlr的用途. (2认同)
  • 谢谢冈瑟.我给了它一个去,但它给出了相同的错误消息:无法加载-encoding作为词法分析器或解析器. (2认同)