如何让javacc在生成源代码时不要转义字符?

时间:2012-11-26 07:00:12

标签: json escaping javacc

我使用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中编译,请参阅我的截图:

enter image description here

1 个答案:

答案 0 :(得分:1)

生成的代码中没有错误。文字'\\''\u005c\u005c'在Java中意味着相同的东西。原因是首先处理unicode转义,稍后处理其他转义序列。请参阅JLS(第3版){3.2}的第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