Merged with PetitCompiler-JanKurs.20150510144201, PetitCompiler-Tests-JanKurs.20150510144201, PetitCompiler-Extras-Tests-JanKurs.20150510144201, PetitCompiler-Benchmarks-JanKurs.20150510144201
Name: PetitCompiler-JanKurs.20150510144201
Author: JanKurs
Time: 10-05-2015, 04:42:29.192 PM
UUID: 58a4786b-1182-4904-8b44-a13d3918f244
Name: PetitCompiler-Tests-JanKurs.20150510144201
Author: JanKurs
Time: 10-05-2015, 04:32:12.870 PM
UUID: 2a8fd41a-331b-4dcf-a7a3-752a50ce86e7
Name: PetitCompiler-Extras-Tests-JanKurs.20150510144201
Author: JanKurs
Time: 10-05-2015, 04:59:25.308 PM
UUID: ef43bd1a-be60-4e88-b749-8b635622c969
Name: PetitCompiler-Benchmarks-JanKurs.20150510144201
Author: JanKurs
Time: 10-05-2015, 05:04:54.561 PM
UUID: d8e764fd-016b-46e2-9fc1-17c38c18f0e5
"{ Package: 'stx:goodies/petitparser/islands' }"
"{ NameSpace: Smalltalk }"
PPCompositeParser subclass:#XmlFeedParser
instanceVariableNames:'item openItem itemContent closeItem openShoplist shoplistContent
closeShoplist shoplist simpleElement stringValue'
classVariableNames:''
poolDictionaries:''
category:'PetitIslands-Examples'
!
XmlFeedParser comment:'A XmlFeedParser is Parser of a fake shop feed. Shop feed is a XML file with information about shop products. Shop feed can be malformed (for any reason) the parser will recover from malformed item and will continue on the next valid item.
Instance Variables
closeItem: <Object>
closeName: <Object>
closeShoplist: <Object>
item: <Object>
itemContent: <Object>
name: <Object>
nameContent: <Object>
openItem: <Object>
openName: <Object>
openShoplist: <Object>
shoplist: <Object>
shoplistContent: <Object>
simpleElement: <Object>
stringValue: <Object>
closeItem
- xxxxx
closeName
- xxxxx
closeShoplist
- xxxxx
item
- xxxxx
itemContent
- xxxxx
name
- xxxxx
nameContent
- xxxxx
openItem
- xxxxx
openName
- xxxxx
openShoplist
- xxxxx
shoplist
- xxxxx
shoplistContent
- xxxxx
simpleElement
- xxxxx
stringValue
- xxxxx
'
!
!XmlFeedParser methodsFor:'grammar'!
item
^ (openItem, itemContent trim, closeItem) trim ==> #second
!
itemContent
^ (simpleElement trim star) ==> self elementsToDictionaryBlock
!
shoplist
^ (openShoplist, shoplistContent, closeShoplist) trim ==> #second
!
shoplistContent
^ (item island ==> #second) star
!
start
^ shoplist
!
stringValue
^ (#letter asParser / #digit asParser) star flatten trim
! !
!XmlFeedParser methodsFor:'tags'!
closeItem
^ '</' asParser, 'item' asParser trim, '>' asParser
!
closeShoplist
^ '</' asParser, 'shoplist' asParser trim, '>' asParser
!
openItem
^ '<' asParser, 'item' asParser trim, '>' asParser
!
openShoplist
^ '<' asParser, 'shoplist' asParser trim, '>' asParser
! !
!XmlFeedParser methodsFor:'xmlSupport'!
elementsToDictionaryBlock
^ [ :elements | | d |
d := Dictionary new.
elements do: [ :e | d at: e first asSymbol put: e second ].
d
]
!
simpleElement
^ (
(('<' asParser, stringValue trim, '>' asParser) ==> #second),
stringValue,
(('</' asParser, stringValue trim, '>' asParser) ==> #second)
) ==> [ :elements |
(elements first = elements third)
ifTrue: [ Array with: elements first with: elements second ]
ifFalse: [ PPFailure message: 'malformed element' ]
]
! !