2013-02-12 50 views
10

解析1行注释的方法比这更简单吗?在Pharo中使用PetitParser解析注释

comment 
    ^'//' asParser , 
     (#any asParser starLazy: (#newline asParser)) , 
     #newline asParser 
        ==> [ :result | nil "Ignore comments" ] 
program 
    ^(comment/instruction) star 
     ==> [ :result | N2TProgramNode new 
           setNodes: (result copyWithout: nil) ] 

我特别不确定重复(#newline asParser)和#copyWithout :.

卢卡斯的回答后,我想出了更简单的解决方案如下:

program 
    ^programEntity star 
     ==> [ :result | N2TProgramNode new setNodes: result] 

programEntity 
    ^instruction trim: ignorable 

ignorable 
    ^comment/#space asParser 

comment 
    ^'//' asParser , #newline asParser negate star 

回答

6

为什么不这样的评论解析器的工作呢?你

'//' asParser , #newline asParser negate star 

可能还需要包括注释的解析与trim:空白解析(如果语法允许的话),所以你不必去想它所有的时间。