parsing - 使用 ANTLR 解析 Markdown block 引用

标签 parsing compiler-construction antlr markdown ll-grammar

这件事困扰了我一段时间。如何使用 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/

相关文章:

parsing - 如何构建解析器以将 Lucene 语法解析为 AST

java - 为什么带有内部类的 Java 代码会生成第三个 SomeClass$1.class 文件?

c++ - 当您想试验 C++0x 特性时,最好使用什么编译器?

java - ANTLR4 - 树模式匹配代码错误

python - 在 awk 中解析数据

php - 为什么使用dom而不是regex来解析网页?

c - 在 MPLAB XC8 Microchip 编译器中为字符串声明特定地址

java - 我如何引用在 ANTLR 中多次调用同一规则?

ANTLR - 树中的隐式 AND 标记

java - 解析 JSON 时在 java 中转义数字符号(哈希标签)