使用ANTLR解析Markdown blockquote

时间:2010-01-12 01:24:14

标签: parsing compiler-construction antlr markdown ll

这一直困扰着我一段时间。如何使用ANTLR将以下文本解析到下面的HTML中?我似乎根本无法解决这个问题。

任何想法?

降价:

> first line
> second line
> > nested quote

输出HTML:

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

1 个答案:

答案 0 :(得分:7)

很有趣,你提到这一点,因为我上周正在解决这个问题。见JMD, Markdown and a Brief Overview of Parsing and Compilers。我正在研究一个真正的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来源视为一系列线条,这在其他部分并不是您想要的。

通常,每个词法规则只能生成一个令牌,因此您必须覆盖另一个逃避我的类以允许发出多个令牌。有一个例子(优秀且几乎需要)The Definitive ANTLR Reference: Building Domain-Specific Languages

最终我放弃了ANTLR作为此选择的工具。我自己的手工编码解决方案应该会在下一周或两周出现。