允许在PEG.js语法定义中使用引号和unicode

Allowing for quotes and unicode in PEG.js grammar definitions

本文关键字:unicode 定义 PEG js 语法      更新时间:2023-09-26

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

目前,我有以下内容:

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

它会捕获类似的东西

key'value'

PROP_ASII*定义为

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

所以,如果值包含标准ASCII字符,并且不包含单引号,则此操作非常有效。。。但我想支持我上面所描述的,所以这样的事情将成为可能:

key'somé''value''☂'

想法?

这个例子应该会让你开始。它同时支持单引号和双引号,也可以在字符串中转义。

请在在线编辑器中试用。

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"; }

在这个示例文件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]