Поиск токенов в строке Smalltalk с помощью PetitParser - PullRequest
7 голосов
/ 18 октября 2011

хочу разобрать

'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 ]

3 голосов
/ 04 сентября 2012

Вы можете использовать delimitedBy: в сочетании с withoutSeparators:

|text parser|

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

parser parse: text

Кажется, недавнее улучшение PetitParser.

2 голосов
/ 18 октября 2011

a #delimitedBy: b расширяется до a , (b , a) star, поэтому ваш синтаксический анализатор "как есть" говорит "дайте мне один символ, разделенный запятыми".

Он не очень читабелен, но он делает то, что вы хотите:

((($, asParser not , #any asParser) ==> [:nodes | nodes second])
  plus flatten delimitedBy: $, asParser

В первом предложении написано "разобрать все, что не является запятой".Итак, учитывая '12,24', вы получаете #('12' $, '24').

1 голос
/ 18 октября 2011

Я использую этот шаблон все время с 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.
1 голос
/ 18 октября 2011

Попробуйте

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

Надеюсь, я понял, что вы хотели

...