Я делаю парсер bbcode с PEG (реализация Citrus для Ruby), и я застрял на разборе этого [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, дайте его и там. Я могу переключиться :)