[英]Making BBcode parser with PEG problem
我正在用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实施的解决方案,也请在此处提供。 我可以切换:)
不久前,我遇到了类似的问题。 有一个技巧可以做到这一点:
您需要先说说match open_tag
,然后说不是结束标记的所有内容,然后是closing_tag
。 所以这给出了以下规则
rule tag
open_tag ((!open_tag | !close_tag | !new_line ) .)+ close_tag
end
这将解析任何文本,并在[
不是另一个标签的开头时递归继续。
rule text
[^\n\[\]]+ (!open_tag text)?
end
这个
rule text
[^\n\[\]]+ (!open_tag text)?
end
以解析错误结束
我试图继续这个想法,结果是([^\\n] (!open_tag | !close_tag) text*)
但它也会失败。 它将匹配"sometext[anothertext[/b]"
查找临时解决方案((!open_tag | !close_tag | !new_line) .)
它将只查找一个字母一个字母,但忽略所有打开和关闭标签。 这些信件我以后可以在一起:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.