compiler/PPCTokenizingConfiguration.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Mon, 17 Aug 2015 12:56:02 +0100
changeset 516 3b81c9e53352
parent 477 b18b6cc7aabc
parent 515 b5316ef15274
child 525 751532c8f3db
permissions -rw-r--r--
Merge

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

"{ NameSpace: Smalltalk }"

PPCConfiguration subclass:#PPCTokenizingConfiguration
	instanceVariableNames:'codeGen'
	classVariableNames:''
	poolDictionaries:''
	category:'PetitCompiler-Core'
!


!PPCTokenizingConfiguration methodsFor:'compiling'!

buildClass: compiler
    |  builder |
    builder := PPCClassBuilder new.
    
    builder compiledClassName: arguments parserName.
    builder compiledSuperclass: PPTokenizingCompiledParser.
    builder methodDictionary: compiler methodDictionary.
    builder constants: compiler constants.

    ^ builder compileClass.	
!

invokePhases
    self toPPCIr.
    self createTokens.
    self cacheFirstFollow.
    self createLL1Choices.
    self tokenize.
    self merge.
    self specialize.
    self createRecognizingComponents.
    self specialize.
    self inline.
    self merge.
    self check.	
    self cacheFirstFollow.
    self generateScanner.		"Please note that codeGen is shared between these two phases"
    self generate.
! !

!PPCTokenizingConfiguration methodsFor:'hooks'!

codeCompiler
    codeGen isNil ifTrue: [ codeGen := PPCTokenizingCodeGen on: arguments ].
    ^ codeGen
!

codeCompilerOn: args
    ^ PPCTokenizingCompiler on: args
!

codeGeneratorVisitorOn: compiler
    ^ PPCTokenizingCodeGenerator on: compiler
! !

!PPCTokenizingConfiguration methodsFor:'phases'!

createLL1Choices
    ir :=  PPCLL1Visitor new
        arguments: arguments;
        visit: ir.
    self remember: #LL1
!

generateScanner
    | generator scanner |
    generator :=  PPCTokenCodeGenerator new
        compiler: self codeCompiler;
        arguments: arguments;
        yourself.

    generator visit: ir.
    
    scanner := generator compileScanner.	
    self codeCompiler addConstant: scanner as: #scannerClass.
!

tokenize
    "
        This will try transform the parser into the tokenizing parser
    "
    arguments tokenize ifFalse: [ ^ self ] .
    
    ir :=  PPCTokenizingVisitor new
        arguments: arguments;
        visit: ir.
    self remember: #tokenize
! !

!PPCTokenizingConfiguration class methodsFor:'documentation'!

version_HG

    ^ '$Changeset: <not expanded> $'
! !