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:
,但在我看来,它需要您自己的类来收集令牌。