SystemOrganization addCategory: #PetitMSE! PPCompositeParser subclass: #PPMSEParser instanceVariableNames: 'elements element attributeValue attribute identifierName primitive reference id string number boolean' classVariableNames: '' poolDictionaries: '' category: 'PetitMSE'! !PPMSEParser commentStamp: '' prior: 0! This defines a parser for the MSE format. Instance Variables: elements element elementName elementId ! !PPMSEParser methodsFor: 'accessing' stamp: 'tg 7/27/2010 09:45'! attribute ^ $( asParser token , identifierName , attributeValue , $) asParser token ==> [:token | Array with: (token at: 2) with: (token at: 3) ]! ! !PPMSEParser methodsFor: 'accessing' stamp: 'tg 7/27/2010 12:25'! attributeValue ^ primitive / reference / element! ! !PPMSEParser methodsFor: 'values' stamp: 'tg 7/27/2010 20:52'! boolean ^ ('true' asParser / 'false' asParser) trim ==> [:token | token = 'true' ifTrue: [true] ifFalse: [token = 'false' ifTrue: [false] ifFalse: [nil]]] ! ! !PPMSEParser methodsFor: 'accessing' stamp: 'tg 7/27/2010 10:46'! element ^ $( asParser token , identifierName , id optional , attribute star , $) asParser token ==> [:token | Array with: (token at: 2) with: (token at: 3) with: (token at: 4) ]! ! !PPMSEParser methodsFor: 'accessing' stamp: 'tg 7/27/2010 15:26'! elements ^ $( asParser trim , element trim star , $) asParser trim ==> [:token | token second ]! ! !PPMSEParser methodsFor: 'accessing' stamp: 'tg 7/27/2010 12:30'! id ^ $( asParser trim , 'id:' asParser trim , #digit asParser star flatten trim , $) asParser trim ==> [:token | Array with: 'id' with: (token at: 3) asNumber ]! ! !PPMSEParser methodsFor: 'accessing' stamp: 'tg 7/27/2010 10:31'! identifierName ^ #word asParser star flatten trim , ( $. asParser flatten trim , #word asParser star flatten trim ==> [:token | token first, token second] ) optional trim ==> [:token | token second isNil ifTrue: [ token first ] ifFalse: [ token first, token second ] ]! ! !PPMSEParser methodsFor: 'values' stamp: 'tg 7/27/2010 21:00'! number ^ ($- asParser optional , #digit asParser plus , ($. asParser , #digit asParser plus) optional) token trim ==> [ :token | token value asNumber ]! ! !PPMSEParser methodsFor: 'values' stamp: 'tg 7/27/2010 10:43'! primitive ^ string / number / boolean" , unlimited"! ! !PPMSEParser methodsFor: 'values' stamp: 'tg 7/27/2010 12:30'! reference ^ $( asParser trim , 'ref:' asParser trim , #digit asParser star flatten trim , $) asParser trim ==> [:token | Array with: 'ref' with: (token at: 3) asNumber ]! ! !PPMSEParser methodsFor: 'accessing' stamp: 'tg 7/25/2010 17:59'! start ^ elements end! ! !PPMSEParser methodsFor: 'values' stamp: 'tg 7/27/2010 16:29'! string ^ ($' asParser , ( $' asParser negate ) star flatten , $' asParser) trim ==> [:token | token second ]! ! PPCompositeParserTest subclass: #PPMSEParserTest instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'PetitMSE'! !PPMSEParserTest methodsFor: 'accessing' stamp: 'tg 7/25/2010 20:10'! parserClass ^ PPMSEParser! ! !PPMSEParserTest methodsFor: 'testing' stamp: 'tg 7/25/2010 20:10'! testEmpty self assert: '()' is: #(). self assert: '( )' is: #(). self assert: ' ( ) ' is: #()! ! !PPMSEParserTest methodsFor: 'testing' stamp: 'tg 7/27/2010 20:58'! testOneElement self assert: '((X.Y))' is: #(('X.Y' nil #())). self assert: '((X))' is: #(('X' nil #()))! ! !PPMSEParserTest methodsFor: 'testing' stamp: 'tg 7/27/2010 20:53'! testOneElementWithBooleanAttribute self assert: '((FAMIX.Class (name true)))' is: #(('FAMIX.Class' nil #(('name' true))))! ! !PPMSEParserTest methodsFor: 'testing' stamp: 'tg 7/27/2010 12:30'! testOneElementWithId self assert: '((FAMIX.Class (id: 1)))' is: #(('FAMIX.Class' #('id' 1) #()))! ! !PPMSEParserTest methodsFor: 'testing' stamp: 'tg 7/27/2010 21:01'! testOneElementWithNumericAttribute self assert: '((X.Y (attribute 2)))' is: #(('X.Y' nil #(('attribute' 2)))). self assert: '((X.Y (attribute 2.1)))' is: #(('X.Y' nil #(('attribute' 2.1)))). self assert: '((X.Y (attribute 1234.567)))' is: #(('X.Y' nil #(('attribute' 1234.567))))! !