compiler/PPCompiledParser.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Mon, 23 Nov 2015 11:14:30 +0100
changeset 551 00ebb1b85f53
parent 515 b5316ef15274
permissions -rw-r--r--
Fixed CI scripts on Windows For an unknown reason, unzip on Windows reports status code 50 (presumably "the disk is (or was) full during extraction.") even if there's plenty of space. To workaround this, simply ignore status code 50 on Windows. Sigh.

"{ Package: 'stx:goodies/petitparser/compiler' }"

"{ NameSpace: Smalltalk }"

PPParser subclass:#PPCompiledParser
	instanceVariableNames:'startSymbol context failure error'
	classVariableNames:''
	poolDictionaries:''
	category:'PetitCompiler-Parsers'
!

PPCompiledParser class instanceVariableNames:'parsers constants referringParser startSymbol'

"
 No other class instance variables are inherited by this class.
"
!

!PPCompiledParser class methodsFor:'as yet unclassified'!

acceptsLoggingOfCompilation
    ^ true
!

addConstant: value as: id
    self constants at: id ifPresent: [ 
        ((self constants at: id) = value) ifFalse: [self error: 'ooups']].	
    
    self constants at: id put: value.
!

constants
    constants ifNil: [ constants := IdentityDictionary new ].
    ^ constants
!

parse: input
    ^ self new parse: input
!

referringParser
    ^ referringParser ifNil: [ ^ PPSentinel new ]
!

referringParser: aPPParser
    referringParser := aPPParser
!

startSymbol
    ^ startSymbol ifNil: [ ^ #start ]
!

startSymbol: symbol
    startSymbol := symbol
! !

!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 := self class startSymbol.

    
!

isCompiled
    ^ true
!

isError
    ^ error
!

parse: input rule: symbol
    startSymbol := symbol.
    ^ self parse: input.
!

start
    ^ self subclassResponsibility
!

startSymbol: aSymbol
    startSymbol := aSymbol
! !

!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
! !