Parsing 使用ANTLR进行Markdown块引号解析

Parsing 使用ANTLR进行Markdown块引号解析,parsing,compiler-construction,antlr,markdown,ll,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 qu

这件事困扰了我一段时间。如何使用ANTLR将以下文本解析为下面的HTML?我似乎一点也不在乎这件事

有什么想法吗

降价:

> first line > second line > > nested quote >一线 >第二线 >>嵌套报价 输出HTML:

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

一线
第二线

嵌套引用


有趣的是,你提到这一点是因为我上周刚刚解决了这个问题。看见我正在开发一个真正的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(); }
@成员{
int quoteDepth=0;
}
块_QUOTE:'\n'(q+='>'(''.'\t')?)+
{if($q.size()>quoteDepth)/*发出一个或多个开始标记*/
else if($q.size()
上面可能需要一个解析器规则,而不是词法规则。我忘了

但即使这样也不令人满意,因为它迫使您将降价源视为一系列行,而这并不是您在其他部分真正想要的

通常每个词法规则只能产生一个标记,因此您必须覆盖另一个逃逸的类,以允许发出多个标记


最终,我放弃了使用ANTLR作为这方面的首选工具。我自己的手工编码解决方案有望在未来一两周内出现。

大概,您还记得自己有多深,当您发现较少的
符号时,请关闭blockquote标记。