【问题标题】:Generated parser throws error for escaped quotes on Node.js生成的解析器为 Node.js 上的转义引号引发错误
【发布时间】:2012-11-04 22:48:00
【问题描述】:

我正在使用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

是否有此问题的解释或解决方法? 特别是,我不可能对解析器的预期输入中的所有引号进行双重转义。

【问题讨论】:

    标签: javascript node.js parser-generator peg


    【解决方案1】:

    此语句中的字符串文字...

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

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

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

    【讨论】:

    • 感谢您的快速答复。一个问题。如果要从文件中读取要解析的字符串的内容(例如使用 Node.js),是否会存在相同的问题。因为这是解析器的真正目的。为解析器编写单元测试时出现上述问题。
    • 您的意思是文件本身是否包含abc\"def 行?不,\" 将被视为两个符号 - 现在它不是字符串文字(我承认我没有对此进行测试,但这是这里唯一理智的方式)。
    • 是的,我就是这个意思。再次感谢。
    猜你喜欢
    • 2019-10-14
    • 1970-01-01
    • 2014-11-29
    • 1970-01-01
    • 2012-04-07
    • 2015-10-16
    • 1970-01-01
    • 2021-02-28
    • 1970-01-01
    相关资源
    最近更新 更多