compiler/PPCTokenizingCodeGenerator.st
changeset 502 1e45d3c96ec5
parent 464 f6d77fee9811
child 503 ff58cd9f1f3c
child 515 b5316ef15274
equal deleted inserted replaced
464:f6d77fee9811 502:1e45d3c96ec5
    15     "When tokenizing, do not use guards"
    15     "When tokenizing, do not use guards"
    16     ^ false
    16     ^ false
    17 !
    17 !
    18 
    18 
    19 tokenGenerator
    19 tokenGenerator
    20     ^ tokenGenerator isNil 
    20     tokenGenerator isNil ifTrue: [ 
    21         ifTrue: [ tokenGenerator := (PPCTokenCodeGenerator on: compiler)
    21         tokenGenerator := PPCTokenCodeGenerator on: compiler.
    22             arguments: arguments;
    22         tokenGenerator arguments: arguments.
    23             yourself ]
    23     ].
    24         ifFalse: [ tokenGenerator ]
    24     ^ tokenGenerator
    25 !
    25 !
    26 
    26 
    27 tokenGenerator: whatever
    27 tokenGenerator: whatever
    28     tokenGenerator := whatever
    28     tokenGenerator := whatever
    29 !
    29 !
    48         compiler addOnLine: ' ifTrue: ['.
    48         compiler addOnLine: ' ifTrue: ['.
    49         compiler indent.
    49         compiler indent.
    50         trueBlock value.
    50         trueBlock value.
    51         compiler dedent.
    51         compiler dedent.
    52         falseBlock isNil 	ifTrue: [ compiler addOnLine: '].' ]
    52         falseBlock isNil 	ifTrue: [ compiler addOnLine: '].' ]
    53                               	ifFalse: [ compiler add: ']'. ]
    53                               		ifFalse: [ compiler add: ']'. ]
    54     ].
    54     ].
    55     falseBlock isNil ifFalse: [ 
    55     falseBlock isNil ifFalse: [ 
    56         compiler addOnLine: ' ifFalse: ['.
    56         compiler addOnLine: ' ifFalse: ['.
    57         compiler indent.
    57         compiler indent.
    58         falseBlock value.
    58         falseBlock value.
    71     currentTokenVar := compiler allocateTemporaryVariableNamed: 'currentToken'.
    71     currentTokenVar := compiler allocateTemporaryVariableNamed: 'currentToken'.
    72 
    72 
    73     compiler smartRemember: node child to: mementoVar.
    73     compiler smartRemember: node child to: mementoVar.
    74     compiler codeAssign: '{ currentTokenValue . currentTokenType }.' to: currentTokenVar.
    74     compiler codeAssign: '{ currentTokenValue . currentTokenType }.' to: currentTokenVar.
    75 
    75 
    76     compiler codeStoreValueOf: [ self visit: node child  ] intoVariable: self retvalVar.
    76     compiler 
       
    77           codeAssignParsedValueOf:[ self visit:node child ]
       
    78           to:self retvalVar.
    77 
    79 
    78     compiler smartRestore: node child from: mementoVar.
    80     compiler smartRestore: node child from: mementoVar.
    79     compiler codeAssign: '(', currentTokenVar, ' at: 1).' to: 'currentTokenValue'.
    81     compiler codeAssign: '(', currentTokenVar, ' at: 1).' to: 'currentTokenValue'.
    80     compiler codeAssign: '(', currentTokenVar, ' at: 2).' to: 'currentTokenType'.
    82     compiler codeAssign: '(', currentTokenVar, ' at: 2).' to: 'currentTokenType'.
    81 
    83 
    90     node children do: [ :child |
    92     node children do: [ :child |
    91         | tokenMethodName |
    93         | tokenMethodName |
    92         
    94         
    93         child acceptsEpsilon ifTrue: [  
    95         child acceptsEpsilon ifTrue: [  
    94             possibleError := false.
    96             possibleError := false.
    95             compiler codeStoreValueOf: [ self visit: child ] intoVariable: self retvalVar.
    97             compiler codeAssignParsedValueOf:[ self visit:child ] to:self retvalVar.
    96             compiler codeReturn
    98             compiler codeReturn
    97         ] ifFalse: [
    99         ] ifFalse: [
    98             child firstSetWithTokens do: [ :first |
   100             child firstSetWithTokens do: [ :first |
    99                 "For each child, for each first compile this:"
   101                 "For each child, for each first compile this:"
   100             
   102             
   101                 tokenMethodName := compiler idFor: first.
   103                 tokenMethodName := compiler idFor: first.
   102                 compiler add: '(self ', tokenMethodName asString, ')'.
   104                 compiler add: '(self ', tokenMethodName asString, ')'.
   103                 compiler addOnLine: ' ifTrue: ['.
   105                 compiler addOnLine: ' ifTrue: ['.
   104                 compiler indent.
   106                 compiler indent.
   105                     compiler codeStoreValueOf: [ self visit: child ] intoVariable: self retvalVar.
   107                     compiler codeAssignParsedValueOf:[ self visit:child ] to:self retvalVar.
   106                     compiler add: 'error ifFalse: ['.
   108                     compiler add: 'error ifFalse: ['.
   107                     compiler indent.
   109                     compiler indent.
   108                         compiler codeReturn: self retvalVar.
   110                         compiler codeReturn: self retvalVar.
   109                     compiler dedent.
   111                     compiler dedent.
   110                     compiler add: '] ifTrue: ['.
   112                     compiler add: '] ifTrue: ['.
   125 
   127 
   126     "Modified: / 10-05-2015 / 07:37:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   128     "Modified: / 10-05-2015 / 07:37:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   127 !
   129 !
   128 
   130 
   129 visitDeterministicChoiceNode: node
   131 visitDeterministicChoiceNode: node
   130     | dictionary |
   132     | dictionary isInlined |
   131     dictionary := IdentityDictionary new.
   133     dictionary := IdentityDictionary new.
       
   134     
       
   135     isInlined := node isMarkedForInline.
   132     
   136     
   133     node children do: [ :child |
   137     node children do: [ :child |
   134         | firstSet |
   138         | firstSet |
   135         firstSet := child firstSetWithTokens.
   139         firstSet := child firstSetWithTokens.
   136         self assert: firstSet size = 1.
   140         self assert: firstSet size = 1.
   143         | tokenMethodName |
   147         | tokenMethodName |
   144         tokenMethodName := compiler idFor: (dictionary at: child).
   148         tokenMethodName := compiler idFor: (dictionary at: child).
   145         compiler add: '(self ', tokenMethodName asString, ')'.
   149         compiler add: '(self ', tokenMethodName asString, ')'.
   146         compiler addOnLine: ' ifTrue: ['.
   150         compiler addOnLine: ' ifTrue: ['.
   147         compiler indent.
   151         compiler indent.
   148             compiler codeStoreValueOf: [ self visit: child ] intoVariable: self retvalVar.
   152         compiler codeReturnParsedValueOf:[ self visit:child ].
   149             compiler codeReturn: self retvalVar.
   153         compiler dedent.
   150         compiler dedent.
   154         isInlined ifTrue:[
   151         compiler add: '].'
   155             compiler add: '] ifFalse: ['
   152     ].
   156         ] ifFalse:[
   153 
   157             compiler add: '].'.
       
   158         ]
       
   159     ].
   154     compiler codeError: 'no choice found'.
   160     compiler codeError: 'no choice found'.
       
   161     isInlined ifTrue:[
       
   162         node children size timesRepeat: [ compiler addOnLine: ']' ].
       
   163         compiler addOnLine: '.'.
       
   164     ]
       
   165 
       
   166     "Modified: / 21-05-2015 / 15:31:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   155 !
   167 !
   156 
   168 
   157 visitTokenChoiceNode: node
   169 visitTokenChoiceNode: node
   158     | trimmingToken |
   170     | trimmingToken |
   159     self assert: (node children allSatisfy: [ :e | e isMarkedForInline not ]).
   171     self assert: (node children allSatisfy: [ :e | e isMarkedForInline not ]).
   196 visitTokenizingParserNode: node
   208 visitTokenizingParserNode: node
   197     self visit: node tokenizer.
   209     self visit: node tokenizer.
   198     self visit: node whitespace.
   210     self visit: node whitespace.
   199     
   211     
   200     compiler codeHaltIfShiftPressed.
   212     compiler codeHaltIfShiftPressed.
   201     compiler codeStoreValueOf: [ self visit: node parser ] intoVariable: self retvalVar.
   213     compiler 
       
   214           codeAssignParsedValueOf:[ self visit:node parser ]
       
   215           to:self retvalVar.
   202     compiler codeReturn.
   216     compiler codeReturn.
   203 !
   217 !
   204 
   218 
   205 visitTrimmingTokenNode: node
   219 visitTrimmingTokenNode: node
   206     self error: 'shoudl not happend!!'
   220     self error: 'shoudl not happend!!'