我正在用聚乙二醇(Citrus implementation for Ruby)制作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之外的所有内容。在此实现中,由于排除了 and ,因此在示例中失败
所以最后一个问题是如何执行规则,它可以匹配除\r、\n之外的任何内容,也可以与open_tag或close_tag完全匹配
如果你有另一个PEG实现的解决方案,也可以在那里给出。我可以切换:)
发布于 2012-07-24 05:12:10
不久前我也遇到过类似的问题。要做到这一点,有一个技巧:
您需要说match open_tag,然后是不是结束标记的所有内容,然后是closing_tag。因此,这给出了以下规则
rule tag
open_tag ((!open_tag | !close_tag | !new_line ) .)+ close_tag
end发布于 2011-09-20 00:00:23
这将解析任何文本,并在[不是另一个标记的开头时递归地继续。
rule text
[^\n\[\]]+ (!open_tag text)?
end发布于 2011-09-20 04:57:06
这
rule text
[^\n\[\]]+ (!open_tag text)?
end以解析错误结束
我试图继续这个想法,结果是([^\n] (!open_tag | !close_tag) text*),但它也会失败。它将与"sometext[anothertext[/b]"匹配
Find temp solution ((!open_tag | !close_tag | !new_line) .)它将只查找一个字母,但忽略所有的开始和结束标记。这些字母我稍后可以连接在一起:)
https://stackoverflow.com/questions/7473570
复制相似问题