Синтаксический анализ цитирования блока Markdown с помощью ANTLR

StackOverflow https://stackoverflow.com/questions/2046080

Вопрос

Это было то, что беспокоило меня уже некоторое время.Как можно выполнить синтаксический анализ следующего текста в 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 как от инструмента выбора для этого.Надеюсь, мое собственное решение, написанное вручную, появится на следующей неделе или двух.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top