islands/XmlFeedParser.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Tue, 12 May 2015 01:24:03 +0100
changeset 459 4751c407bb40
parent 387 e2b2ccaa4de6
child 642 77d5fddb6462
permissions -rw-r--r--
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' ]
 	]
! !