我有一些使用ANTLR编写解析器的经验,我正在尝试(自学:)将其中一个移植到PEG (解析表达式语法)。
当我试着去感受这个想法的时候,有一件事让我觉得很麻烦,以至于我觉得我错过了一些东西:如何处理空格。
在ANTLR中,处理空白和注释的正常方法是将标记放在隐藏通道中,但对于PEG语法,没有标记化步骤。考虑到诸如C或Java之类的语言,注释几乎在任何地方都可以使用,人们希望立即“隐藏”注释,但由于注释可能具有语义含义(例如,在生成代码文档、类图等时),因此不会简单地丢弃它们。
那么,有没有办法解决这个问题呢?
发布于 2012-04-13 19:13:35
因为没有单独的标记化阶段,所以没有“时间”来丢弃某些字符(或标记)。
既然您熟悉ANTLR,那么可以这样想:假设ANTLR只处理PEG。所以你只有解析器规则,没有词法分析器规则。现在,你将如何丢弃,比如说,空格?(你不能)。
所以,对你的问题的答案是:你不能,你必须在PEG中用空格规则乱丢你的语法:
ANTLR
add_expr
: Num Add Num
;
Add : '+';
Num : '0'..'9'+;
Space : ' '+ {skip();};钉住
add_expr
: num _ '+' _ num
;
num : '0'..'9'+;
_ : ' '*;发布于 2012-05-06 01:08:31
可以嵌套PEG解析器。其思想是第一个解析器使用字符,并将令牌提供给第二个解析器。第二个PEG解析器使用令牌并执行实际工作。
当然,这意味着与其他解析方案相比,您放弃了解析表达式语法的一个优势: PEG的简单性。
https://stackoverflow.com/questions/10072451
复制相似问题