2

我正在使用PEG.js创建一个包含解析字符串的解析器。
包含任何类型字符的字符串都用引号括起来",并且可能包含转义引号\"
到目前为止,我有以下规则:

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

它适用于PEG.js 在线版本"abc\"def"为给定的输入生成"abc\"def"

为带有 PEG.js 版本 0.7.0 的 Node.js 版本 0.6.21 生成的解析器按以下方式执行

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 回答