私は 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 実装の解決策がある場合は、それも提供してください。私は切り替えることができます:)