这一直是困扰我一段时间的事情。如何使用 ANTLR 将以下文本解析为下面的 HTML?我似乎根本无法解决这个问题。
有任何想法吗?
降价:
> 第一行 > 第二行 >> 嵌套引用
输出 HTML:
<blockquote>
<p>first line
second line</p>
<blockquote>
<p>nested quote</p>
</blockquote>
</blockquote>
这一直是困扰我一段时间的事情。如何使用 ANTLR 将以下文本解析为下面的 HTML?我似乎根本无法解决这个问题。
有任何想法吗?
降价:
> 第一行 > 第二行 >> 嵌套引用
输出 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 源视为一系列行,这在其他部分并不是您真正想要的。
同样通常每个词法规则只能产生一个标记,因此您必须覆盖另一个让我逃脱的类以允许发出多个标记。The Definitive ANTLR Reference: Building Domain-Specific Languages中有一个例子(优秀且几乎是必需的)。
最终我放弃了 ANTLR 作为选择的工具。我自己的手工编码解决方案有望在接下来的一两周内出现。