允许在 PEG.js 语法定义中使用引号和 unicode
Allowing for quotes and unicode in PEG.js grammar definitions
如何在 PEG.js 语法定义中允许使用单引号和双引号以及 unicode 字符?更具体地说,我希望能够捕获可以包含单引号和双引号(很可能必须转义)和所有 unicode 字符的字符串。
目前我有如下内容:
_ name:$(PROP_ASCII+) CHAR_SQ val:$(PROP_ASCII_INNER*) CHAR_SQ
这会捕获类似
的内容
key'value'
PROP_ASCII* 定义为
PROP_ASCII
= [!-&(-<>-~]
PROP_ASCII_INNER
= [ -&(-~]
因此,如果值包含标准 ASCII 字符且不包含单引号,则此方法工作正常且花花公子......但我想支持我上面描述的内容,因此这样的事情将成为可能:
key'somé\'value\'☂'
想法?
在此示例文件中找到了解决方案 PEG.js JSON grammar。带有转义字符的 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]
这个例子应该能让你开始。它支持单引号和双引号,也可以在字符串中转义。
在 online editor 中尝试。
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 语法定义中允许使用单引号和双引号以及 unicode 字符?更具体地说,我希望能够捕获可以包含单引号和双引号(很可能必须转义)和所有 unicode 字符的字符串。
目前我有如下内容:
_ name:$(PROP_ASCII+) CHAR_SQ val:$(PROP_ASCII_INNER*) CHAR_SQ
这会捕获类似
的内容key'value'
PROP_ASCII* 定义为
PROP_ASCII
= [!-&(-<>-~]
PROP_ASCII_INNER
= [ -&(-~]
因此,如果值包含标准 ASCII 字符且不包含单引号,则此方法工作正常且花花公子......但我想支持我上面描述的内容,因此这样的事情将成为可能:
key'somé\'value\'☂'
想法?
在此示例文件中找到了解决方案 PEG.js JSON grammar。带有转义字符的 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]
这个例子应该能让你开始。它支持单引号和双引号,也可以在字符串中转义。
在 online editor 中尝试。
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"; }