【问题标题】:Making BBcode parser with PEG problem使用 PEG 问题制作 BBcode 解析器
【发布时间】:2011-09-19 15:43:20
【问题描述】:

我正在使用 PEG(Ruby 的 Citrus 实现)制作 bbcode 解析器,但我一直在解析这个 [b]sometext[anothertext[/b]

有代码

grammar BBCodeParser
  rule document
    (open_tag | close_tag | new_line | text)*
  end
  rule open_tag
    ("[" tag_name "="? tag_data? "]")
  end

  rule close_tag
    ("[/" tag_name "]") 
  end

  rule text
    [^\n\[\]]+
  end

  rule new_line
    ("\r\n" | "\n")
  end

  rule tag_name
    # [p|br|b|i|u|hr|code|quote|list|url|img|\*|color]
    [a-zA-Z\*]+
  end

  rule tag_data
    ([^\[\]\n])+
  end
end

问题在于规则text 我不知道怎么说,该文本可以包含除\r、\n、open_tag 或close_tag 之外的所有内容。 使用此实现,由于排除 [ 和 ] (那是错误的),它在示例中失败

所以最后的问题是如何做规则,它可以匹配除 \r、\n 或 open_tag 或 close_tag 的完全匹配之外的任何内容

如果您有其他 PEG 实施的解决方案,也可以提供。我可以切换:)

【问题讨论】:

    标签: ruby parsing bbcode treetop peg


    【解决方案1】:

    不久前我遇到了类似的问题。有一个技巧可以做到这一点:
    你需要说匹配open_tag,然后是不是结束标签的所有内容,然后是closing_tag。所以这给出了以下规则

    rule tag
      open_tag ((!open_tag | !close_tag | !new_line ) .)+ close_tag
    end
    

    【讨论】:

      【解决方案2】:

      这将解析任何文本并在 [ 不是另一个标签的开头时递归地继续。

      rule text
          [^\n\[\]]+ (!open_tag text)?
      end
      

      【讨论】:

        【解决方案3】:

        这个

        rule text
            [^\n\[\]]+ (!open_tag text)?
        end
        

        以解析错误结束

        我试图继续这个想法,结果是([^\n] (!open_tag | !close_tag) text*) 但它也会失败。它将匹配"sometext[anothertext[/b]"

        寻找临时解决方案 ((!open_tag | !close_tag | !new_line) .) 它只会逐个字母地找到一个字母,但会忽略所有打开和关闭标签。这些字母我以后可以组合起来:)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-08-19
          • 2021-10-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多