Парсер 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, поскольку это динамическая система, в которой администраторы форума включают/отключают определенные теги.


person Kansha    schedule 22.01.2013    source источник


Ответы (1)


Я бы сказал, что ваш парсер не должен иметь ничего общего с вашей бизнес-логикой; если администраторы форума могут включать или выключать теги, это должно обрабатываться, когда вы просматриваете свой AST, а не в синтаксическом анализаторе.

Ваш синтаксический анализатор должен просто нести ответственность за построение наилучшего синтаксического дерева с полным знанием грамматики, которую он дает. Имея это в виду, я бы рекомендовал создать правило для каждого действительного тега BBCode и обрабатывать исключенные теги после этапа синтаксического анализа.

Мне также интересно, что вы делаете, когда ваш синтаксический анализатор распознает недопустимый BBCode, такой как [z]invalid[/z]?

person Ron Warholic    schedule 22.01.2013
comment
при преобразовании, если он приходит к тегу, которого нет в хеше, он просто выводит то, что получил, например [z]invalid[/z] как есть. Возможно, вы правы. Возможно, мне следует взглянуть на это с другой точки зрения и найти способ динамически включать только правила грамматики. Это, безусловно, делает вещи чище. - person Kansha; 22.01.2013
comment
В худшем случае в вашем файле грамматики вы можете создать строку для всех разрешенных тегов и eval их как рубиновый код. Некрасиво, но это дешево сделать. - person Ron Warholic; 22.01.2013