compiler/PPCCodeGenerator.st
changeset 464 f6d77fee9811
parent 459 4751c407bb40
child 465 f729f6cd3c76
child 502 1e45d3c96ec5
equal deleted inserted replaced
459:4751c407bb40 464:f6d77fee9811
    31 
    31 
    32 guards
    32 guards
    33     ^ arguments guards
    33     ^ arguments guards
    34 ! !
    34 ! !
    35 
    35 
       
    36 !PPCCodeGenerator methodsFor:'guards'!
       
    37 
       
    38 addGuard: node ifTrue: trueBlock ifFalse: falseBlock
       
    39     |  guard id |
       
    40     (self guards not or: [(guard := PPCGuard on: node) makesSense not]) ifTrue: [ ^ false].
       
    41     id := compiler idFor: node.
       
    42 
       
    43 "	falseBlock isNil ifFalse: [ 
       
    44         compiler add: 'context atEnd'.
       
    45         compiler addOnLine: ' ifTrue: ['.
       
    46         compiler indent.
       
    47         falseBlock value.
       
    48         compiler dedent.
       
    49         compiler addOnLine: '].'.
       
    50     ]."
       
    51     
       
    52     guard id: (compiler idFor: guard prefixed: #guard).
       
    53     guard compileGuard: compiler.
       
    54 
       
    55     trueBlock isNil ifFalse: [ 
       
    56         compiler addOnLine: ' ifTrue: ['.
       
    57         compiler indent.
       
    58         trueBlock value.
       
    59         compiler dedent.
       
    60         falseBlock isNil 	ifTrue: [ compiler addOnLine: '].' ]
       
    61                               	ifFalse: [ compiler add: ']'. ]
       
    62     ].
       
    63     falseBlock isNil ifFalse: [ 
       
    64         compiler addOnLine: ' ifFalse: ['.
       
    65         compiler indent.
       
    66         falseBlock value.
       
    67         compiler dedent.
       
    68         compiler addOnLine: '].'.
       
    69     ].
       
    70     ^ true
       
    71 !
       
    72 
       
    73 addGuardTrimming: node
       
    74     |  guard firsts id |
       
    75     (self guards not or: [(guard := PPCGuard on: node) makesSense not]) ifTrue: [ ^ false].
       
    76 
       
    77     id := compiler idFor: node.
       
    78     firsts := node firstSetWithTokens.
       
    79 
       
    80     
       
    81     (firsts allSatisfy: [ :e | e isTrimmingTokenNode ]) ifTrue: [  
       
    82         "If we start with trimming, we should invoke the whitespace parser"
       
    83         self compileTokenWhitespace: firsts anyOne.
       
    84         ^ true
       
    85     ].
       
    86     ^ false
       
    87 ! !
       
    88 
    36 !PPCCodeGenerator methodsFor:'hooks'!
    89 !PPCCodeGenerator methodsFor:'hooks'!
    37 
    90 
    38 afterAccept: node retval: retval
    91 afterAccept: node retval: retval
    39     "return the method from compiler"
    92     "return the method from compiler"
    40     ^ self stopMethodForNode: node.
    93     ^ self stopMethodForNode: node.
    54     ^ compiler checkCache: (compiler idFor: node)
   107     ^ compiler checkCache: (compiler idFor: node)
    55 ! !
   108 ! !
    56 
   109 
    57 !PPCCodeGenerator methodsFor:'support'!
   110 !PPCCodeGenerator methodsFor:'support'!
    58 
   111 
    59 addGuard: node
       
    60     |  guard firsts id |
       
    61     (self guards not or: [(guard := PPCGuard on: node) makesSense not]) ifTrue: [ ^ self].
       
    62 
       
    63     id := compiler idFor: node.
       
    64     firsts := node firstSetWithTokens.
       
    65 
       
    66     
       
    67     (firsts allSatisfy: [ :e | e isKindOf: PPCTrimmingTokenNode ]) ifTrue: [  
       
    68         "If we start with trimming, we should invoke the whitespace parser"
       
    69         self compileTokenWhitespace: firsts anyOne.
       
    70         
       
    71         compiler add: 'context atEnd ifTrue: [ ^ self error ].'.
       
    72         guard id: id, '_guard'.
       
    73         guard compileGuard: compiler.
       
    74         compiler addOnLine: 'ifFalse: [ ^ self error ].'
       
    75     ].
       
    76 
       
    77     (firsts allSatisfy: [ :e | e isTerminal ]) ifTrue: [  
       
    78         compiler add: 'context atEnd ifTrue: [ ^ self error ].'.
       
    79         guard id: id, '_guard'.
       
    80         guard compileGuard: compiler.
       
    81         compiler addOnLine: 'ifFalse: [ ^ self error ].'
       
    82     ].
       
    83 !
       
    84 
       
    85 compileTokenWhitespace: node
   112 compileTokenWhitespace: node
    86     compiler add: 'context atWs ifFalse: ['.
   113     compiler add: 'context atWs ifFalse: ['.
    87     compiler indent.
   114     compiler indent.
    88         compiler call: (self visit: node whitespace).
   115         compiler codeStoreValueOf: [ self visit: node whitespace ] intoVariable: #whatever.
    89         compiler add: 'context setWs.'.
   116         compiler add: 'context setWs.'.
    90     compiler dedent.
   117     compiler dedent.
    91     compiler add: '].'.
   118     compiler add: '].'.
    92 !
   119 !
    93 
   120 
   220     classificationId := compiler idFor: classification prefixed: #classification.
   247     classificationId := compiler idFor: classification prefixed: #classification.
   221     compiler addConstant: classification as: classificationId.
   248     compiler addConstant: classification as: classificationId.
   222     
   249     
   223     compiler add: '(', classificationId, ' at: context peek asInteger)'.
   250     compiler add: '(', classificationId, ' at: context peek asInteger)'.
   224     compiler indent.
   251     compiler indent.
   225     compiler add: 'ifFalse: [ self error: ''predicate not found'' ]'.
   252     compiler add: 'ifFalse: ['.
   226     compiler add: 'ifTrue: [ '.
   253     compiler codeError: 'predicate not found'.
       
   254     compiler add: '] ifTrue: [ '.
   227     compiler codeReturn: 'context next'.
   255     compiler codeReturn: 'context next'.
   228     compiler add: '].'.
   256     compiler add: '].'.
   229     compiler dedent.
   257     compiler dedent.
   230 !
   258 !
   231 
   259 
   238         compiler addConstant: (Character value: node character asInteger) as: chid .
   266         compiler addConstant: (Character value: node character asInteger) as: chid .
   239     ].
   267     ].
   240     
   268     
   241     compiler add: '(context peek == ', chid, ')'.
   269     compiler add: '(context peek == ', chid, ')'.
   242     compiler indent.
   270     compiler indent.
   243     compiler add: 'ifFalse: [ self error: ''', node character asInteger asString, ' expected'' at: context position ] '.
   271     compiler add: 'ifFalse: ['.
   244     compiler add: 'ifTrue: [ '.
   272     compiler indent.
       
   273     compiler codeError: node character asInteger asString, ' expected'.
       
   274     compiler dedent.
       
   275     compiler add: '] ifTrue: [ '.
       
   276     compiler indent.
   245     compiler codeReturn: 'context next'.
   277     compiler codeReturn: 'context next'.
       
   278     compiler dedent.
   246     compiler add: '].'.
   279     compiler add: '].'.
   247     compiler dedent.
   280     compiler dedent.
   248 !
   281 !
   249 
   282 
   250 visitChild: child of: node
   283 visitChild: child of: node
   257 
   290 
   258     ^ self visit: child.
   291     ^ self visit: child.
   259 !
   292 !
   260 
   293 
   261 visitChoiceNode: node
   294 visitChoiceNode: node
   262     | firsts guard whitespaceConsumed elementVar |
   295     |  whitespaceConsumed elementVar |
   263     "The code is not ready for inlining"
   296     "The code is not ready for inlining"
   264     self assert: node isMarkedForInline not.
   297     self assert: node isMarkedForInline not.
   265     
   298     
   266     whitespaceConsumed := false.
       
   267     firsts := node firstSetWithTokens.
       
   268         
       
   269 
   299 
   270     elementVar := compiler allocateTemporaryVariableNamed: 'element'.
   300     elementVar := compiler allocateTemporaryVariableNamed: 'element'.
   271     "	
   301     whitespaceConsumed :=	 self addGuardTrimming: node.
   272         If we want to compile in guard and the choice starts with trimming token, 
   302 
   273         we should invoke the whitespace parser
       
   274     "
       
   275     (self guards and: [ firsts allSatisfy: [ :e | e isTrimmingTokenNode ] ]) ifTrue: [  
       
   276         self compileTokenWhitespace: firsts anyOne.
       
   277         whitespaceConsumed := true.
       
   278     ].
       
   279         
       
   280     1 to: node children size do: [ :idx  | |child allowGuard |
   303     1 to: node children size do: [ :idx  | |child allowGuard |
   281         child := node children at: idx.
   304         child := node children at: idx.
   282         allowGuard := whitespaceConsumed.
   305         allowGuard := whitespaceConsumed.
   283                                 
   306 
   284         (allowGuard and: [self guards and: [ (guard := PPCGuard on: child) makesSense ]]) ifTrue: [         
   307         allowGuard ifTrue: [ 
   285             guard id: (compiler idFor: guard prefixed: #guard).
   308             self addGuard: child ifTrue: [ 
   286             guard compileGuard: compiler.
       
   287             compiler add: ' ifTrue: [ '.
       
   288             compiler indent.
       
   289                 compiler add: 'self clearError.'.
   309                 compiler add: 'self clearError.'.
   290                 compiler codeStoreValueOf:  [self visit: child] intoVariable: elementVar.
   310                 compiler codeStoreValueOf:  [self visit: child] intoVariable: elementVar.
   291                 compiler add: 'error ifFalse: [ ^ element ].'.
   311                 compiler add: 'error ifFalse: [ ^ ', elementVar, ' ].'.
   292             compiler dedent.
   312             ] ifFalse: nil.
   293             compiler add: ' ].'.
   313         ] ifFalse: [ 
   294         ] ifFalse: [
   314                 compiler add: 'self clearError.'.
   295             compiler add: 'self clearError.'.
   315                 compiler codeStoreValueOf:  [self visit: child] intoVariable: elementVar.
   296             compiler codeStoreValueOf:  [self visit: child] intoVariable: elementVar.
   316                 compiler add: 'error ifFalse: [ ^ ', elementVar, ' ].'.
   297             compiler add: 'error ifFalse: [ ^ element ].'.
       
   298         ]
   317         ]
   299     ].
   318     ].
   300     compiler add: '^ self error: ''no choice suitable'''.
   319     compiler codeError: 'no choice suitable'.
   301 
   320 
   302     "Modified: / 23-04-2015 / 21:40:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   321     "Modified: / 23-04-2015 / 21:40:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   303 !
   322 !
   304 
   323 
   305 visitEndOfFileNode: node
   324 visitEndOfFileNode: node
   329 
   348 
   330     compiler codeAssign: 'context position.' to: positionVar.
   349     compiler codeAssign: 'context position.' to: positionVar.
   331     compiler add: '((context next: ', node literal size asString, ') = #''', encodedLiteral, ''') ifTrue: ['.
   350     compiler add: '((context next: ', node literal size asString, ') = #''', encodedLiteral, ''') ifTrue: ['.
   332     compiler codeReturn: '#''', encodedLiteral, ''' '.
   351     compiler codeReturn: '#''', encodedLiteral, ''' '.
   333     compiler add: '] ifFalse: ['.
   352     compiler add: '] ifFalse: ['.
   334     compiler add: '  context position: ', positionVar, '.'.
   353     compiler indent.
   335     compiler add: '  self error: ''', encodedLiteral,  ' expected'' at: position'.
   354         compiler add: 'context position: ', positionVar, '.'.
       
   355         compiler codeError: encodedLiteral,  ' expected' at: positionVar.
       
   356     compiler dedent.
   336     compiler add: '].'.
   357     compiler add: '].'.
   337 !
   358 !
   338 
   359 
   339 visitMessagePredicateNode: node
   360 visitMessagePredicateNode: node
   340     compiler add: '(context peek ', node message, ') ifFalse: ['.
   361     compiler add: '(context peek ', node message, ') ifFalse: ['.
   341     compiler add: '  self error: ''predicate not found'''.
   362     compiler codeError: 'predicate not found'.
   342     compiler add: '] ifTrue: [ '.
   363     compiler add: '] ifTrue: [ '.
   343     compiler codeReturn: ' context next'.
   364     compiler codeReturn: ' context next'.
   344     compiler add: '].'.
   365     compiler add: '].'.
   345 
   366 
   346     "Modified: / 23-04-2015 / 18:39:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   367     "Modified: / 23-04-2015 / 18:39:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   357     classificationId := (compiler idFor: classification prefixed: #classification).
   378     classificationId := (compiler idFor: classification prefixed: #classification).
   358     compiler  addConstant: classification as: classificationId.
   379     compiler  addConstant: classification as: classificationId.
   359     
   380     
   360     compiler addOnLine: '(', classificationId, ' at: context peek asInteger)'.
   381     compiler addOnLine: '(', classificationId, ' at: context peek asInteger)'.
   361     compiler indent.
   382     compiler indent.
   362     compiler add: ' ifTrue: [ self error: '' predicate not expected'' ]'.
   383     compiler add: ' ifTrue: ['.
   363     compiler add: ' ifFalse: ['.
   384     compiler codeError: 'predicate not expected'.
       
   385     compiler add: '] ifFalse: ['.
   364     compiler codeReturn: 'nil'.
   386     compiler codeReturn: 'nil'.
       
   387     compiler add: '].'.
       
   388     compiler dedent.
       
   389 !
       
   390 
       
   391 visitNotCharacterNode: node
       
   392     | chid |
       
   393     node character ppcPrintable ifTrue: [ 
       
   394         chid := node character storeString 
       
   395     ] ifFalse: [ 
       
   396         chid := compiler idFor: node character prefixed: #char.
       
   397         compiler addConstant: (Character value: node character asInteger) as: chid .
       
   398     ].
       
   399     
       
   400     compiler add: '(context peek == ', chid, ')'.
       
   401     compiler indent.
       
   402     compiler add: 'ifTrue: ['.
       
   403     compiler indent.
       
   404     compiler codeError: node character asInteger asString, ' not expected'.
       
   405     compiler dedent.
       
   406     compiler add: '] ifFalse: [ '.
       
   407     compiler indent.
       
   408     compiler codeReturn: 'nil.'.
       
   409     compiler dedent.
   365     compiler add: '].'.
   410     compiler add: '].'.
   366     compiler dedent.
   411     compiler dedent.
   367 !
   412 !
   368 
   413 
   369 visitNotLiteralNode: node
   414 visitNotLiteralNode: node
   371     encodedLiteral := node encodeQuotes: node literal.
   416     encodedLiteral := node encodeQuotes: node literal.
   372     size := node literal size asString.
   417     size := node literal size asString.
   373     
   418     
   374     compiler add: '((context peek: ', size, ') =#''', encodedLiteral, ''')'.
   419     compiler add: '((context peek: ', size, ') =#''', encodedLiteral, ''')'.
   375     compiler indent.
   420     compiler indent.
   376     compiler add: 'ifTrue: [ self error: ''', encodedLiteral, ' not expected'' ]'.
   421     compiler add: 'ifTrue: ['.
   377     compiler add: 'ifFalse: [ '.
   422     compiler codeError: encodedLiteral, ' not expected'.
       
   423     compiler add: '] ifFalse: [ '.
   378     compiler codeReturn: 'nil' .
   424     compiler codeReturn: 'nil' .
   379     compiler add: '].'.
   425     compiler add: '].'.
   380     compiler dedent.
   426     compiler dedent.
   381 !
   427 !
   382 
   428 
   406 !
   452 !
   407 
   453 
   408 visitOptionalNode: node
   454 visitOptionalNode: node
   409     compiler codeStoreValueOf: [ self visit: node child ] intoVariable: self retvalVar.
   455     compiler codeStoreValueOf: [ self visit: node child ] intoVariable: self retvalVar.
   410     compiler add: 'error ifTrue: [ '.
   456     compiler add: 'error ifTrue: [ '.
   411     compiler add: '  self clearError. '.
   457     compiler indent.
       
   458     compiler add: 'self clearError. '.
   412     compiler codeAssign: 'nil.' to: self retvalVar.
   459     compiler codeAssign: 'nil.' to: self retvalVar.
       
   460     compiler dedent.
   413     compiler add: '].'.
   461     compiler add: '].'.
   414     compiler codeReturn.
   462     compiler codeReturn.
   415 !
   463 !
   416 
   464 
   417 visitPluggableNode: node
   465 visitPluggableNode: node
   421     compiler addConstant: node block as: blockId.
   469     compiler addConstant: node block as: blockId.
   422     compiler codeReturn: blockId, ' value: context.'.
   470     compiler codeReturn: blockId, ' value: context.'.
   423 !
   471 !
   424 
   472 
   425 visitPlusNode: node
   473 visitPlusNode: node
   426     | elementVar |
   474     | elementVar  |
   427                 
   475                 
   428     elementVar := compiler allocateTemporaryVariableNamed:  'element'.
   476     elementVar := compiler allocateTemporaryVariableNamed:  'element'.
   429                 
   477      
       
   478 "	self tokenGuards ifTrue: [ 
       
   479         compiler codeTokenGuard: node ifFalse: [ compiler codeError: 'at least one occurence expected' ].   
       
   480     ].
       
   481 "        
   430     compiler codeAssign: 'OrderedCollection new.' to: self retvalVar.
   482     compiler codeAssign: 'OrderedCollection new.' to: self retvalVar.
   431     compiler codeStoreValueOf: [ self visit: node child ] intoVariable: elementVar.
   483     compiler codeStoreValueOf: [ self visit: node child ] intoVariable: elementVar.
   432 
   484 
   433     compiler add: 'error ifTrue: [ self error: ''at least one occurence expected'' ] ifFalse: ['.
   485     compiler add: 'error ifTrue: ['.
       
   486     compiler codeError: 'at least one occurence expected'.
       
   487     compiler add: '] ifFalse: ['.
   434     compiler indent.
   488     compiler indent.
   435         compiler add: self retvalVar , ' add: ',elementVar , '.'.
   489         compiler add: self retvalVar , ' add: ',elementVar , '.'.
   436             
   490             
   437         compiler codeStoreValueOf: [ self visit: node child ] intoVariable: elementVar.
   491         compiler codeStoreValueOf: [ self visit: node child ] intoVariable: elementVar.
   438         compiler add: '[ error ] whileFalse: ['.
   492         compiler add: '[ error ] whileFalse: ['.
   455 
   509 
   456     compiler addConstant: node predicate as: pid.
   510     compiler addConstant: node predicate as: pid.
   457 
   511 
   458     compiler add: '(context atEnd not and: [ ', pid , ' value: context uncheckedPeek])'.
   512     compiler add: '(context atEnd not and: [ ', pid , ' value: context uncheckedPeek])'.
   459     compiler indent.
   513     compiler indent.
   460     compiler add: 'ifFalse: [ self error: ''predicate not found'' ]'.
   514     compiler add: 'ifFalse: ['.
   461     compiler add: 'ifTrue: [ ', self retvalVar ,' := context next ].'.
   515     compiler codeError: 'predicate not found'.
       
   516     compiler add: '] ifTrue: [ ', self retvalVar ,' := context next ].'.
   462     compiler dedent.   
   517     compiler dedent.   
   463     compiler codeReturn.
   518     compiler codeReturn.
   464 
   519 
   465     "Modified: / 23-04-2015 / 21:48:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   520     "Modified: / 23-04-2015 / 21:48:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   466 !
   521 !
   467 
   522 
   468 visitRecognizingSequenceNode: node
   523 visitRecognizingSequenceNode: node
   469     | mementoVar |
   524     | mementoVar canBacktrack |
   470 
   525 
   471     mementoVar := compiler allocateTemporaryVariableNamed: 'memento'.			
   526     canBacktrack := (node children allButFirst allSatisfy: [:e | e acceptsEpsilon ]) not.
   472     compiler smartRemember: node to: mementoVar.
   527 
   473 
   528     canBacktrack ifTrue: [ 
   474 "	self addGuard: compiler."
   529         mementoVar := compiler allocateTemporaryVariableNamed: 'memento'.			
   475 
   530         compiler smartRemember: node to: mementoVar.
   476         compiler codeStoreValueOf: [ self visit: (node children at: 1) ] intoVariable: #whatever.
   531     ].
       
   532 
       
   533     compiler codeStoreValueOf: [ self visit: (node children at: 1) ] intoVariable: #whatever.
   477     compiler add: 'error ifTrue: [ ^ failure ].'.
   534     compiler add: 'error ifTrue: [ ^ failure ].'.
   478 
   535 
   479     2 to: (node children size) do: [ :idx  | |child|
   536     2 to: (node children size) do: [ :idx  | |child|
   480         child := node children at: idx.
   537         child := node children at: idx.
   481         compiler codeStoreValueOf: [ self visit: child ] intoVariable: #whatever.
   538         compiler codeStoreValueOf: [ self visit: child ] intoVariable: #whatever.
   482         compiler add: 'error ifTrue: [ '.
   539         
   483         compiler indent.
   540         child acceptsEpsilon ifFalse: [   
   484         compiler smartRestore: node from: mementoVar.
   541             compiler add: 'error ifTrue: [ '.
   485         compiler add: ' ^ failure .'.
   542             compiler indent.
   486         compiler dedent.
   543             compiler smartRestore: node from: mementoVar.
   487         compiler add: '].'.
   544             compiler add: ' ^ failure .'.
       
   545             compiler dedent.
       
   546             compiler add: '].'.
       
   547         ].
   488     ].
   548     ].
   489 !
   549 !
   490 
   550 
   491 visitSequenceNode: node
   551 visitSequenceNode: node
   492 
   552 
   493     | elementVar mementoVar |
   553     | elementVar mementoVar canBacktrack |
   494 
   554 
   495     elementVar := compiler allocateTemporaryVariableNamed: 'element'.
   555     elementVar := compiler allocateTemporaryVariableNamed: 'element'.
   496     mementoVar := compiler allocateTemporaryVariableNamed: 'memento'.
   556     canBacktrack := (node children allButFirst allSatisfy: [:e | e acceptsEpsilon ]) not.
   497 
   557 
   498     compiler smartRemember: node to: mementoVar.
   558 "	self addGuardTrimming: node.
       
   559     self addGuard: node ifTrue: nil ifFalse: [ compiler addOnLine: ' ^ self error' ].
       
   560 "
       
   561     canBacktrack ifTrue: [ 
       
   562         mementoVar := compiler allocateTemporaryVariableNamed: 'memento'.
       
   563         compiler smartRemember: node to: mementoVar.
       
   564     ].
       
   565     
   499     compiler codeAssign: 'Array new: ', node children size asString, '.' to: self retvalVar.
   566     compiler codeAssign: 'Array new: ', node children size asString, '.' to: self retvalVar.
   500     self addGuard: node.
   567 
   501 
   568     compiler codeStoreValueOf: [ self visit: (node children at: 1)]  intoVariable: elementVar.
   502     1 to: (node children size) do: [ :idx  | |child|
   569     compiler add: 'error ifTrue: [ ^ failure ].'.
       
   570     compiler add: self retvalVar , ' at: 1 put: ', elementVar, '.'.
       
   571     
       
   572     2 to: (node children size) do: [ :idx  | |child|
   503         child := node children at: idx.
   573         child := node children at: idx.
   504         compiler codeStoreValueOf: [ self visit: child ]  intoVariable: elementVar.
   574         compiler codeStoreValueOf: [ self visit: child ]  intoVariable: elementVar.
   505         
   575       
   506         compiler add: 'error ifTrue: [ '.
   576         child acceptsEpsilon ifFalse: [   
   507         compiler indent.
   577             compiler add: 'error ifTrue: [ '.
   508         compiler smartRestore: node from: mementoVar.
   578             compiler indent.
   509         compiler add: '^ failure.'.
   579             compiler smartRestore: node from: mementoVar.
   510         compiler dedent.
   580             compiler add: '^ failure.'.
   511         compiler add: '].'.
   581             compiler dedent.
       
   582             compiler add: '].'.
       
   583         ].
   512         compiler add: self retvalVar , ' at: ', idx asString, ' put: ',elementVar,'.'.
   584         compiler add: self retvalVar , ' at: ', idx asString, ' put: ',elementVar,'.'.
   513     ].
   585     ].
   514     compiler codeReturn
   586     compiler codeReturn
   515 
   587 
   516     "Modified: / 23-04-2015 / 22:03:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   588     "Modified: / 23-04-2015 / 22:03:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   538     compiler addConstant: classification as: classificationId.
   610     compiler addConstant: classification as: classificationId.
   539     
   611     
   540     compiler codeAssign: 'OrderedCollection new.' to: self retvalVar.	
   612     compiler codeAssign: 'OrderedCollection new.' to: self retvalVar.	
   541     compiler add: '[ ', classificationId, ' at: context peek asInteger ] whileTrue: ['.
   613     compiler add: '[ ', classificationId, ' at: context peek asInteger ] whileTrue: ['.
   542     compiler indent.
   614     compiler indent.
   543     compiler add: self retvalVar, ' add: context next.'.
   615     compiler codeEvaluate: 'add:' argument: 'context next.' on: self retvalVar.
   544     compiler dedent.
   616     compiler dedent.
   545     compiler add: '].'.
   617     compiler add: '].'.
   546    compiler codeReturn: 'retval asArray'.
   618     compiler codeAssign: self retvalVar, ' asArray.' to: self retvalVar.
       
   619    compiler codeReturn.
   547 !
   620 !
   548 
   621 
   549 visitStarMessagePredicateNode: node
   622 visitStarMessagePredicateNode: node
   550 
   623 
   551     compiler codeAssign: 'OrderedCollection new.' to: self retvalVar.	
   624     compiler codeAssign: 'OrderedCollection new.' to: self retvalVar.	
   552     compiler add: '[ context peek ', node message, ' ] whileTrue: ['.
   625     compiler add: '[ context peek ', node message, ' ] whileTrue: ['.
   553     compiler indent.
   626     compiler indent.
   554     compiler add: self retvalVar, ' add: context next.'.
   627     compiler codeEvaluate: 'add:' argument: 'context next.' on: self retvalVar.
   555     compiler dedent.
   628     compiler dedent.
   556     compiler add: '].'.
   629     compiler add: '].'.
   557    compiler codeReturn: 'retval asArray'.
   630     compiler codeAssign: self retvalVar, ' asArray.' to: self retvalVar.
       
   631    compiler codeReturn.
   558 !
   632 !
   559 
   633 
   560 visitStarNode: node
   634 visitStarNode: node
   561     | elementVar |
   635     | elementVar |
   562     
   636     
   563     elementVar := compiler allocateTemporaryVariableNamed: 'element'.
   637     elementVar := compiler allocateTemporaryVariableNamed: 'element'.
       
   638 
       
   639     self addGuard: node child ifTrue: nil ifFalse: [ compiler codeReturn: '#()' ].
   564 
   640 
   565     compiler codeAssign: 'OrderedCollection new.' to: self retvalVar.
   641     compiler codeAssign: 'OrderedCollection new.' to: self retvalVar.
   566     compiler codeStoreValueOf: [ self visit: node child ] intoVariable: elementVar.
   642     compiler codeStoreValueOf: [ self visit: node child ] intoVariable: elementVar.
   567     compiler add: '[ error ] whileFalse: ['.
   643     compiler add: '[ error ] whileFalse: ['.
   568     compiler indent.
   644     compiler indent.
   600 visitTokenNode: node
   676 visitTokenNode: node
   601     | startVar endVar |
   677     | startVar endVar |
   602     startVar := compiler allocateTemporaryVariableNamed: 'start'.
   678     startVar := compiler allocateTemporaryVariableNamed: 'start'.
   603     endVar := compiler allocateTemporaryVariableNamed: 'end'.
   679     endVar := compiler allocateTemporaryVariableNamed: 'end'.
   604     
   680     
       
   681     compiler profileTokenRead: (compiler idFor: node).
       
   682     
   605     compiler codeAssign: 'context position + 1.' to: startVar.
   683     compiler codeAssign: 'context position + 1.' to: startVar.
   606     compiler codeStoreValueOf: [ self visit: node child ] intoVariable: #whatever.
   684     compiler codeStoreValueOf: [ self visit: node child ] intoVariable: #whatever.
   607     compiler add: 'error ifFalse: [ '.
   685     compiler add: 'error ifFalse: [ '.
   608     compiler indent.	
   686     compiler indent.	
   609     compiler codeAssign: 'context position.' to: endVar.
   687     compiler codeAssign: 'context position.' to: endVar.
   658         compiler codeReturn.
   736         compiler codeReturn.
   659         compiler dedent.
   737         compiler dedent.
   660     compiler add: '].'.
   738     compiler add: '].'.
   661 !
   739 !
   662 
   740 
       
   741 visitTrimmingTokenCharacterNode: node
       
   742     ^ self visitTrimmingTokenNode: node
       
   743 !
       
   744 
   663 visitTrimmingTokenNode: node
   745 visitTrimmingTokenNode: node
   664     |  id guard startVar endVar |
   746     |  id guard startVar endVar |
   665 
   747 
   666     startVar := compiler allocateTemporaryVariableNamed: 'start'.
   748     startVar := compiler allocateTemporaryVariableNamed: 'start'.
   667     endVar := compiler allocateTemporaryVariableNamed:  'end'.
   749     endVar := compiler allocateTemporaryVariableNamed:  'end'.
   668     
   750     
   669     id := compiler idFor: node.
   751     id := compiler idFor: node.
   670 "	(id beginsWith: 'kw') ifTrue: [ self halt. ]."
   752     compiler profileTokenRead: id.
   671     "self compileFirstWhitespace: compiler."
   753     
   672     self compileTokenWhitespace: node.
   754     self compileTokenWhitespace: node.
   673 
   755 
   674     (arguments guards and: [(guard := PPCGuard on: node) makesSense]) ifTrue: [ 
   756     (arguments guards and: [(guard := PPCGuard on: node) makesSense]) ifTrue: [ 
   675         guard id: id, '_guard'.
   757         guard id: id, '_guard'.
   676         compiler add: 'context atEnd ifTrue: [ self error ].'.
   758         compiler add: 'context atEnd ifTrue: [ self error ].'.