【问题标题】:Markdown blockquote parsing with ANTLR使用 ANTLR 解析 Markdown 块引用
【发布时间】:2010-01-12 01:24:13
【问题描述】:

这是困扰我一段时间的事情。如何使用 ANTLR 将以下文本解析为下面的 HTML?我似乎完全无法理解这一点。

有什么想法吗?

降价:

> 第一行 > 第二行 > &gt 嵌套引用

输出 HTML:

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

【问题讨论】:

  • 想必你还记得你的深度,当你发现较少的&gt; 标志时,适当关闭blockquote标签。

标签: parsing compiler-construction antlr markdown ll


【解决方案1】:

你提到这一点很有趣,因为我上周正在解决这个问题。见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 作为首选工具。我自己的手工编码解决方案有望在接下来的一两周内出现。

【讨论】:

    猜你喜欢
    • 2012-09-13
    • 2012-05-31
    • 1970-01-01
    • 2018-06-30
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    • 2016-05-18
    相关资源
    最近更新 更多