1

我使用 javacc 5.0 生成带有语法文件的 json 解析器:https ://github.com/inqwell/json/blob/master/src/main/javacc/com/inqwell/json/JSON.jj

但是生成的java源代码有一些错误。

char escape = '\u005c\u005c';

switch(echar)
{
  case 'n':
    buf.append(System.getProperties().get("line.separator")); to++;
    break;

  case 'r':  buf.append('\u005cr'); to++; break;
  case 't':  buf.append('\u005ct'); to++; break;
  case 'b':  buf.append('\u005cb'); to++; break;
  case 'f':  buf.append('\u005cf'); to++; break;
  case '\u005c\u005c': buf.append('\u005c\u005c'); to++; break;
  case '"':  buf.append('"');  to++; break;
  case '\u005c'': buf.append('\u005c''); to++; break;
  case '\u005cr': to++; if (to < len && s.charAt(to) == '\u005cn') to++; break;
  case '\u005cn': to++; break;
}

在语法文件中,它们是:

char escape = '\\';

switch(echar)
{
  case 'n':
    buf.append(System.getProperties().get("line.separator")); to++;
    break;

  case 'r':  buf.append('\r'); to++; break;
  case 't':  buf.append('\t'); to++; break;
  case 'b':  buf.append('\b'); to++; break;
  case 'f':  buf.append('\f'); to++; break;
  case '\\': buf.append('\\'); to++; break;
  case '"':  buf.append('"');  to++; break;
  case '\'': buf.append('\''); to++; break;
  case '\r': to++; if (to < len && s.charAt(to) == '\n') to++; break;
  case '\n': to++; break;
}

这些大小写字符不应该被转义,但是怎么做呢?


更新

代码无法在我的IDEA中编译,请看我的截图:

在此处输入图像描述

4

1 回答 1

1

生成的代码没有错误。Java中的文字 '\\''\u005c\u005c'含义相同。原因是首先处理 unicode 转义,然后处理其他转义序列。请参阅 JLS(第 3 版)http://docs.oracle.com/javase/specs/jls/se5.0/html/lexical.html的第 3.2 节


编辑:添加以下内容以回应 Freewind 的评论

theo-laptop:src theo$ javacc JSON.jj
Java Compiler Compiler Version 5.0 (Parser Generator)
(type "javacc" with no arguments for help)
Reading from file JSON.jj . . .
Note: UNICODE_INPUT option is specified. Please make sure you create the parser/lexer using a Reader with the correct character encoding.
File "TokenMgrError.java" is being rebuilt.
File "ParseException.java" is being rebuilt.
File "Token.java" is being rebuilt.
File "JavaCharStream.java" is being rebuilt.
Parser generated successfully.
theo-laptop:src theo$ fgrep \\u005c JSON.java
char escape = '\u005c\u005c';
  case 'r': buf.append('\u005cr'); to++; break;
  case 't': buf.append('\u005ct'); to++; break;
  case 'b': buf.append('\u005cb'); to++; break;
  case 'f': buf.append('\u005cf'); to++; break;
  case '\u005c\u005c': buf.append('\u005c\u005c'); to++; break;
  case '\u005c'': buf.append('\u005c''); to++; break;
  case '\u005cr': to++; if (to < len && s.charAt(to) == '\u005cn') to++; break;
  case '\u005cn': to++; break;
theo-laptop:src theo$ javac JSON.java
theo-laptop:src theo$ javac -version
javac 1.7.0_07
于 2013-01-28T03:29:58.737 回答