生成的解析器会在Node.js上为转义的引号引发错误

时间:2012-11-04 22:48:01

标签: javascript node.js parser-generator peg

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

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

它适用于PEG.js Online Version,并为给定的输入"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

这个问题有解释或解决方法吗? 特别是,我不可能在解析器的预期输入中双重转义所有引号。

1 个答案:

答案 0 :(得分:4)

此声明中的字符串文字......

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

...实际上不包含反斜杠。在JavaScript中,这个符号序列 - \" - 被解析为单个符号 - " - 无论使用什么引号来分隔字符串 - 双重或单个字符串。 JS不会在字符串中插入变量和表达式,并且它们之间基本没有区别。

此字符串 - '"abc\\"def"' - 但是有一个反斜杠:它由\\序列编码。请注意,没有必要使用另一个反斜杠来转义双引号本身(因为分隔符是单引号)。但是,如果使用"\"abc\\\"def\""形式,则必须这样做。