diff -r 17ba167b8ee1 -r 553a5456963b compiler/PPCompiledParser.st --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/compiler/PPCompiledParser.st Sun Oct 26 01:03:31 2014 +0000 @@ -0,0 +1,144 @@ +"{ Package: 'stx:goodies/petitparser/compiler' }" + +PPParser subclass:#PPCompiledParser + instanceVariableNames:'startSymbol context failure error' + classVariableNames:'' + poolDictionaries:'' + category:'PetitCompiler-Core' +! + +PPCompiledParser class instanceVariableNames:'parsers constants referringParser' + +" + No other class instance variables are inherited by this class. +" +! + +PPCompiledParser comment:'' +! + +!PPCompiledParser class methodsFor:'as yet unclassified'! + +addConstant: value as: id + self constants at: id ifPresent: [ + ((self constants at: id) = value) ifFalse: [self error: 'ooups']]. + + self constants at: id put: value. +! + +addParser: aPPParser as: id + + "(self parsers includesKey: id) ifTrue: [self error: 'Ooups' ]." + self parsers at: id put: aPPParser. +! + +constants + constants ifNil: [ constants := IdentityDictionary new ]. + ^ constants +! + +parse: input + ^ self new parse: input +! + +parsers + parsers ifNil: [ parsers := IdentityDictionary new ]. + ^ parsers +! + +referringParser + ^ referringParser +! + +referringParser: aPPParser + referringParser := aPPParser +! ! + +!PPCompiledParser methodsFor:'as yet unclassified'! + +callParser: id + | retval | + retval := (self class parsers at: id) parseOn: context. + retval isPetitFailure ifTrue: [ self error: retval message at: retval position ] + ifFalse: [ self clearError ]. + ^ retval +! + +clearError + error := false. +! + +error + ^ self error: '' at: context position +! + +error: message + ^ self error: message at: context position +! + +error: aMessage at: position + failure position < position ifTrue: [ + failure message: aMessage. + failure position: position + ]. + error := true. + ^ failure +! + +initialize + super initialize. + + self class constants keysAndValuesDo: [ :key :value | + self instVarNamed: key put: value. + ]. + + startSymbol := #start. + + + +! + +isCompiled + ^ true +! + +isError + ^ error +! + +parse: input rule: symbol + startSymbol := symbol. + ^ self parse: input. +! + +start + ^ self subclassResponsibility +! + +startSymbol: aSymbol + startSymbol := aSymbol +! + +updateContext: aPPContext + self class referringParser allParsersDo: [ :p | p updateContext: aPPContext ]. +! ! + +!PPCompiledParser methodsFor:'parsing'! + +parseOn: aPPContext + | retval | +" context := aPPContext asCompiledParserContext." + context := aPPContext. + context compiledParser: self. + failure := PPFailure new message: nil; context: context; position: -1. + context noteFailure: failure. + error := false. + + retval := self perform: startSymbol. + (retval isPetitFailure) ifTrue: [ aPPContext noteFailure: failure ]. + error ifTrue: [ aPPContext noteFailure: failure. retval := failure ]. + +" aPPContext position: context position." + ^ retval +! ! +