compiler/PPCTokenizingCodeGenerator.st
changeset 459 4751c407bb40
parent 452 9f4558b3be66
child 460 87a3d30ab570
child 464 f6d77fee9811
equal deleted inserted replaced
452:9f4558b3be66 459:4751c407bb40
     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 
    11 
       
    12 !PPCTokenizingCodeGenerator methodsFor:'accessing'!
       
    13 
       
    14 guards
       
    15     "When tokenizing, do not use guards"
       
    16     ^ false
       
    17 !
       
    18 
       
    19 tokenGenerator
       
    20     ^ tokenGenerator isNil 
       
    21         ifTrue: [ tokenGenerator := (PPCTokenCodeGenerator on: compiler)
       
    22             arguments: arguments;
       
    23             yourself ]
       
    24         ifFalse: [ tokenGenerator ]
       
    25 !
       
    26 
       
    27 tokenGenerator: whatever
       
    28     tokenGenerator := whatever
       
    29 ! !
       
    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 ]."
    16     "HACK alert: We are inside token..."
    35     "HACK alert: We are inside token..."
    17     node firstSetWithTokens detect: [ :e | e isTokenNode not ] ifFound: [ ^ super visitChoiceNode: node ].
    36 
       
    37     (node firstSetWithTokens contains: [ :e | e isTokenNode not ]) ifTrue: [ ^ super visitChoiceNode: node ].
    18          
    38          
    19     node children do: [ :child |
    39     node children do: [ :child |
    20         | tokenMethodName |
    40         | tokenMethodName |
    21         
    41         
    22         child firstSetWithTokens do: [ :first |
    42         child firstSetWithTokens do: [ :first |
    41             compiler add: '].'
    61             compiler add: '].'
    42         ]
    62         ]
    43     ].
    63     ].
    44 
    64 
    45     compiler codeError: 'no choice found'.
    65     compiler codeError: 'no choice found'.
       
    66 
       
    67     "Modified: / 10-05-2015 / 07:37:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    46 !
    68 !
    47 
    69 
    48 visitDeterministicChoiceNode: node
    70 visitDeterministicChoiceNode: node
    49     | dictionary |
    71     | dictionary |
    50     dictionary := IdentityDictionary new.
    72     dictionary := IdentityDictionary new.
    79 
   101 
    80 visitTokenChoiceNode: node
   102 visitTokenChoiceNode: node
    81     | trimmingToken |
   103     | trimmingToken |
    82     self assert: (node children allSatisfy: [ :e | e isMarkedForInline not ]).
   104     self assert: (node children allSatisfy: [ :e | e isMarkedForInline not ]).
    83     
   105     
       
   106     node children do: [ :child |
       
   107         self tokenGenerator visit: child
       
   108     ]
    84     
   109     
       
   110 "	
    85     trimmingToken := node children detect: [ :e | e isTrimmingTokenNode ] ifNone: [ nil ].
   111     trimmingToken := node children detect: [ :e | e isTrimmingTokenNode ] ifNone: [ nil ].
    86     trimmingToken isNil ifFalse: [ 
   112     trimmingToken isNil ifFalse: [ 
    87         compiler codeStoreValueOf: [ self visit: trimmingToken whitespace ] intoVariable: #whatever.
   113         compiler codeStoreValueOf: [ self visit: trimmingToken whitespace ] intoVariable: #whatever.
    88     ].
   114     ].
    89     super visitChoiceNode: node.
   115     super visitChoiceNode: node."
    90 !
   116 !
    91 
   117 
    92 visitTokenConsumeNode: node
   118 visitTokenConsumeNode: node
    93     compiler codeReturn: 'self consume: ', (compiler idFor: node child) storeString, '.'
   119     compiler codeReturn: 'self consume: ', (compiler idFor: node child) storeString, '.'
    94 !
   120 !
    95 
   121 
    96 visitTokenNode: node
   122 visitTokenNode: node
    97     | id startVar endVar |
   123     self error: 'shoudl not happend!!'
    98     startVar := compiler allocateTemporaryVariableNamed: 'start'.
       
    99     endVar := compiler allocateTemporaryVariableNamed: 'end'.
       
   100 
       
   101     id := compiler idFor: node.
       
   102     compiler toTokenRememberStrategy.	
       
   103     
       
   104     compiler codeAssign: 'context position + 1.' to: startVar.
       
   105     compiler codeStoreValueOf: [ self visit: node child ] intoVariable: #whatever.
       
   106     compiler add: 'error ifFalse: [ '.
       
   107     compiler indent.	
       
   108         compiler codeAssign: 'context position.' to: endVar.
       
   109     
       
   110         compiler codeTranscriptShow: 'current token type: ', id storeString.
       
   111         compiler codeAssign: id storeString, '.' to: 'currentTokenType'.
       
   112         compiler codeAssign: node tokenClass asString, ' on: (context collection) 
       
   113                                                                     start: ', startVar, '  
       
   114                                                                     stop: ', endVar, '
       
   115                                                                     value: nil.'
       
   116                     to: 'currentTokenValue := ', self retvalVar.
       
   117         compiler codeReturn.
       
   118     compiler dedent.
       
   119     compiler add: '].'.		
       
   120     compiler toNormalRememberStrategy.
       
   121 !
   124 !
   122 
   125 
   123 visitTokenizingParserNode: node
   126 visitTokenizingParserNode: node
   124     self visit: node tokenizer.
   127     self visit: node tokenizer.
       
   128     self visit: node whitespace.
   125     
   129     
   126 "	compiler codeNextToken."
   130 "	compiler codeNextToken."
   127     compiler codeHaltIfShiftPressed.
   131     compiler codeHaltIfShiftPressed.
   128     compiler codeStoreValueOf: [ self visit: node parser ] intoVariable: self retvalVar.
   132     compiler codeStoreValueOf: [ self visit: node parser ] intoVariable: self retvalVar.
   129     compiler codeReturn.
   133     compiler codeReturn.
   130 !
   134 !
   131 
   135 
   132 visitTrimmingTokenNode: node
   136 visitTrimmingTokenNode: node
   133     |  id  startVar endVar |
   137     self error: 'shoudl not happend!!'
   134     
       
   135     startVar := compiler allocateTemporaryVariableNamed: 'start'.
       
   136     endVar := compiler allocateTemporaryVariableNamed:  'end'.
       
   137     
       
   138     id := compiler idFor: node.
       
   139     compiler toTokenRememberStrategy.
       
   140     
       
   141     
       
   142     compiler addComment: 'Consume Whitespace:'.
       
   143     compiler codeStoreValueOf: [ self visit: node whitespace ] intoVariable: #whatever.
       
   144     compiler nl.
       
   145 
       
   146     compiler codeAssign: 'context position + 1.' to: startVar.
       
   147     compiler codeStoreValueOf: [ self visit: node child ] intoVariable: #whatever.
       
   148 
       
   149     compiler add: 'error ifFalse: [ '.
       
   150     compiler indent.	
       
   151         compiler codeAssign: 'context position.' to: endVar.
       
   152     
       
   153         compiler addComment: 'Consume Whitespace:'.
       
   154         compiler codeStoreValueOf: [ self visit: node whitespace ] intoVariable: #whatever.
       
   155         compiler nl.
       
   156     
       
   157     
       
   158         compiler codeTranscriptShow: 'current token type: ', id storeString.
       
   159         compiler codeAssign: id storeString, '.' to: 'currentTokenType'.
       
   160         compiler codeAssign: node tokenClass asString, ' on: (context collection) 
       
   161                                                                 start: ', startVar, ' 
       
   162                                                                 stop: ', endVar, '
       
   163                                                                 value: nil.'
       
   164                    to: 'currentTokenValue := ', self retvalVar.
       
   165         compiler codeReturn.
       
   166     compiler dedent.																
       
   167     compiler add: '].'	.
       
   168     compiler toNormalRememberStrategy.
       
   169 ! !
   138 ! !
   170 
   139