Синтаксический анализ цитирования блока Markdown с помощью ANTLR
-
20-09-2019 - |
Вопрос
Это было то, что беспокоило меня уже некоторое время.Как можно выполнить синтаксический анализ следующего текста в HTML ниже с помощью ANTLR?Кажется, я вообще не могу уложить это в голове.
Есть какие-нибудь идеи?
Уценка:
> first line > second line > > nested quote
выходной HTML:
<blockquote>
<p>first line
second line</p>
<blockquote>
<p>nested quote</p>
</blockquote>
</blockquote>
Решение
Забавно, что вы упомянули об этом, потому что на прошлой неделе я как раз занимался этой проблемой.Видишь JMD, Markdown и краткий обзор синтаксического анализа и компиляторов.Я работаю над настоящим анализатором 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 как последовательность строк, что на самом деле не то, что вам нужно в других частях.
Также обычно каждое лексическое правило может приводить только к одному токену, поэтому вам нужно перезаписать другой класс, который ускользает от меня, чтобы разрешить выдачу нескольких токенов.Пример этого есть в (превосходном и почти обязательном) Окончательная ссылка ANTLR:Создание языков, специфичных для конкретной предметной области.
В конечном счете я отказался от ANTLR как от инструмента выбора для этого.Надеюсь, мое собственное решение, написанное вручную, появится на следующей неделе или двух.