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

生成されたコードにエラーはありません。リテラル '\\''\u005c\u005c'はJavaでも同じことを意味します。その理由は、Unicodeエスケープが最初に処理され、他のエスケープシーケンスが後で処理されるためです。JLS(第3版)のセクション3.2を参照してくださいhttp://docs.oracle.com/javase/specs/jls/se5.0/html/lexical.html


編集: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 に答える