Parsing 使用PetitPasser在Smalltalk字符串中查找令牌

Parsing 使用PetitPasser在Smalltalk字符串中查找令牌,parsing,smalltalk,petitparser,Parsing,Smalltalk,Petitparser,我想解析 'This,is,an,example,text' 就像findTokens一样 'This,is,an,example,text' findTokens: $, an OrderedCollection('This' 'is' 'an' 'example' 'text') 但是我不知道如何使用PetitPasser,delimitedBy:和separatedBy:来完成它,这对我没有帮助我试过了 ( #any asParser delimitedBy: $, asParser

我想解析

'This,is,an,example,text'
就像findTokens一样

'This,is,an,example,text' findTokens: $, 
an OrderedCollection('This' 'is' 'an' 'example' 'text')
但是我不知道如何使用PetitPasser,delimitedBy:和separatedBy:来完成它,这对我没有帮助我试过了

( #any asParser delimitedBy: $, asParser ) plus flatten parse:  'This,is,an,example,text'
但显然不起作用

a#由:b分隔
扩展为
a,(b,a)星型
,因此您的解析器按原样说“给我一个用逗号分隔的字符”

它的可读性不是很强,但这正是您想要的:

((($, asParser not , #any asParser) ==> [:nodes | nodes second])
  plus flatten delimitedBy: $, asParser
第一个子句说“解析任何不是逗号的东西”。因此,给定
'12,24'
您将得到
#('12'$,'24')

试试看

(#word asParser plus flatten separatedBy: $, asParser) 
     ==> [:nodes| nodes copyWithout: $, ]

我希望我能理解你想要什么

当我想排除某些内容时,我一直在使用PetitPasser的这种模式。只需将“我在寻找什么”或“我想排除什么”(以更容易描述的为准)定义为解析器,然后否定它,并根据需要进行处理

s := 'This,is,an,example,text'.
separator := $, asParser ==> [ :n | nil ].
token := separator negate plus flatten.
p := (token separatedBy: separator) ==> [ :nodes |
    nodes copyWithout: nil ].
p parse: s.

您可以通过以下方式使用
分隔符:
与不带分隔符的
组合使用

|text parser|

text := 'This,is,an,example,text'.
parser := (#word asParser plus flatten delimitedBy: ($, asParser)) withoutSeparators.

parser parse: text

这似乎是PetitPasser最近的一项改进。

是的,唯一的问题是,如果单词包含任何非字母字符,将破坏解析不?是的,它会。我只是在模仿你的榜样。您需要指定真正需要解析的内容。如果这是一切,你可能会更好地与$,阿斯帕瑟否定肖恩建议这
copyWithout:
真的觉得难看。。。我想有一种方法可以避免这种情况,那就是定义一个变量
separatedBy:
,该变量首先不会将分隔符添加到输出中……另一种解决方案可以是使用
foldLeft:
,但在我看来,它需要您自己的类来收集令牌。