2

PEG.jsを使用して、文字列の解析を含むパーサーを作成しています。
任意の種類の文字を含む文字列は引用符で囲まれ"、エスケープされた引用符を含めることができます\"
これまでのところ、次のルールがあります。

start
    = ["] string:(( '\\"' {return '"';} / [^"])*) ["]
        {return string.join('');}

PEG.jsオンラインバージョンで動作し"abc\"def"、指定された入力に対して生成されます"abc\"def"

Node.jsバージョン0.6.21とPEG.jsバージョン0.7.0用に生成されたパーサーは、次のように実行されます。

var result = parser.parse('"abc\"def"');

次のエラーが発生します。

{ name: 'SyntaxError',
  expected: [],
  found: 'd',
  message: 'Expected end of input but "d" found.',
  offset: 5,
  line: 1,
  column: 6 }

ただし、\\"代わりにを使用\"すると、期待される出力で成功します。

var result = parser.parse('"abc\\"def"'); // parses correctly

この問題の説明または回避策はありますか?特に、パーサーの予想される入力のすべての引用符を二重にエスケープすることはできません。

4

1 に答える 1

4

このステートメントの文字列リテラル...

var result = parser.parse('"abc\"def"');

...実際には円記号は含まれていません。JavaScriptでは、この記号のシーケンスは、文字列を区切るためにどの引用符が使用されてい\"ても、単一の記号として解析されます。二重または単一の記号です。"JSは変数と式を文字列に補間せず、基本的にそれらの間に違いはありません。

この文字列---ただし、バックスラッシュがあります。この文字列はそのシーケンス'"abc\\"def"'によってエンコードされます。\\二重引用符自体をエスケープするために別の円記号を使用する必要はないことに注意してください(区切り文字は一重引用符であるため)。しかし、"\"abc\\\"def\""フォームが使用された場合は、そうする必要があります。

于 2012-11-04T22:55:50.940 に答える