Sco*_*ott 3 compiler-construction markdown parsing antlr ll-grammar
这一直困扰着我一段时间.如何使用ANTLR将以下文本解析到下面的HTML中?我似乎根本无法解决这个问题.
有任何想法吗?
降价:
> first line > second line > > nested quote
输出HTML:
<blockquote>
<p>first line
second line</p>
<blockquote>
<p>nested quote</p>
</blockquote>
</blockquote>
Run Code Online (Sandbox Code Playgroud)
有趣的是,你提到这一点,因为我上周正在处理这个问题.请参阅JMD,Markdown以及解析和编译器的简要概述.我正在研究一个真正的Markdown解析器,我尝试使用ANTLR.
有几种方法可以解决这个问题.
首先你可以解析:
BLOCK_QUOTE : '>' (' ' | '\t')? ;
Run Code Online (Sandbox Code Playgroud)
并在解析步骤中进行处理,可能作为重写规则.
事情是这些只有当它们出现在一行的开头时才重要,所以这是另一种方法:
@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(); }
Run Code Online (Sandbox Code Playgroud)
以上可能需要是解析器规则而不是词法规则.我忘了.
但即便如此,这也是令人不满意的,因为它会迫使您将Markdown源视为一系列线条,这在其他部分并不是您想要的.
通常,每个词法规则只能产生一个令牌,因此您必须覆盖另一个逃避我的类以允许发出多个令牌.在(优秀的,几乎需要的)The Definitive ANTLR Reference:Building Domain-Specific Languages中有一个例子.
最终,我放弃了ANTLR作为此选择的工具.我希望自己的手动编码解决方案可能会在下一周或两周出现.
| 归档时间: |
|
| 查看次数: |
1098 次 |
| 最近记录: |