compiler/PPCTokenCodeGenerator.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Tue, 12 May 2015 01:24:03 +0100
changeset 459 4751c407bb40
child 461 5986bf6d7d60
child 464 f6d77fee9811
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/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
! !

!PPCTokenCodeGenerator methodsFor:'visiting'!

visitTokenNode: node
    | id startVar endVar |
    startVar := compiler allocateTemporaryVariableNamed: 'start'.
    endVar := compiler allocateTemporaryVariableNamed: 'end'.

    id := compiler idFor: node.
    compiler rememberStrategy: (PPCCompilerTokenRememberStrategy on: compiler).	
    
    compiler codeAssign: 'context position + 1.' to: startVar.
    compiler codeStoreValueOf: [ self visit: node child ] intoVariable: #whatever.
    compiler add: 'error ifFalse: [ '.
    compiler indent.	
        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 codeReturn.
    compiler dedent.
    compiler add: '].'.		
    compiler rememberStrategy: (PPCCompilerTokenizingRememberStrategy on: compiler).	
!

visitTrimmingTokenNode: node
    |  id  startVar endVar |
    
    startVar := compiler allocateTemporaryVariableNamed: 'start'.
    endVar := compiler allocateTemporaryVariableNamed:  'end'.
    
    id := compiler idFor: node.
    compiler rememberStrategy: (PPCCompilerTokenRememberStrategy on: compiler).
    
    
    compiler addComment: 'Consume Whitespace:'.
    compiler codeStoreValueOf: [ self visit: node whitespace ] intoVariable: #whatever.
    compiler nl.

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

    compiler add: 'error ifFalse: [ '.
    compiler indent.	
        compiler codeAssign: 'context position.' to: endVar.
    
        compiler addComment: 'Consume Whitespace:'.
        compiler codeStoreValueOf: [ self visit: node whitespace ] intoVariable: #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 codeReturn.
    compiler dedent.																
    compiler add: '].'	.
    compiler rememberStrategy: (PPCCompilerTokenizingRememberStrategy on: compiler).
! !