5

如何在 PEG.js 语法定义中允许单引号和双引号以及 unicode 字符?更具体地说,我希望能够捕获可以包含单引号和双引号(很可能必须是 \ 转义)和所有 unicode 字符的字符串。

目前我有以下内容:

_ name:$(PROP_ASCII+) CHAR_SQ val:$(PROP_ASCII_INNER*) CHAR_SQ

这将捕获类似

key'value'

PROP_ASCII* 定义为

PROP_ASCII = [!-&(-<>-~] PROP_ASCII_INNER = [ -&(-~]

因此,如果 value 包含标准 ASCII 字符且不包含单引号,则此方法工作得很好而且花花公子......但我想支持我上面描述的内容,所以这样的事情将成为可能:

key'somé\'value\'☂'

想法?

4

2 回答 2

14

这个例子应该让你继续前进。它支持单引号和双引号,也可以在字符串中进行转义。

在线编辑器中尝试。

Value
  = '"' chars:DoubleStringCharacter* '"' { return chars.join(''); }
  / "'" chars:SingleStringCharacter* "'" { return chars.join(''); }

DoubleStringCharacter
  = !('"' / "\\") char:. { return char; }
  / "\\" sequence:EscapeSequence { return sequence; }

SingleStringCharacter
  = !("'" / "\\") char:. { return char; }
  / "\\" sequence:EscapeSequence { return sequence; }

EscapeSequence
  = "'"
  / '"'
  / "\\"
  / "b"  { return "\b";   }
  / "f"  { return "\f";   }
  / "n"  { return "\n";   }
  / "r"  { return "\r";   }
  / "t"  { return "\t";   }
  / "v"  { return "\x0B"; }
于 2015-12-01T11:29:29.813 回答
1

在这个示例文件PEG.js JSON 语法中找到了一个解决方案。带有转义字符的 Unicode 字符串可以这样定义:

string "string"
  = quotation_mark chars:char* quotation_mark { return chars.join(""); }

char
  = unescaped
  / escape
    sequence:(
        '"'
      / "\\"
      / "/"
      / "b" { return "\b"; }
      / "f" { return "\f"; }
      / "n" { return "\n"; }
      / "r" { return "\r"; }
      / "t" { return "\t"; }
      / "u" digits:$(HEXDIG HEXDIG HEXDIG HEXDIG) {
          return String.fromCharCode(parseInt(digits, 16));
        }
    )
    { return sequence; }

escape         = "\\"
quotation_mark = '"'
unescaped      = [\x20-\x21\x23-\x5B\x5D-\u10FFFF]
于 2015-11-27T03:27:53.143 回答