这件事困扰了我一段时间。如何使用 ANTLR 将以下文本解析为 HTML?我似乎根本无法理解这个问题。
有什么想法吗?
Markdown :
> first line > second line > > nested quote
output HTML:
<blockquote>
<p>first line
second line</p>
<blockquote>
<p>nested quote</p>
</blockquote>
</blockquote>
最佳答案
有趣的是你提到了这一点,因为我上周刚刚解决了这个问题。请参阅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 作为选择的工具。我自己的手工编码解决方案有望在接下来的一两周内出现。
关于parsing - 使用 ANTLR 解析 Markdown block 引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2046080/