先週この問題に取り組んでいたので、あなたがそれについて言及したのはおかしいです。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 週間以内に登場することを願っています。