Забавно, что вы говорите, потому что я был решать именно эту проблему на прошлой неделе. См. JMD, Markdown and a Brief Overview of Parsing and Compilers. Я работаю над истинным анализатором Markdown, и я попробовал его с ANTLR.
Есть несколько способов, которыми вы можете справиться с этим.
Во-первых, вы можете просто разобрать:
BLOCK_QUOTE : '>' (' ' | '\t')? ;
и работать его на этапе синтаксического анализа, возможно, как правило перезаписи.
Вещь это важно только, когда они появляются в начале строки так вот другой подход:
@members {
int quoteDepth = 0;
}
BLOCK_QUOTE : '\n' (q+='>' (' ' | '\t')?)+
{ if ($q.size() > quoteDepth) /* emit one or more START_QUOTE tokens */
else if ($q.size() < quoteDepth /* emit one or more END_QUOTE tokens */
quoteDepth = $q.size(); }
выше, возможно, потребуется правило синтаксического анализа, а не лексическое правило тоже. Я забыл.
Но даже это неудовлетворительно, потому что это приводит к тому, что вы относитесь к источнику Markdown как к последовательности строк, чего вы не хотите в других частях.
Также, как правило, каждое лексическое правило может привести только к одному токену, поэтому вам придется перезаписать другой класс, который ускользает от меня, чтобы допускать испускание нескольких токенов. Вот пример этого в (отлично и почти обязательно) The Definitive ANTLR Reference: Building Domain-Specific Languages.
В конечном итоге я отказался от ANTLR в качестве инструмента для этого. Мое собственное решение с ручной кодировкой, должно быть, должно появиться в ближайшие недели или две.
Предположительно, вы помните, насколько вы глубоки, и при необходимости теги blockquote закрывают, когда вы найдете меньше знаков '>'. –