【问题标题】:Parsing comments with PetitParser in Pharo在 Pharo 中使用 PetitParser 解析注释
【发布时间】:2025-12-06 00:05:01
【问题描述】:

还有比这更简单的解析 1 行 cmets 的方法吗?

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: 的重复。

在 Lukas 的回答之后,我想出了更简单的以下解决方案:

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

programEntity
    ^ instruction trim: ignorable

ignorable
    ^ comment / #space asParser

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

【问题讨论】:

    标签: smalltalk pharo petitparser


    【解决方案1】:

    为什么下面的评论解析器不能正常工作?

    '//' asParser , #newline asParser negate star
    

    此外,您可能希望将 cmets 的解析包含在 trim: 的空白解析中(如果语法允许的话),因此您不必一直考虑它。

    【讨论】: