3

これは、しばらくの間私を悩ませてきたものです。ANTLR を使用して、次のテキストを以下の HTML に解析するにはどうすればよいですか? 私はこれについて頭を包むことができないようです。

何か案は?

マークダウン:

> 一行目
> 二行目
> > ネストされた引用

出力 HTML:

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

1 に答える 1

7

先週この問題に取り組んでいたので、あなたがそれについて言及したのはおかしいです。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 ソースを一連の行として扱う必要があり、他の部分で実際に望んでいることではないからです。

また、通常、各レキシカル ルールは 1 つのトークンしか生成できないため、複数のトークンを発行できるようにするために、私をエスケープする別のクラスを上書きする必要があります。この例は、(優れた、ほぼ必須の)The Definitive ANTLR Reference: Building Domain-Specific Languagesにあります。

最終的に、私はこれに最適なツールとして ANTLR を断念しました。私自身の手でコード化されたソリューションが、来週か 2 週間以内に登場することを願っています。

于 2010-01-12T01:41:46.160 に答える