如何在JavaCC中支持西里尔字母?

发布于 2024-11-03 00:06:20 字数 1639 浏览 1 评论 0原文

我可以为 *.jjt 文件制作西里尔字母标记吗?

例如,jjt 中给出了标记:

TOKEN : /* LITERALS */
{
    < TEST: "тест" >
|   < DEVELOP: "разработка" >
}

但是 jj 文件中的标记看起来很糟糕:

TOKEN : /* LITERALS */
{
    < TEST: "\u0421\u201a\u0420\u00b5\u0421\u0403\u0421\u201a" >
|   < DEVELOP: "\u0421\u0402\u0420\u00b0\u0420\u00b7\u0421\u0402\u0420\u00b0\u0420\u00b1\u0420\u0455\u0421\u201a\u0420\u0454\u0420\u00b0" >
}

使用以下选项:

options {
  JDK_VERSION = "1.6";
  UNICODE_INPUT = true;
  JAVA_UNICODE_ESCAPE = false;
  TRACK_TOKENS=true;
  STATIC=false;
}

如果我在她的类的帮助下进行 Unicode:

class GetUnicode {
  public static void main(String[] args) {
      if (args.length < 1) return;
      for (String input: args) {
        for (int index = 0; index < input.length(); ++index) {
            final char c = input.charAt(index); 
            final String s = String.format ("\\u%04x", (int)c);
            System.out.print(s);
        }
        System.out.println();
      }
  }
}

程序启动后:

$ java GetUnicode тест разработка                                                                                                                                                                                       
\u0442\u0435\u0441\u0442
\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430

结果,我可以看到 unicode字符串不匹配。 例如:

"\u0442\u0435\u0441\u0442" != "\u0421\u201a\u0420\u00b5\u0421\u0403\u0421\u201a"

您知道为什么会发生这种情况吗?

PS:这个bug只发生在Windows操作系统下。

Can I make cyrillic tokens for *.jjt file?

For exampe tokens are given in jjt:

TOKEN : /* LITERALS */
{
    < TEST: "тест" >
|   < DEVELOP: "разработка" >
}

but the tokens in jj file look terrible:

TOKEN : /* LITERALS */
{
    < TEST: "\u0421\u201a\u0420\u00b5\u0421\u0403\u0421\u201a" >
|   < DEVELOP: "\u0421\u0402\u0420\u00b0\u0420\u00b7\u0421\u0402\u0420\u00b0\u0420\u00b1\u0420\u0455\u0421\u201a\u0420\u0454\u0420\u00b0" >
}

Use the following options:

options {
  JDK_VERSION = "1.6";
  UNICODE_INPUT = true;
  JAVA_UNICODE_ESCAPE = false;
  TRACK_TOKENS=true;
  STATIC=false;
}

If I do Unicode with the help of her class:

class GetUnicode {
  public static void main(String[] args) {
      if (args.length < 1) return;
      for (String input: args) {
        for (int index = 0; index < input.length(); ++index) {
            final char c = input.charAt(index); 
            final String s = String.format ("\\u%04x", (int)c);
            System.out.print(s);
        }
        System.out.println();
      }
  }
}

After the start of the program:

$ java GetUnicode тест разработка                                                                                                                                                                                       
\u0442\u0435\u0441\u0442
\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430

As a result, I can see that the unicode strings do not match.
For example:

"\u0442\u0435\u0441\u0442" != "\u0421\u201a\u0420\u00b5\u0421\u0403\u0421\u201a"

Do you have ideas why this happens?

PS: This bug occurs only under Windows OS.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

凶凌 2024-11-10 00:06:20

.jj 文件是使用转义的西里尔字符 (Unicode) 生成的。这是一件好事,因为它们不会因为使用错误的编码而被误读。你不应该担心它;令牌管理器将正常工作。

The .jj file has been generated with the cyrillic characters escaped (Unicode). This is a good thing since they can then not be misread by using the wrong encoding. You should not worry about it; the token manager will work just fine.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文