首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Peg解析器-对转义字符的支持

Peg解析器-对转义字符的支持
EN

Stack Overflow用户
提问于 2021-03-21 09:17:43
回答 1查看 331关注 0票数 1

我在做一个Peg解析器。在其他结构中,它需要解析标记指令。标签可以包含任何字符。如果您想要标签包括一个卷边大括号},您可以用反斜杠转义它。如果您需要一个文字反斜杠,那也应该转义。我试图实现这个灵感来自于JSON:https://github.com/pegjs/pegjs/blob/master/examples/json.pegjs的Peg语法

有两个问题:

  • 转义反斜杠导致两个反斜杠字符而不是一个反斜杠字符。示例输入:
代码语言:javascript
复制
{ some characters but escape with a \\ }
  • 解析器在转义的卷曲\}上中断。示例输入:
代码语言:javascript
复制
{ some characters but escape \} with a \\ }

相关的语法是:

代码语言:javascript
复制
Tag
  = "{" _ tagContent:$(TagChar+) _ "}" {
  return { type: "tag", content: tagContent }
}

TagChar
  = [^\}\r\n]
  / Escape
    sequence:(
        "\\" { return {type: "char", char: "\\"}; }
      / "}" { return {type: "char", char: "\x7d"}; }
    )
    { return sequence; }
    
_ "whitespace"
  = [ \t\n\r]*
  
Escape
  = "\\"

您可以轻松地使用联机PegJS沙箱:https://pegjs.org/online测试语法和测试输入。

我希望有人有办法解决这个问题。

EN

回答 1

Stack Overflow用户

发布于 2021-03-21 20:46:25

供参考,正确的语法如下:

代码语言:javascript
复制
Tag
  = "{" _ tagContent:TagChar+ _ "}" {
  return { type: "tag", content: tagContent.map(c => c.char || c).join('') }
}

TagChar
  = [^}\\\r\n]
  / Escape
    sequence:(
        "\\" { return {type: "char", char: "\\"}; }
      / "}" { return {type: "char", char: "\x7d"}; }
    )
    { return sequence; }
    
_ "whitespace"
  = [ \t\n\r]*
  
Escape
  = "\\"

使用下列输入时:

代码语言:javascript
复制
{ some characters but escape \} with a \\ }

它将返回:

代码语言:javascript
复制
{
   "type": "tag",
   "content": "some characters but escape } with a \ "
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66730616

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档