Parser.st
changeset 1531 47f714bc1981
parent 1525 fefc1f7fd071
child 1534 2a298bacebfb
equal deleted inserted replaced
1530:ed400d564510 1531:47f714bc1981
  4696 !
  4696 !
  4697 
  4697 
  4698 binaryExpressionFor:receiverArg
  4698 binaryExpressionFor:receiverArg
  4699     "parse a binary-expression; return a node-tree, nil or #Error"
  4699     "parse a binary-expression; return a node-tree, nil or #Error"
  4700 
  4700 
  4701     |receiver theReceiver arg sel pos try lno note|
  4701     |receiver expr arg sel pos lno note|
  4702 
  4702 
  4703     receiver := receiverArg.
  4703     receiver := receiverArg.
  4704     (receiver == #Error) ifTrue:[^ #Error].
  4704     (receiver == #Error) ifTrue:[^ #Error].
  4705 
  4705 
  4706     "special kludge: since Scanner cannot know if -digit is a binary
  4706     "special kludge: since Scanner cannot know if -digit is a binary
  4738         ].
  4738         ].
  4739         self markSelector:sel from:pos to:(pos + sel size - 1) receiverNode:receiver.
  4739         self markSelector:sel from:pos to:(pos + sel size - 1) receiverNode:receiver.
  4740 
  4740 
  4741         arg := self unaryExpression.
  4741         arg := self unaryExpression.
  4742         (arg == #Error) ifTrue:[^ #Error].
  4742         (arg == #Error) ifTrue:[^ #Error].
  4743         theReceiver := receiver.
  4743 
  4744 
  4744         expr := BinaryNode receiver:receiver selector:sel arg:arg fold:foldConstants.
  4745         try := BinaryNode receiver:receiver selector:sel arg:arg fold:foldConstants.
  4745         expr isErrorNode ifTrue:[
  4746         (try isMemberOf:String) ifTrue:[
  4746             self parseError:(expr errorString) position:pos to:tokenPosition.
  4747             self parseError:try position:pos to:tokenPosition.
       
  4748             errorFlag := false. "ok, user wants it - so he'll get it"
  4747             errorFlag := false. "ok, user wants it - so he'll get it"
  4749             receiver := BinaryNode receiver:receiver selector:sel arg:arg fold:nil.
  4748             expr := BinaryNode receiver:receiver selector:sel arg:arg fold:nil.
  4750         ] ifFalse:[
  4749         ].
  4751             receiver := try
  4750         note := self plausibilityCheck:expr.
  4752         ].
       
  4753         note := self plausibilityCheck:receiver.
       
  4754         note notNil ifTrue:[
  4751         note notNil ifTrue:[
  4755             self warning:note position:pos to:tokenPosition
  4752             self warning:note position:pos to:tokenPosition
  4756         ].
  4753         ].
  4757         receiver lineNumber:lno.
  4754         expr lineNumber:lno.
  4758         receiver selectorPosition:pos.
  4755         expr selectorPosition:pos.
  4759         parseForCode ifFalse:[
  4756         parseForCode ifFalse:[
  4760             self rememberSelectorUsed:sel receiver:theReceiver
  4757             self rememberSelectorUsed:sel receiver:receiver
  4761         ].
  4758         ].
       
  4759         receiver := expr.   "/ for next message
       
  4760 
  4762     ].
  4761     ].
  4763     ^ receiver
  4762     ^ receiver
  4764 
  4763 
  4765     "Modified: / 9.1.1998 / 19:05:18 / stefan"
  4764     "Modified: / 9.1.1998 / 19:05:18 / stefan"
  4766     "Modified: / 19.1.2000 / 16:22:04 / cg"
  4765     "Modified: / 19.1.2000 / 16:22:04 / cg"
  5197 
  5196 
  5198      keywordExpression ::= binaryexpression
  5197      keywordExpression ::= binaryexpression
  5199                            | { KEYWORD-PART binaryExpression }
  5198                            | { KEYWORD-PART binaryExpression }
  5200     "
  5199     "
  5201 
  5200 
  5202     |lastReceiver receiver sel arg args posR1 posR2 pos1 pos2 try lno note positions|
  5201     |expr receiver sel arg args posR1 posR2 pos1 pos2 lno note positions|
  5203 
  5202 
  5204     receiver := receiverArg.
  5203     receiver := receiverArg.
  5205     posR1 := tokenPosition.
  5204     posR1 := tokenPosition.
  5206     (tokenType == #Keyword) ifTrue:[
  5205     (tokenType == #Keyword) ifFalse:[^ receiver].
  5207         pos1 := posR2 := tokenPosition.
  5206 
       
  5207     pos1 := posR2 := tokenPosition.
       
  5208     pos2 := tokenPosition + tokenName size - 1.
       
  5209     positions := OrderedCollection with:(pos1 to:pos2).
       
  5210     sel := tokenName.
       
  5211     lno := tokenLineNr.
       
  5212     self nextToken.
       
  5213     arg := self binaryExpression.
       
  5214     (arg == #Error) ifTrue:[^ #Error].
       
  5215     args := Array with:arg.
       
  5216     [tokenType == #Keyword] whileTrue:[
       
  5217         sel := sel , tokenName.
  5208         pos2 := tokenPosition + tokenName size - 1.
  5218         pos2 := tokenPosition + tokenName size - 1.
  5209         positions := OrderedCollection with:(pos1 to:pos2).
  5219         positions add:(tokenPosition to:pos2).
  5210         sel := tokenName.
       
  5211         lno := tokenLineNr.
       
  5212         self nextToken.
  5220         self nextToken.
  5213         arg := self binaryExpression.
  5221         arg := self binaryExpression.
  5214         (arg == #Error) ifTrue:[^ #Error].
  5222         (arg == #Error) ifTrue:[^ #Error].
  5215         args := Array with:arg.
  5223         args := args copyWith:arg.
  5216         [tokenType == #Keyword] whileTrue:[
  5224     ].
  5217             sel := sel , tokenName.
  5225 
  5218             pos2 := tokenPosition + tokenName size - 1.
  5226     positions do:[:p |
  5219             positions add:(tokenPosition to:pos2).
  5227         self markSelector:sel from:p start to:p stop receiverNode:receiver.
  5220             self nextToken.
  5228     ].
  5221             arg := self binaryExpression.
  5229     sel := self selectorCheck:sel for:receiver positions:positions.
  5222             (arg == #Error) ifTrue:[^ #Error].
  5230 
  5223             args := args copyWith:arg.
  5231     ignoreErrors ifFalse:[
  5224         ].
  5232         (Class definitionSelectors includes:sel) ifTrue:[
  5225 
  5233             receiver isVariable ifTrue:[
  5226         positions do:[:p |
  5234                 receiver isUndeclared ifTrue:[
  5227             self markSelector:sel from:p start to:p stop receiverNode:receiver.
  5235                     self parseError:('undefined superclass: ' , receiver name) position:pos1 to:pos2.
  5228         ].
  5236                 ].
  5229         sel := self selectorCheck:sel for:receiver positions:positions.
  5237             ]
  5230 
  5238         ].
  5231         ignoreErrors ifFalse:[
  5239     ].
  5232             (Class definitionSelectors includes:sel) ifTrue:[
  5240 
  5233                 receiver isVariable ifTrue:[
  5241     expr := MessageNode receiver:receiver selector:sel args:args fold:foldConstants.
  5234                     receiver isUndeclared ifTrue:[
  5242     expr isErrorNode ifTrue:[
  5235                         self parseError:('undefined superclass: ' , receiver name) position:pos1 to:pos2.
  5243         self parseError:(expr errorString) position:pos1 to:pos2.
  5236                     ].
  5244         errorFlag := false. "ok, user wants it - so he'll get it"
  5237                 ]
  5245         expr := MessageNode receiver:receiver selector:sel args:args fold:nil.
  5238             ].
  5246     ].
  5239         ].
  5247     expr lineNumber:lno.
  5240 
  5248     note := self plausibilityCheck:expr.
  5241         lastReceiver := receiver.
  5249     note notNil ifTrue:[
  5242         try := MessageNode receiver:receiver selector:sel args:args fold:foldConstants.
  5250         self warning:note position:pos1 to:pos2
  5243         (try isMemberOf:String) ifTrue:[
  5251     ].
  5244             self parseError:try position:pos1 to:pos2.
  5252     parseForCode ifFalse:[
  5245             errorFlag := false. "ok, user wants it - so he'll get it"
  5253         self rememberSelectorUsed:sel receiver:receiver
  5246             receiver := MessageNode receiver:receiver selector:sel args:args fold:nil.
  5254     ].
  5247         ] ifFalse:[
       
  5248             receiver := try
       
  5249         ].
       
  5250         note := self plausibilityCheck:receiver.
       
  5251         note notNil ifTrue:[
       
  5252             self warning:note position:pos1 to:pos2
       
  5253         ].
       
  5254         receiver lineNumber:lno.
       
  5255         parseForCode ifFalse:[
       
  5256             self rememberSelectorUsed:sel receiver:lastReceiver
       
  5257         ].
       
  5258 
  5255 
  5259 "/        (contextToEvaluateIn isNil and:[selfValue isNil]) ifTrue:[    "/ do not check this for doits
  5256 "/        (contextToEvaluateIn isNil and:[selfValue isNil]) ifTrue:[    "/ do not check this for doits
  5260 "/            receiver isSuper ifTrue:[
  5257 "/            receiver isSuper ifTrue:[
  5261 "/                sel ~= selector ifTrue:[
  5258 "/                sel ~= selector ifTrue:[
  5262 "/                    self warnCommonMistake:'possible bad super message (selector should be same as in current method) ?'
  5259 "/                    self warnCommonMistake:'possible bad super message (selector should be same as in current method) ?'
  5263 "/                                  position:posR1 to:posR2-1
  5260 "/                                  position:posR1 to:posR2-1
  5264 "/                ].
  5261 "/                ].
  5265 "/            ].
  5262 "/            ].
  5266 "/        ].
  5263 "/        ].
  5267 "/
  5264 "/
  5268         (sel = #and: or:[sel = #or:]) ifTrue:[
  5265     (sel = #and: or:[sel = #or:]) ifTrue:[
  5269             receiver arg1 isBlock ifFalse:[
  5266         expr arg1 isBlock ifFalse:[
  5270                 self warnCommonMistake:'(possible common mistake) missing block brackets ?'
  5267             self warnCommonMistake:'(possible common mistake) missing block brackets ?'
  5271                               position:pos2+1 to:tokenPosition-1
  5268                           position:pos2+1 to:tokenPosition-1
  5272             ]
  5269         ]
  5273         ].
  5270     ].
  5274         (sel = #whileTrue: or:[sel = #whileFalse:]) ifTrue:[
  5271     (sel = #whileTrue: or:[sel = #whileFalse:]) ifTrue:[
  5275             receiver receiver isBlock ifFalse:[
  5272         expr receiver isBlock ifFalse:[
  5276                 self warnCommonMistake:'(possible common mistake) missing block brackets ?'
  5273             self warnCommonMistake:'(possible common mistake) missing block brackets ?'
  5277                               position:posR1 to:posR2-1
  5274                           position:posR1 to:posR2-1
  5278             ]
  5275         ]
  5279         ].
  5276     ].
  5280     ].
  5277     ^ expr.
  5281     ^ receiver
       
  5282 
  5278 
  5283     "Modified: / 19.1.2000 / 16:22:22 / cg"
  5279     "Modified: / 19.1.2000 / 16:22:22 / cg"
  5284 !
  5280 !
  5285 
  5281 
  5286 nodeForMethodArg:varName
  5282 nodeForMethodArg:varName
  6178 !
  6174 !
  6179 
  6175 
  6180 unaryExpressionFor:receiverArg
  6176 unaryExpressionFor:receiverArg
  6181     "parse a unary-expression; return a node-tree, nil or #Error"
  6177     "parse a unary-expression; return a node-tree, nil or #Error"
  6182 
  6178 
  6183     |receiver thisReceiver sel pos pos2 try note|
  6179     |receiver expr sel pos pos2 note lNr arguments|
  6184 
  6180 
  6185     receiver := receiverArg.
  6181     receiver := receiverArg.
  6186     (receiver == #Error) ifTrue:[^ #Error].
  6182     (receiver == #Error) ifTrue:[^ #Error].
  6187     [ self isValidUnarySelector:tokenType ] whileTrue:[
  6183     [ self isValidUnarySelector:tokenType ] whileTrue:[
  6188         pos := tokenPosition.
  6184         pos := tokenPosition.
  6189         pos2 := pos + tokenName size - 1.
  6185         pos2 := pos + tokenName size - 1.
  6190         self markSelector:tokenName from:pos to:pos2 receiverNode:receiver.
  6186         lNr := tokenLineNr.
  6191         sel := tokenName.
  6187         sel := tokenName.
       
  6188 
       
  6189         self markSelector:sel from:pos to:pos2 receiverNode:receiver.
       
  6190 
       
  6191         self nextToken.
       
  6192         tokenType == $( ifTrue:[
       
  6193             allowSqueakExtensions == true ifTrue:[
       
  6194                 "/ croquet/squeak extension - c/java-style arguments
       
  6195                 arguments := self functionCallArgList.
       
  6196                 "/ synthetic selector: foo[:[with:[with:[...]]]]
       
  6197                 arguments notEmpty ifTrue:[
       
  6198                     sel := sel , ':'.
       
  6199                     arguments size - 1 timesRepeat:[ sel := sel , 'with:' ].
       
  6200                 ].
       
  6201                 sel := self selectorCheck:sel for:receiver position:pos to:pos2.
       
  6202                 expr := MessageNode receiver:receiver selector:sel args:arguments fold:foldConstants.
       
  6203                 expr isErrorNode ifTrue:[
       
  6204                     self parseError:(expr errorString) position:pos to:pos2.
       
  6205                     errorFlag := false. "ok, user wants it - so he'll get it"
       
  6206                     expr := MessageNode receiver:receiver selector:sel args:arguments fold:nil.
       
  6207                 ].
       
  6208                 expr lineNumber:lNr.
       
  6209                 note := self plausibilityCheck:receiver.
       
  6210                 note notNil ifTrue:[
       
  6211                     self warning:note position:pos to:pos2
       
  6212                 ].
       
  6213                 parseForCode ifFalse:[
       
  6214                     self rememberSelectorUsed:sel receiver:receiver
       
  6215                 ].
       
  6216                 ^ expr.
       
  6217             ].
       
  6218         ].
       
  6219 
  6192         sel := self selectorCheck:sel for:receiver position:pos to:pos2.
  6220         sel := self selectorCheck:sel for:receiver position:pos to:pos2.
  6193         thisReceiver := receiver.
  6221         expr := UnaryNode receiver:receiver selector:sel fold:foldConstants.
  6194         try := UnaryNode receiver:receiver selector:sel fold:foldConstants.
  6222         expr isErrorNode ifTrue:[
  6195         (try isMemberOf:String) ifTrue:[
  6223             self parseError:(expr errorString) position:pos to:pos2.
  6196             self parseError:try position:pos to:pos2.
       
  6197             errorFlag := false. "ok, user wants it - so he'll get it"
  6224             errorFlag := false. "ok, user wants it - so he'll get it"
  6198             receiver := UnaryNode receiver:receiver selector:sel fold:nil.
  6225             expr := UnaryNode receiver:receiver selector:sel fold:nil.
  6199         ] ifFalse:[
  6226         ].
  6200             receiver := try
  6227         expr lineNumber:lNr.
  6201         ].
  6228 
  6202         note := self plausibilityCheck:receiver.
  6229         note := self plausibilityCheck:receiver.
  6203         note notNil ifTrue:[
  6230         note notNil ifTrue:[
  6204             self warning:note position:pos to:pos2
  6231             self warning:note position:pos to:pos2
  6205         ].
  6232         ].
  6206         receiver lineNumber:tokenLineNr.
       
  6207         parseForCode ifFalse:[
  6233         parseForCode ifFalse:[
  6208             self rememberSelectorUsed:sel receiver:thisReceiver
  6234             self rememberSelectorUsed:sel receiver:receiver
  6209         ].
  6235         ].
  6210         self nextToken.
  6236 
       
  6237         receiver := expr.   "/ for next message
  6211     ].
  6238     ].
  6212     ^ receiver
  6239     ^ receiver
  6213 
  6240 
  6214     "Modified: / 6.2.2000 / 14:54:20 / cg"
  6241     "Modified: / 6.2.2000 / 14:54:20 / cg"
  6215 !
  6242 !
  7586 ! !
  7613 ! !
  7587 
  7614 
  7588 !Parser class methodsFor:'documentation'!
  7615 !Parser class methodsFor:'documentation'!
  7589 
  7616 
  7590 version
  7617 version
  7591     ^ '$Header: /cvs/stx/stx/libcomp/Parser.st,v 1.431 2004-06-28 07:22:50 ca Exp $'
  7618     ^ '$Header: /cvs/stx/stx/libcomp/Parser.st,v 1.432 2004-07-07 09:17:08 cg Exp $'
  7592 ! !
  7619 ! !
  7593 
  7620 
  7594 Parser initialize!
  7621 Parser initialize!