compiler/PPCTokenizingCodeGenerator.st
changeset 460 87a3d30ab570
parent 454 a9cd5ea7cc36
parent 459 4751c407bb40
child 465 f729f6cd3c76
equal deleted inserted replaced
458:a4da1c24d84a 460:87a3d30ab570
     1 "{ Package: 'stx:goodies/petitparser/compiler' }"
     1 "{ Package: 'stx:goodies/petitparser/compiler' }"
     2 
     2 
     3 "{ NameSpace: Smalltalk }"
     3 "{ NameSpace: Smalltalk }"
     4 
     4 
     5 PPCCodeGenerator subclass:#PPCTokenizingCodeGenerator
     5 PPCCodeGenerator subclass:#PPCTokenizingCodeGenerator
     6 	instanceVariableNames:''
     6 	instanceVariableNames:'tokenGenerator'
     7 	classVariableNames:''
     7 	classVariableNames:''
     8 	poolDictionaries:''
     8 	poolDictionaries:''
     9 	category:'PetitCompiler-Visitors'
     9 	category:'PetitCompiler-Visitors'
    10 !
    10 !
       
    11 
       
    12 !PPCTokenizingCodeGenerator methodsFor:'accessing'!
       
    13 
       
    14 guards
       
    15     "When tokenizing, do not use guards"
       
    16     ^ false
       
    17 !
       
    18 
       
    19 tokenGenerator
       
    20     tokenGenerator isNil ifTrue: [ 
       
    21         tokenGenerator := PPCTokenCodeGenerator on: compiler.
       
    22         tokenGenerator arguments: arguments.
       
    23     ].
       
    24     ^ tokenGenerator
       
    25 !
       
    26 
       
    27 tokenGenerator: whatever
       
    28     tokenGenerator := whatever
       
    29 ! !
    11 
    30 
    12 !PPCTokenizingCodeGenerator methodsFor:'visiting'!
    31 !PPCTokenizingCodeGenerator methodsFor:'visiting'!
    13 
    32 
    14 visitChoiceNode: node
    33 visitChoiceNode: node
    15 "       true ifTrue: [ ^ super visitChoiceNode: node ]."
    34 "       true ifTrue: [ ^ super visitChoiceNode: node ]."
    82 
   101 
    83 visitTokenChoiceNode: node
   102 visitTokenChoiceNode: node
    84     | trimmingToken |
   103     | trimmingToken |
    85     self assert: (node children allSatisfy: [ :e | e isMarkedForInline not ]).
   104     self assert: (node children allSatisfy: [ :e | e isMarkedForInline not ]).
    86     
   105     
       
   106     node children do: [ :child |
       
   107         self tokenGenerator visit: child
       
   108     ]
    87     
   109     
       
   110 "	
    88     trimmingToken := node children detect: [ :e | e isTrimmingTokenNode ] ifNone: [ nil ].
   111     trimmingToken := node children detect: [ :e | e isTrimmingTokenNode ] ifNone: [ nil ].
    89     trimmingToken isNil ifFalse: [ 
   112     trimmingToken isNil ifFalse: [ 
    90         compiler codeStoreValueOf: [ self visit: trimmingToken whitespace ] intoVariable: #whatever.
   113         compiler codeStoreValueOf: [ self visit: trimmingToken whitespace ] intoVariable: #whatever.
    91     ].
   114     ].
    92     super visitChoiceNode: node.
   115     super visitChoiceNode: node."
    93 !
   116 !
    94 
   117 
    95 visitTokenConsumeNode: node
   118 visitTokenConsumeNode: node
    96     compiler codeReturn: 'self consume: ', (compiler idFor: node child) storeString, '.'
   119     compiler codeReturn: 'self consume: ', (compiler idFor: node child) storeString, '.'
    97 !
   120 !
    98 
   121 
    99 visitTokenNode: node
   122 visitTokenNode: node
   100     | id startVar endVar |
   123     self error: 'shoudl not happend!!'
   101     startVar := compiler allocateTemporaryVariableNamed: 'start'.
       
   102     endVar := compiler allocateTemporaryVariableNamed: 'end'.
       
   103 
       
   104     id := compiler idFor: node.
       
   105     compiler toTokenRememberStrategy.	
       
   106     
       
   107     compiler codeAssign: 'context position + 1.' to: startVar.
       
   108     compiler codeStoreValueOf: [ self visit: node child ] intoVariable: #whatever.
       
   109     compiler add: 'error ifFalse: [ '.
       
   110     compiler indent.	
       
   111         compiler codeAssign: 'context position.' to: endVar.
       
   112     
       
   113         compiler codeTranscriptShow: 'current token type: ', id storeString.
       
   114         compiler codeAssign: id storeString, '.' to: 'currentTokenType'.
       
   115         compiler codeAssign: node tokenClass asString, ' on: (context collection) 
       
   116                                                                     start: ', startVar, '  
       
   117                                                                     stop: ', endVar, '
       
   118                                                                     value: nil.'
       
   119                     to: 'currentTokenValue := ', self retvalVar.
       
   120         compiler codeReturn.
       
   121     compiler dedent.
       
   122     compiler add: '].'.		
       
   123     compiler toNormalRememberStrategy.
       
   124 !
   124 !
   125 
   125 
   126 visitTokenizingParserNode: node
   126 visitTokenizingParserNode: node
   127     self visit: node tokenizer.
   127     self visit: node tokenizer.
       
   128     self visit: node whitespace.
   128     
   129     
   129 "	compiler codeNextToken."
   130 "	compiler codeNextToken."
   130     compiler codeHaltIfShiftPressed.
   131     compiler codeHaltIfShiftPressed.
   131     compiler codeStoreValueOf: [ self visit: node parser ] intoVariable: self retvalVar.
   132     compiler codeStoreValueOf: [ self visit: node parser ] intoVariable: self retvalVar.
   132     compiler codeReturn.
   133     compiler codeReturn.
   133 !
   134 !
   134 
   135 
   135 visitTrimmingTokenNode: node
   136 visitTrimmingTokenNode: node
   136     |  id  startVar endVar |
   137     self error: 'shoudl not happend!!'
   137     
       
   138     startVar := compiler allocateTemporaryVariableNamed: 'start'.
       
   139     endVar := compiler allocateTemporaryVariableNamed:  'end'.
       
   140     
       
   141     id := compiler idFor: node.
       
   142     compiler toTokenRememberStrategy.
       
   143     
       
   144     
       
   145     compiler addComment: 'Consume Whitespace:'.
       
   146     compiler codeStoreValueOf: [ self visit: node whitespace ] intoVariable: #whatever.
       
   147     compiler nl.
       
   148 
       
   149     compiler codeAssign: 'context position + 1.' to: startVar.
       
   150     compiler codeStoreValueOf: [ self visit: node child ] intoVariable: #whatever.
       
   151 
       
   152     compiler add: 'error ifFalse: [ '.
       
   153     compiler indent.	
       
   154         compiler codeAssign: 'context position.' to: endVar.
       
   155     
       
   156         compiler addComment: 'Consume Whitespace:'.
       
   157         compiler codeStoreValueOf: [ self visit: node whitespace ] intoVariable: #whatever.
       
   158         compiler nl.
       
   159     
       
   160     
       
   161         compiler codeTranscriptShow: 'current token type: ', id storeString.
       
   162         compiler codeAssign: id storeString, '.' to: 'currentTokenType'.
       
   163         compiler codeAssign: node tokenClass asString, ' on: (context collection) 
       
   164                                                                 start: ', startVar, ' 
       
   165                                                                 stop: ', endVar, '
       
   166                                                                 value: nil.'
       
   167                    to: 'currentTokenValue := ', self retvalVar.
       
   168         compiler codeReturn.
       
   169     compiler dedent.																
       
   170     compiler add: '].'	.
       
   171     compiler toNormalRememberStrategy.
       
   172 ! !
   138 ! !
   173 
   139