Hi Sean,
Looks ok, but I think it's a bit too particular to your input.
Some things you could take into account:
- the delimiter should probably allow multiple white spaces both before and after the
comma. You could replace the definition like:
delimiter := $, asParser trim.
- the item should probably be defined in terms of what can go inside, not just as a
negation of delimiter and listClose. This would allow you to transform the values into
corresponding Smalltalk objects. So, for example, if you only want to allow strings then
you can define the item like:
item := $" asParser , $" asParser negate star flatten , $" asParser ==>
#second.
So, all in all:
| delimiter item contents listParser |
delimiter := $, asParser trim.
item := $" asParser , $" asParser negate star flatten , $" asParser ==>
#second.
contents := (item separatedBy: delimiter) ==> [ :nodes | nodes reject: [ :n | n = $, ]
].
listParser := ${ asParser, contents optional, $} asParser ==> #second.
listParser parse: '{"lo, gin", "bash"}'.
==> #('lo, gin' 'bash')
Cheers,
Doru
On 25 Feb 2012, at 13:44, Sean P. DeNigris wrote:
What do you think of this PetitParser example? Is
there a better way to do
this?
Parse a string like '{"login", "bash"}' (an Applescript list)
into a
collection of items (i.e. #("login" "bash))...
| delimiter item contents listParser result listClose |
delimiter := ', ' asParser trim.
listClose := $} asParser.
item := (delimiter / listClose) negate plus flatten.
contents := (item separatedBy: delimiter) ==> [ :nodes | nodes reject: [ :n
| n = ', ' ] ].
listParser := ${ asParser, contents optional, listClose ==> #second.
result := listParser parse: returnString.
^ result isNil
ifTrue: [ OrderedCollection new ]
ifFalse: [ result collect: [ :e | self processAtom: e ] ].
Thanks.
Sean
--
View this message in context:
http://forum.world.st/PetitParser-Example-tp4420008p4420008.html
Sent from the Moose mailing list archive at
Nabble.com.
_______________________________________________
Moose-dev mailing list
Moose-dev(a)iam.unibe.ch
https://www.iam.unibe.ch/mailman/listinfo/moose-dev
--
www.tudorgirba.com
"Live like you mean it."