Parsing 使用ANTLR进行Markdown块引号解析
这件事困扰了我一段时间。如何使用ANTLR将以下文本解析为下面的HTML?我似乎一点也不在乎这件事 有什么想法吗 降价: > first line > second line > > nested quote >一线 >第二线 >>嵌套报价 输出HTML: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
<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标记。