是否有更简单的方法来解析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
我正在寻找使用PetitParser以及测试包中提供的PPArithmeticParser和PPLambdaParser以及Lukas的几篇博客文章的其他示例?如果有人愿意与他们分享,那将非常感激.
更新:https
 
://github.com/NicolasPetton/jtalk/blob/master/st/parser.st更新:https://github.com/dmatveev/waste/blob/master/wastex.st
让他们来吧!
我想解析
'This,is,an,example,text'
就像在findTokens中一样
'This,is,an,example,text' findTokens: $, 
an OrderedCollection('This' 'is' 'an' 'example' 'text')
但无法弄清楚怎么用PetitParser,delimitedBy:和separatedBy:没有帮助我,我尝试过
( #any asParser delimitedBy: $, asParser ) plus flatten parse:  'This,is,an,example,text'
但显然没有用
这是我试图在PetitParser中实现的(简化的)EBNF部分:
variable :: component / identifier
component :: indexed / field
indexed :: variable , $[ , blah , $]
field :: variable , $. , identifier
我所做的是将所有这些产品(除外identifier)添加为我的子类的ivars,PPCompositeParser并定义相应的方法如下:
variable
  ^component / self identifier
component
  ^indexed / field
identifier
  ^(#letter asParser, (#word asParser) star) flatten
indexed
  ^variable , $[ asParser, #digit asParser, $] asParser
field
  ^variable , $. asParser, self identifier
start
  ^variable
最后,我创建了一个新的解析器实例并向其发送了消息parse: 'a.b[0]'.
问题:我得到了堆栈溢出.
在http://pharobooks.gforge.inria.fr/PharoByExampleTwo-Eng/latest/中,定义了ExpressionGrammar.但是,它是正确联想的
parser parse: '1 + 2 + 6'.    ======> #(1 $+ #(2 $+ 6))
我怎样才能使它成为左关联的呢
parser parse: '1 + 2 + 6'.
结果是
#(#(1 $+ 2) $+ 6)
?
我注意到PetitParserDart@override在代码中有很多,但我不知道如何检查它们?
我尝试了 IDEA dart-plugin for @override,但它根本没有效果。我们如何@override与 Dart 一起使用?
我定义了一个规则:
def("invokation", char('@').word().plus().flatten());
对于“@who”,它将匹配并得到@who结果。
怎么问它只返回who而不带@?
我想使用PetitParser解析编程语言中的标识符.
其中一个要求是标识符的名称不是关键字(例如null),因此它null不是有效的标识符.
我能为这种情况考虑的最小解析器是:
identifier := ('null' asParser not,  #word asParser plus)
但是,如果输入以关键字开头,则失败:
identifier end parse: 'nullable'
你有什么建议可以解决这个问题吗?谢谢!
我想要一个只识别0到32767之间的数字的解析规则.我尝试过类似的东西:
integerConstant
  ^ (#digit asParser min: 1 max: 5) flatten
      ==> [ :string | | value |
            value := string asNumber.
            (value between: 0 and: 32767)
              ifTrue: [ value ]
              ifFalse: [ **???** ]]
但我不知道该怎么写??? 我想过返回一个PPFailure,但这需要知道流的位置.
我目前有一个方法
pMain
| parser |  
parser :=  'proc' asParser, #space asParser,  "<---- im trying to use the method identifier here - so i tried self identifier, instead of 'proc' asParser
            #letter asParser plus, $( asParser, 
           'int' asParser,#space asParser, 
           #letter asParser plus, $) asParser, 
           #space asParser, 'corp' asParser.    
   ^ parser
我也有这两种方法
1-关键词方法
keywords
^ keywords ifNil: [
    keywords := Set newFrom: #(
        proc corp
        if then else fi
        do od
        print as
        while
        for from to by
        return
        int string real …petitparser ×10
smalltalk ×8
parsing ×5
pharo ×5
dart ×2
dart-mirrors ×1
overriding ×1
visualworks ×1