PEG和空白/评论

时间:2012-04-09 11:21:33

标签: parser-generator peg

我有一些使用ANTLR编写解析器的经验,我正在尝试(自我教育:))将其中一个移植到PEG(解析表达式语法)。

当我想要了解这个想法时,有一件事让我觉得麻烦,我觉得我已经错过了一些:如何处理空白。

在ANTLR中,处理空格和注释的常规方法是将令牌放在隐藏的通道中,但是使用PEG语法时,没有标记化步骤。考虑到诸如C或Java之类的语言,几乎在任何地方都允许使用注释,人们希望立即“隐藏”注释,但由于注释可能具有语义含义(例如,在生成代码文档,类图等时),不愿意放弃它们。

那么,有没有办法解决这个问题?

2 个答案:

答案 0 :(得分:8)

由于没有单独的标记化阶段,因此没有“时间”来丢弃某些字符(或标记)。

由于你熟悉ANTLR,所以想想这样:让我们说ANTLR只处理PEG。所以你只有解析器规则,没有词法分析器规则。现在,你会如何丢弃空格? (你不能)。

所以,你回答的问题是:你不能,你将不得不用PEG中的空间规则乱丢你的语法:

ANTLR

add_expr
 : Num Add Num
 ;

Add   : '+';
Num   : '0'..'9'+;
Space : ' '+ {skip();};

PEG

add_expr
 : num _ '+' _ num
 ;

num : '0'..'9'+;
_   : ' '*;

答案 1 :(得分:2)

可以嵌套PEG解析器。这个想法是第一个解析器消耗字符并将令牌提供给第二个解析器。第二个PEG解析器使用令牌并完成实际工作。

当然,这意味着与其他解析方案相比,您放弃了解析表达式语法的一个优势:PEG的简单性。