Разобрать блок-цитаты по Markdown с помощью ANTLR - PullRequest
3 голосов
/ 12 января 2010

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

Есть идеи?

уценки:

> first line
> second line
> &gt nested quote

вывод HTML:

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

1 Ответ

7 голосов
/ 12 января 2010

Забавно, что вы упомянули это, потому что я занимался этой проблемой только на прошлой неделе. См. JMD, Уценка и краткий обзор синтаксического анализа и компиляторов . Я работаю над настоящим анализатором 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 как инструмента выбора для этого. Надеемся, что мое собственное решение с кодировкой вручную появится на следующей неделе или через две.

...