Поиск токенов в строке Smalltalk с помощью PetitParser
Я хочу разобрать
'This,is,an,example,text'
как в findTokens
'This,is,an,example,text' findTokens: $,
an OrderedCollection('This' 'is' 'an' 'example' 'text')
но не могу понять, как это сделать с PetitParser, delimitedBy: и separaBy: мне не помогло, я пытался
( #any asParser delimitedBy: $, asParser ) plus flatten parse: 'This,is,an,example,text'
но явно не сработало
4 ответа
Я использую этот шаблон все время с PetitParser, когда хочу что-то исключить. Просто определите либо "что я ищу", либо "что я хочу исключить" (что проще описать) как синтаксический анализатор, а затем отрицайте его и обрабатывайте по мере необходимости.
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.
Ты можешь использовать delimitedBy:
в комбинации с withoutSeparators
:
|text parser|
text := 'This,is,an,example,text'.
parser := (#word asParser plus flatten delimitedBy: ($, asParser)) withoutSeparators.
parser parse: text
Кажется, недавнее улучшение PetitParser.
a #delimitedBy: b
расширяется до a , (b , a) star
так что ваш парсер как есть говорит "дайте мне один символ, разделенный запятыми".
Это не очень читабельно, но это делает то, что вы хотите:
((($, asParser not , #any asParser) ==> [:nodes | nodes second])
plus flatten delimitedBy: $, asParser
Первый пункт гласит: "Разобрать все, что не является запятой". Так дано '12,24'
ты получаешь #('12' $, '24')
,
Пытаться
(#word asParser plus flatten separatedBy: $, asParser)
==> [:nodes| nodes copyWithout: $, ]
Надеюсь я понял что ты хотел