--- a/Parser.st Wed Jul 07 11:16:49 2004 +0200
+++ b/Parser.st Wed Jul 07 11:17:08 2004 +0200
@@ -4698,7 +4698,7 @@
binaryExpressionFor:receiverArg
"parse a binary-expression; return a node-tree, nil or #Error"
- |receiver theReceiver arg sel pos try lno note|
+ |receiver expr arg sel pos lno note|
receiver := receiverArg.
(receiver == #Error) ifTrue:[^ #Error].
@@ -4740,25 +4740,24 @@
arg := self unaryExpression.
(arg == #Error) ifTrue:[^ #Error].
- theReceiver := receiver.
-
- try := BinaryNode receiver:receiver selector:sel arg:arg fold:foldConstants.
- (try isMemberOf:String) ifTrue:[
- self parseError:try position:pos to:tokenPosition.
+
+ expr := BinaryNode receiver:receiver selector:sel arg:arg fold:foldConstants.
+ expr isErrorNode ifTrue:[
+ self parseError:(expr errorString) position:pos to:tokenPosition.
errorFlag := false. "ok, user wants it - so he'll get it"
- receiver := BinaryNode receiver:receiver selector:sel arg:arg fold:nil.
- ] ifFalse:[
- receiver := try
- ].
- note := self plausibilityCheck:receiver.
+ expr := BinaryNode receiver:receiver selector:sel arg:arg fold:nil.
+ ].
+ note := self plausibilityCheck:expr.
note notNil ifTrue:[
self warning:note position:pos to:tokenPosition
].
- receiver lineNumber:lno.
- receiver selectorPosition:pos.
+ expr lineNumber:lno.
+ expr selectorPosition:pos.
parseForCode ifFalse:[
- self rememberSelectorUsed:sel receiver:theReceiver
- ].
+ self rememberSelectorUsed:sel receiver:receiver
+ ].
+ receiver := expr. "/ for next message
+
].
^ receiver
@@ -5199,62 +5198,60 @@
| { KEYWORD-PART binaryExpression }
"
- |lastReceiver receiver sel arg args posR1 posR2 pos1 pos2 try lno note positions|
+ |expr receiver sel arg args posR1 posR2 pos1 pos2 lno note positions|
receiver := receiverArg.
posR1 := tokenPosition.
- (tokenType == #Keyword) ifTrue:[
- pos1 := posR2 := tokenPosition.
+ (tokenType == #Keyword) ifFalse:[^ receiver].
+
+ pos1 := posR2 := tokenPosition.
+ pos2 := tokenPosition + tokenName size - 1.
+ positions := OrderedCollection with:(pos1 to:pos2).
+ sel := tokenName.
+ lno := tokenLineNr.
+ self nextToken.
+ arg := self binaryExpression.
+ (arg == #Error) ifTrue:[^ #Error].
+ args := Array with:arg.
+ [tokenType == #Keyword] whileTrue:[
+ sel := sel , tokenName.
pos2 := tokenPosition + tokenName size - 1.
- positions := OrderedCollection with:(pos1 to:pos2).
- sel := tokenName.
- lno := tokenLineNr.
+ positions add:(tokenPosition to:pos2).
self nextToken.
arg := self binaryExpression.
(arg == #Error) ifTrue:[^ #Error].
- args := Array with:arg.
- [tokenType == #Keyword] whileTrue:[
- sel := sel , tokenName.
- pos2 := tokenPosition + tokenName size - 1.
- positions add:(tokenPosition to:pos2).
- self nextToken.
- arg := self binaryExpression.
- (arg == #Error) ifTrue:[^ #Error].
- args := args copyWith:arg.
- ].
-
- positions do:[:p |
- self markSelector:sel from:p start to:p stop receiverNode:receiver.
- ].
- sel := self selectorCheck:sel for:receiver positions:positions.
-
- ignoreErrors ifFalse:[
- (Class definitionSelectors includes:sel) ifTrue:[
- receiver isVariable ifTrue:[
- receiver isUndeclared ifTrue:[
- self parseError:('undefined superclass: ' , receiver name) position:pos1 to:pos2.
- ].
- ]
- ].
- ].
-
- lastReceiver := receiver.
- try := MessageNode receiver:receiver selector:sel args:args fold:foldConstants.
- (try isMemberOf:String) ifTrue:[
- self parseError:try position:pos1 to:pos2.
- errorFlag := false. "ok, user wants it - so he'll get it"
- receiver := MessageNode receiver:receiver selector:sel args:args fold:nil.
- ] ifFalse:[
- receiver := try
- ].
- note := self plausibilityCheck:receiver.
- note notNil ifTrue:[
- self warning:note position:pos1 to:pos2
- ].
- receiver lineNumber:lno.
- parseForCode ifFalse:[
- self rememberSelectorUsed:sel receiver:lastReceiver
- ].
+ args := args copyWith:arg.
+ ].
+
+ positions do:[:p |
+ self markSelector:sel from:p start to:p stop receiverNode:receiver.
+ ].
+ sel := self selectorCheck:sel for:receiver positions:positions.
+
+ ignoreErrors ifFalse:[
+ (Class definitionSelectors includes:sel) ifTrue:[
+ receiver isVariable ifTrue:[
+ receiver isUndeclared ifTrue:[
+ self parseError:('undefined superclass: ' , receiver name) position:pos1 to:pos2.
+ ].
+ ]
+ ].
+ ].
+
+ expr := MessageNode receiver:receiver selector:sel args:args fold:foldConstants.
+ expr isErrorNode ifTrue:[
+ self parseError:(expr errorString) position:pos1 to:pos2.
+ errorFlag := false. "ok, user wants it - so he'll get it"
+ expr := MessageNode receiver:receiver selector:sel args:args fold:nil.
+ ].
+ expr lineNumber:lno.
+ note := self plausibilityCheck:expr.
+ note notNil ifTrue:[
+ self warning:note position:pos1 to:pos2
+ ].
+ parseForCode ifFalse:[
+ self rememberSelectorUsed:sel receiver:receiver
+ ].
"/ (contextToEvaluateIn isNil and:[selfValue isNil]) ifTrue:[ "/ do not check this for doits
"/ receiver isSuper ifTrue:[
@@ -5265,20 +5262,19 @@
"/ ].
"/ ].
"/
- (sel = #and: or:[sel = #or:]) ifTrue:[
- receiver arg1 isBlock ifFalse:[
- self warnCommonMistake:'(possible common mistake) missing block brackets ?'
- position:pos2+1 to:tokenPosition-1
- ]
- ].
- (sel = #whileTrue: or:[sel = #whileFalse:]) ifTrue:[
- receiver receiver isBlock ifFalse:[
- self warnCommonMistake:'(possible common mistake) missing block brackets ?'
- position:posR1 to:posR2-1
- ]
- ].
- ].
- ^ receiver
+ (sel = #and: or:[sel = #or:]) ifTrue:[
+ expr arg1 isBlock ifFalse:[
+ self warnCommonMistake:'(possible common mistake) missing block brackets ?'
+ position:pos2+1 to:tokenPosition-1
+ ]
+ ].
+ (sel = #whileTrue: or:[sel = #whileFalse:]) ifTrue:[
+ expr receiver isBlock ifFalse:[
+ self warnCommonMistake:'(possible common mistake) missing block brackets ?'
+ position:posR1 to:posR2-1
+ ]
+ ].
+ ^ expr.
"Modified: / 19.1.2000 / 16:22:22 / cg"
!
@@ -6180,34 +6176,65 @@
unaryExpressionFor:receiverArg
"parse a unary-expression; return a node-tree, nil or #Error"
- |receiver thisReceiver sel pos pos2 try note|
+ |receiver expr sel pos pos2 note lNr arguments|
receiver := receiverArg.
(receiver == #Error) ifTrue:[^ #Error].
[ self isValidUnarySelector:tokenType ] whileTrue:[
pos := tokenPosition.
pos2 := pos + tokenName size - 1.
- self markSelector:tokenName from:pos to:pos2 receiverNode:receiver.
+ lNr := tokenLineNr.
sel := tokenName.
+
+ self markSelector:sel from:pos to:pos2 receiverNode:receiver.
+
+ self nextToken.
+ tokenType == $( ifTrue:[
+ allowSqueakExtensions == true ifTrue:[
+ "/ croquet/squeak extension - c/java-style arguments
+ arguments := self functionCallArgList.
+ "/ synthetic selector: foo[:[with:[with:[...]]]]
+ arguments notEmpty ifTrue:[
+ sel := sel , ':'.
+ arguments size - 1 timesRepeat:[ sel := sel , 'with:' ].
+ ].
+ sel := self selectorCheck:sel for:receiver position:pos to:pos2.
+ expr := MessageNode receiver:receiver selector:sel args:arguments fold:foldConstants.
+ expr isErrorNode ifTrue:[
+ self parseError:(expr errorString) position:pos to:pos2.
+ errorFlag := false. "ok, user wants it - so he'll get it"
+ expr := MessageNode receiver:receiver selector:sel args:arguments fold:nil.
+ ].
+ expr lineNumber:lNr.
+ note := self plausibilityCheck:receiver.
+ note notNil ifTrue:[
+ self warning:note position:pos to:pos2
+ ].
+ parseForCode ifFalse:[
+ self rememberSelectorUsed:sel receiver:receiver
+ ].
+ ^ expr.
+ ].
+ ].
+
sel := self selectorCheck:sel for:receiver position:pos to:pos2.
- thisReceiver := receiver.
- try := UnaryNode receiver:receiver selector:sel fold:foldConstants.
- (try isMemberOf:String) ifTrue:[
- self parseError:try position:pos to:pos2.
+ expr := UnaryNode receiver:receiver selector:sel fold:foldConstants.
+ expr isErrorNode ifTrue:[
+ self parseError:(expr errorString) position:pos to:pos2.
errorFlag := false. "ok, user wants it - so he'll get it"
- receiver := UnaryNode receiver:receiver selector:sel fold:nil.
- ] ifFalse:[
- receiver := try
- ].
+ expr := UnaryNode receiver:receiver selector:sel fold:nil.
+ ].
+ expr lineNumber:lNr.
+
note := self plausibilityCheck:receiver.
note notNil ifTrue:[
self warning:note position:pos to:pos2
].
- receiver lineNumber:tokenLineNr.
parseForCode ifFalse:[
- self rememberSelectorUsed:sel receiver:thisReceiver
- ].
- self nextToken.
+ self rememberSelectorUsed:sel receiver:receiver
+ ].
+
+ receiver := expr. "/ for next message
].
^ receiver
@@ -7588,7 +7615,7 @@
!Parser class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libcomp/Parser.st,v 1.431 2004-06-28 07:22:50 ca Exp $'
+ ^ '$Header: /cvs/stx/stx/libcomp/Parser.st,v 1.432 2004-07-07 09:17:08 cg Exp $'
! !
Parser initialize!