【发布时间】: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