2010-01-12 6 views
3

Это было чем-то, что меня беспокоило какое-то время. Как можно разобрать следующий текст в HTML ниже с помощью ANTLR? Кажется, я вообще не обволакиваю голову.Markdown blockquote parsing with ANTLR

Любые идеи?

уценки:

 
> first line 
> second line 
> > nested quote 

выход HTML:

<blockquote> 
    <p>first line 
    second line</p> 
    <blockquote> 
    <p>nested quote</p> 
    </blockquote> 
</blockquote> 
+0

Предположительно, вы помните, насколько вы глубоки, и при необходимости теги blockquote закрывают, когда вы найдете меньше знаков '>'. –

ответ

7

Забавно, что вы говорите, потому что я был решать именно эту проблему на прошлой неделе. См. 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 в качестве инструмента для этого. Мое собственное решение с ручной кодировкой, должно быть, должно появиться в ближайшие недели или две.