有没有比这更简单的解析1行注释的方法了?

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

最佳答案

为什么以下注释解析器也不能正常工作?

'//' asParser , #newline asParser negate star

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

关于smalltalk - 在Pharo中用PetitParser解析注释,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14832807/

10-10 17:47