JavaCC 生成的代码在解析 UTF-8 字符串时失败

问题描述 投票:0回答:1

我有一个较旧的项目,其中使用 JavaCC 语法生成类来解析自定义语言。

现在,几年后我不得不调整语法以添加功能(只是一个小改动)。 这可行,但在运行所有测试时,我发现我在解析 UTF-8 字符时遇到问题。 我真的不知道是什么原因造成的。 我恢复了对语法的更改并重新创建了类,但问题仍然存在。 一旦我用语法运行 javacc 并运行我的测试,带有 UTF-8 字符的测试就会失败。

这是我正在使用的电话:

java -cp javacc-7.0.10.jar javacc -GRAMMAR_ENCODING=UTF-8 functionsGrammar.jj

我尝试了从 4.x 到 7.0.10 的所有主要 javacc 版本,它们都有同样的问题。 我也尝试过使用不同的 Java 版本(6、7、8、11),但这也没有任何区别。

您可以在下面找到语法的相关部分:

options
{
  JDK_VERSION = "1.6";

  LOOKAHEAD= 2;
  FORCE_LA_CHECK = true;

  static = false;
}

TOKEN:
{
...
|< STRING : < QUOTES > (~["\"", "\\"])* ("\\"~[] (~["\"", "\\"])*)* < QUOTES > >
...}

TOKEN:
{
...
| < LIST :
    < LCURLY_BRACE > < SPACES >
    ( < STRING > | < DATE > | < PARAMETER_FIELD_ID > | < PARAMETER_ELEMENT > | < NULL > )
    ( < COMMA > < SPACES >
      ( < STRING > | < DATE > | < PARAMETER_FIELD_ID > | < PARAMETER_ELEMENT > | < NULL > )
    )*
...}

字符串失败:“美丽的树”,但例如更改为“slkdfj”时有效。

我想知道是否有任何我缺少的 JavaCC 选项?或者其他可能有效的 java / javacc 版本组合?

java utf-8 javacc
1个回答
0
投票

旧版 JavaCC 肯定不支持完整的当前 Unicode 标准,即 32 位字符。这在这里解释。当然,OP 很可能(至少目前)不需要超过 16 位(BMP,基本多语言平面)字符。但是,JavaCC 21 支持完整的 Unicode。除此之外,JavaCC 21 修复了遗留 JavaCC 中 20 多年未解决的大量现有错误。我认为这篇文章在这方面很有启发性。

© www.soinside.com 2019 - 2024. All rights reserved.