compiler/PPCTokenCodeGenerator.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Fri, 24 Jul 2015 15:06:54 +0100
changeset 502 1e45d3c96ec5
parent 464 f6d77fee9811
child 503 ff58cd9f1f3c
child 515 b5316ef15274
permissions -rw-r--r--
Updated to PetitCompiler-JanVrany.135, PetitCompiler-Tests-JanKurs.93, PetitCompiler-Extras-Tests-JanVrany.16, PetitCompiler-Benchmarks-JanKurs.12 Name: PetitCompiler-JanVrany.135 Author: JanVrany Time: 22-07-2015, 06:53:29.127 PM UUID: 890178b5-275d-46af-a2ad-1738998f07cb Ancestors: PetitCompiler-JanVrany.134 Name: PetitCompiler-Tests-JanKurs.93 Author: JanKurs Time: 20-07-2015, 11:30:10.283 PM UUID: 6473e671-ad70-42ca-b6c3-654b78edc531 Ancestors: PetitCompiler-Tests-JanKurs.92 Name: PetitCompiler-Extras-Tests-JanVrany.16 Author: JanVrany Time: 22-07-2015, 05:18:22.387 PM UUID: 8f6f9129-dbba-49b1-9402-038470742f98 Ancestors: PetitCompiler-Extras-Tests-JanKurs.15 Name: PetitCompiler-Benchmarks-JanKurs.12 Author: JanKurs Time: 06-07-2015, 02:10:06.901 PM UUID: cb24f1ac-46a4-494d-9780-64576f0f0dba Ancestors: PetitCompiler-Benchmarks-JanKurs.11, PetitCompiler-Benchmarks-JanVrany.e29bd90f388e.20150619081300

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

"{ NameSpace: Smalltalk }"

PPCCodeGenerator subclass:#PPCTokenCodeGenerator
	instanceVariableNames:''
	classVariableNames:''
	poolDictionaries:''
	category:'PetitCompiler-Visitors'
!

!PPCTokenCodeGenerator methodsFor:'as yet unclassified'!

afterAccept: node retval: retval
    | return |
    return := super afterAccept: node retval: retval.
    return category: 'generated - tokens'.
    ^ return
!

fromTokenMode
    compiler rememberStrategy: (PPCCompilerTokenizingRememberStrategy on: compiler).
    compiler errorStrategy: (PPCCompilerTokenizingErrorStrategy on: compiler).
!

toTokenMode
    compiler rememberStrategy: (PPCCompilerTokenRememberStrategy on: compiler).	
    compiler errorStrategy: (PPCCompilerTokenErrorStrategy on: compiler).
! !

!PPCTokenCodeGenerator methodsFor:'visiting'!

visitOptionalNode: node
    compiler 
          codeAssignParsedValueOf:[ self visit:node child ]
          to:self retvalVar.
    compiler codeAssign: 'false.' to: 'error'.
    compiler codeReturn.
!

visitTokenNode: node
    | id startVar endVar  |
    "Tokens cannot be inlined, 
        - their result is true/false
        - the return value is always stored in currentTokenValue
        - the current token type is always stored in currentTokenType
    "
    self assert: node isMarkedForInline not.	
    
    startVar := compiler allocateTemporaryVariableNamed: 'start'.
    endVar := compiler allocateTemporaryVariableNamed: 'end'.

    id := compiler idFor: node.
    self toTokenMode.

    compiler add: 'currentTokenType isNil ifFalse: [ ^ currentTokenType == ', id storeString, '].'.	
    compiler profileTokenRead: id.
    
    node allNodes size > 2 ifTrue: [ 
        self addGuard: node ifTrue: nil  ifFalse: [ compiler addOnLine: '^ false' ].
    ].

    
    compiler codeAssign: 'context position + 1.' to: startVar.
    compiler codeAssignParsedValueOf:[ self visit:node child ] to:#whatever.
    compiler add: 'error ifTrue: [ ^ error := false ].'.

    compiler codeAssign: 'context position.' to: endVar.

    compiler codeTranscriptShow: 'current token type: ', id storeString.
    compiler codeAssign: id storeString, '.' to: 'currentTokenType'.
    compiler codeAssign: node tokenClass asString, ' on: (context collection) 
                                                                start: ', startVar, '  
                                                                stop: ', endVar, '
                                                                value: nil.'
                to: 'currentTokenValue := ', self retvalVar.
    
        
    compiler codeClearError.
    compiler add: '^ true'.

    self fromTokenMode.
!

visitTrimmingTokenCharacterNode: node
    |  id     |

    "Tokens cannot be inlined, 
        - their result is true/false
        - the return value is always stored in currentTokenValue
        - the current token type is always stored in currentTokenType
    "
    self assert: node isMarkedForInline not.
    
    id := compiler idFor: node.
    self toTokenMode.
    
    compiler add: 'currentTokenType isNil ifFalse: [ ^ currentTokenType == ', id storeString, '].'.
    compiler profileTokenRead: id.

    self addGuard: node ifTrue: nil ifFalse: [ compiler addOnLine: ' ^ false' ].

    compiler add: 'context next.'.

    compiler codeTranscriptShow: 'current token type: ', id storeString.
    compiler codeAssign: id storeString, '.' to: 'currentTokenType'.
    compiler codeAssign: node tokenClass asString, ' on: (context collection) 
                                                            start: context position 
                                                            stop: context position
                                                            value: nil.'
               to: 'currentTokenValue := ', self retvalVar.
    
    compiler addComment: 'Consume Whitespace:'.
    compiler 
          codeAssignParsedValueOf:[ self visit:node whitespace ]
          to:#whatever.
    compiler nl.
    
    compiler add: '^ true'.

    self fromTokenMode.
!

visitTrimmingTokenNode: node
    |  id  startVar endVar  |

    "Tokens cannot be inlined, 
        - their result is true/false
        - the return value is always stored in currentTokenValue
        - the current token type is always stored in currentTokenType
    "
    self assert: node isMarkedForInline not.
    
    startVar := compiler allocateTemporaryVariableNamed: 'start'.
    endVar := compiler allocateTemporaryVariableNamed:  'end'.
    
    id := compiler idFor: node.
    self toTokenMode.
    
    compiler add: 'currentTokenType isNil ifFalse: [ ^ currentTokenType == ', id storeString, '].'.
    compiler profileTokenRead: id.
    
    node allNodes size > 2 ifTrue: [ 
        self addGuard: node ifTrue: nil  ifFalse: [ compiler addOnLine: '^ false' ].
    ].

    compiler codeAssign: 'context position + 1.' to: startVar.
    compiler codeAssignParsedValueOf:[ self visit:node child ] to:#whatever.

    compiler add: 'error ifTrue: [ ^ error := false ].'.

        compiler codeAssign: 'context position.' to: endVar.
    
        compiler addComment: 'Consume Whitespace:'.
        compiler 
              codeAssignParsedValueOf:[ self visit:node whitespace ]
              to:#whatever.
        compiler nl.
    
    
        compiler codeTranscriptShow: 'current token type: ', id storeString.
        compiler codeAssign: id storeString, '.' to: 'currentTokenType'.
        compiler codeAssign: node tokenClass asString, ' on: (context collection) 
                                                                start: ', startVar, ' 
                                                                stop: ', endVar, '
                                                                value: nil.'
                   to: 'currentTokenValue := ', self retvalVar.

    compiler codeClearError.
    compiler add: '^ true'.

    self fromTokenMode.
! !