Parser generator PEG和空格/注释

Parser generator PEG和空格/注释,parser-generator,peg,Parser Generator,Peg,我有一些使用ANTLR编写解析器的经验,我正在尝试(为了自我教育:)将其中一个移植到PEG(解析表达式语法) 当我试图对这个想法有所了解时,有一件事让我觉得很麻烦,以至于我觉得我错过了一些东西:如何处理空白 在ANTLR中,处理空白和注释的常规方法是将标记放在隐藏通道中,但对于PEG语法,没有标记化步骤。考虑到像C或Java这样的语言,几乎所有地方都允许注释,人们希望立即“隐藏”注释,但由于注释可能具有语义意义(例如,在生成代码文档、类图等时),人们不希望只丢弃它们 那么,有没有办法解决这个问题

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

当我试图对这个想法有所了解时,有一件事让我觉得很麻烦,以至于我觉得我错过了一些东西:如何处理空白

在ANTLR中,处理空白和注释的常规方法是将标记放在隐藏通道中,但对于PEG语法,没有标记化步骤。考虑到像C或Java这样的语言,几乎所有地方都允许注释,人们希望立即“隐藏”注释,但由于注释可能具有语义意义(例如,在生成代码文档、类图等时),人们不希望只丢弃它们


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

因为没有单独的标记化阶段,所以没有“时间”来丢弃某些字符(或标记)

既然您熟悉ANTLR,可以这样想:假设ANTLR只处理PEG。所以您只有解析器规则,没有lexer规则。那么,你会如何丢弃,比如说,空格呢?(你不能)

所以,你的问题的答案是:你不能,你必须在你的语法中加入空格规则:

ANTLR 钉
可以嵌套PEG解析器。其思想是,第一个解析器使用字符并将令牌提供给第二个解析器。第二个PEG解析器使用令牌并执行实际工作


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

这正是我所怀疑的。我只是想确认我没有从根本上误解什么。谢谢很好的回答,我几乎想使用另一个解析器生成器,直到我看到您的答案使用“\”,这使PEG更具可读性!你为什么要这样做?如果不能在顶级解析器中定义终端/非终端,则第二个解析器将不会有帮助。。。
add_expr
 : Num Add Num
 ;

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

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