Парсер BBCode Treetop и закрытие смарт-тега?
Я написал файл грамматики на верхушке дерева, который в основном работает. Для тегов, таких как [b]
Я хочу передать их в функцию, которая имеет хэш настроенных BBCodes для этого форума. Если бы жирным шрифтом было разрешено, он вернул бы HTML, в противном случае он игнорировал бы код BB.
rule tag
tag:('[' [a-zA-Z]+ ']')
inner_tag:(
!('[/' [a-zA-Z]+ ']')
(tag <ForumBB::TagNode> / .)
)+
'[/' [a-zA-Z]+ ']'
end
Это не работает с вложенными тегами. Например, [b][i]Bold and italics[/i][/b]
не будет обрабатываться правильно, потому что они соответствуют первому закрывающему тегу [/i]
,
Как я могу сделать так, чтобы, когда он находит тег, он ищет закрывающий тег в отрицательном заголовке?
Я бы предпочел не писать все правила для каждого вида BBCode, поскольку это динамическая система, в которой администраторы форумов включают / выключают определенные теги.
1 ответ
Я бы сказал, что ваш парсер не должен иметь ничего общего с вашей бизнес-логикой; если администраторы форума могут включать или отключать теги, это следует обрабатывать при обходе AST, а не в анализаторе.
Ваш синтаксический анализатор должен просто отвечать за построение лучшего синтаксического дерева, которое он может, с полным знанием грамматики, которую он дает. Имея это в виду, я бы рекомендовал создать правило для каждого допустимого тега BBCode и обрабатывать исключенные теги после фазы синтаксического анализа.
Мне также интересно, что вы делаете, когда ваш синтаксический анализатор распознает недействительный BBCode, такой как [z]invalid[/z]
?