我有一些使用ANTLR编写解析器的经验,我正在尝试(自我教育:))将其中一个移植到PEG(解析表达式语法)。
当我想要了解这个想法时,有一件事让我觉得麻烦,我觉得我已经错过了一些:如何处理空白。
在ANTLR中,处理空格和注释的常规方法是将令牌放在隐藏的通道中,但是使用PEG语法时,没有标记化步骤。考虑到诸如C或Java之类的语言,几乎在任何地方都允许使用注释,人们希望立即“隐藏”注释,但由于注释可能具有语义含义(例如,在生成代码文档,类图等时),不愿意放弃它们。
那么,有没有办法解决这个问题?
答案 0 :(得分:8)
由于没有单独的标记化阶段,因此没有“时间”来丢弃某些字符(或标记)。
由于你熟悉ANTLR,所以想想这样:让我们说ANTLR只处理PEG。所以你只有解析器规则,没有词法分析器规则。现在,你会如何丢弃空格? (你不能)。
所以,你回答的问题是:你不能,你将不得不用PEG中的空间规则乱丢你的语法:
add_expr
: Num Add Num
;
Add : '+';
Num : '0'..'9'+;
Space : ' '+ {skip();};
add_expr
: num _ '+' _ num
;
num : '0'..'9'+;
_ : ' '*;
答案 1 :(得分:2)
可以嵌套PEG解析器。这个想法是第一个解析器消耗字符并将令牌提供给第二个解析器。第二个PEG解析器使用令牌并完成实际工作。
当然,这意味着与其他解析方案相比,您放弃了解析表达式语法的一个优势:PEG的简单性。