--- a/Parser.st Tue Mar 31 18:41:23 1998 +0200
+++ b/Parser.st Tue Mar 31 18:44:20 1998 +0200
@@ -1710,10 +1710,56 @@
"Created: / 31.3.1998 / 13:22:15 / cg"
!
+markBooleanConstantFrom:pos1 to:pos2
+
+ "Created: / 31.3.1998 / 18:06:22 / cg"
+!
+
+markConstantFrom:pos1 to:pos2
+
+ "Created: / 31.3.1998 / 18:06:24 / cg"
+!
+
+markGlobalIdentifierFrom:pos1 to:pos2
+
+ "Created: / 31.3.1998 / 15:29:39 / cg"
+!
+
+markHereFrom:pos1 to:pos2
+
+ "Created: / 31.3.1998 / 17:39:01 / cg"
+!
+
+markIdentifierFrom:pos1 to:pos2
+
+ "Created: / 31.3.1998 / 18:06:17 / cg"
+!
+
+markLocalIdentifierFrom:pos1 to:pos2
+
+ "Created: / 31.3.1998 / 15:29:35 / cg"
+!
+
+markMethodSelectorFrom:pos1 to:pos2
+
+ "Modified: / 31.3.1998 / 13:30:09 / cg"
+ "Created: / 31.3.1998 / 16:39:44 / cg"
+!
+
markSelectorFrom:pos1 to:pos2
"Created: / 31.3.1998 / 13:22:15 / cg"
"Modified: / 31.3.1998 / 13:30:09 / cg"
+!
+
+markSelfFrom:pos1 to:pos2
+
+ "Created: / 31.3.1998 / 17:49:38 / cg"
+!
+
+markSuperFrom:pos1 to:pos2
+
+ "Created: / 31.3.1998 / 17:40:20 / cg"
! !
!Parser methodsFor:'error correction'!
@@ -2560,6 +2606,8 @@
tokenValue := tokenValue negated
]
].
+ self markSelectorFrom:pos to:(pos + sel size - 1).
+
arg := self unaryExpression.
(arg == #Error) ifTrue:[^ #Error].
try := BinaryNode receiver:receiver selector:sel arg:arg fold:foldConstants.
@@ -2580,8 +2628,8 @@
].
^ receiver
- "Modified: / 5.8.1997 / 02:51:14 / cg"
"Modified: / 9.1.1998 / 19:05:18 / stefan"
+ "Modified: / 31.3.1998 / 18:17:29 / cg"
!
block
@@ -2592,44 +2640,47 @@
lno := tokenLineNr.
self nextToken.
(tokenType == $: ) ifTrue:[
- [tokenType == $:] whileTrue:[
- pos := tokenPosition.
- self nextToken.
- (tokenType == #Identifier) ifFalse:[
- ^ self identifierExpectedIn:'block-arg declaration'
- ].
- arg := Variable name:tokenName.
- args isNil ifTrue:[
- args := Array with:arg.
- argNames := Array with:tokenName.
- ] ifFalse:[
- (argNames includes:tokenName) ifTrue:[
- self syntaxError:'redefinition of ''' , tokenName , ''' in argument list.'
- position:tokenPosition
- to:(tokenPosition + tokenName size - 1)
- ].
- args := args copyWith:arg.
- argNames := argNames copyWith:tokenName.
- ].
- self nextToken
- ].
- (tokenType ~~ $| ) ifTrue:[
- "ST-80 allows [:arg ]"
- (tokenType == $] ) ifTrue:[
- node := BlockNode arguments:args home:currentBlock variables:nil.
- node lineNumber:lno.
- ^ node
- ].
- self syntaxError:'| expected after block-arg declaration'.
- ^ #Error
- ].
- self nextToken
+ [tokenType == $:] whileTrue:[
+ pos := tokenPosition.
+ self nextToken.
+ (tokenType == #Identifier) ifFalse:[
+ ^ self identifierExpectedIn:'block-arg declaration'
+ ].
+ self markArgumentIdentifierFrom:tokenPosition to:(tokenPosition + tokenName size - 1).
+ arg := Variable name:tokenName.
+ args isNil ifTrue:[
+ args := Array with:arg.
+ argNames := Array with:tokenName.
+ ] ifFalse:[
+ (argNames includes:tokenName) ifTrue:[
+ self syntaxError:'redefinition of ''' , tokenName , ''' in argument list.'
+ position:tokenPosition
+ to:(tokenPosition + tokenName size - 1)
+ ].
+ args := args copyWith:arg.
+ argNames := argNames copyWith:tokenName.
+ ].
+ self nextToken
+ ].
+ (tokenType ~~ $| ) ifTrue:[
+ "ST-80 allows [:arg ]"
+ (tokenType == $] ) ifTrue:[
+ node := BlockNode arguments:args home:currentBlock variables:nil.
+ node lineNumber:lno.
+ ^ node
+ ].
+ self syntaxError:'| expected after block-arg declaration'.
+ ^ #Error
+ ].
+ self nextToken
].
node := self blockBody:args.
(node notNil and:[node ~~ #Error]) ifTrue:[
- node lineNumber:lno.
+ node lineNumber:lno.
].
^ node
+
+ "Modified: / 31.3.1998 / 17:31:34 / cg"
!
blockBody:args
@@ -2815,14 +2866,14 @@
"parse a cascade-expression; return a node-tree, nil or #Error.
expression ::= keywordExpression
- | keywordExpression cascade
+ | keywordExpression cascade
cascade ::= ';' expressionSendPart
- | cascade ';' expressionSendPart
+ | cascade ';' expressionSendPart
expressionSendPart ::= { KEYWORD binaryExpression }
- | BINARYOPERATOR unaryExpression
- | IDENTIFIER
+ | BINARYOPERATOR unaryExpression
+ | IDENTIFIER
"
|receiver arg sel args pos pos2 lno|
@@ -2831,83 +2882,89 @@
receiver := self keywordExpression.
(receiver == #Error) ifTrue:[^ #Error].
(tokenType == $;) ifTrue:[
- [tokenType == $;] whileTrue:[
- receiver isMessage ifFalse:[
- self syntaxError:'left side of cascade must be a message expression'
- position:pos to:tokenPosition
- ].
- self nextToken.
- (tokenType == #Identifier) ifTrue:[
- sel := self selectorCheck:tokenName for:receiver position:tokenPosition to:(tokenPosition + tokenName size - 1).
- receiver := CascadeNode receiver:receiver selector:sel.
- receiver lineNumber:tokenLineNr.
- parseForCode ifFalse:[self rememberSelectorUsed:sel].
- self nextToken.
- ] ifFalse:[
- (tokenType == #BinaryOperator) ifTrue:[
- sel := self selectorCheck:tokenName for:receiver position:tokenPosition to:(tokenPosition + tokenName size - 1).
- lno := tokenLineNr.
- self nextToken.
- arg := self unaryExpression.
- (arg == #Error) ifTrue:[^ #Error].
- receiver := CascadeNode receiver:receiver selector:sel arg:arg.
- receiver lineNumber:lno.
- parseForCode ifFalse:[self rememberSelectorUsed:sel].
- ] ifFalse:[
- (tokenType == #Keyword) ifTrue:[
- pos := tokenPosition.
- lno := tokenLineNr.
- sel := tokenName.
- self nextToken.
- arg := self binaryExpression.
- (arg == #Error) ifTrue:[^ #Error].
- args := Array with:arg.
- [tokenType == #Keyword] whileTrue:[
- sel := sel , tokenName.
- self nextToken.
- arg := self binaryExpression.
- (arg == #Error) ifTrue:[^ #Error].
- args := args copyWith:arg.
- pos2 := tokenPosition
- ].
- sel := self selectorCheck:sel for:receiver position:pos to:pos2.
- receiver := CascadeNode receiver:receiver selector:sel args:args.
- receiver lineNumber:lno.
- parseForCode ifFalse:[self rememberSelectorUsed:sel].
- ] ifFalse:[
- (tokenType == #Error) ifTrue:[^ #Error].
- self syntaxError:('invalid cascade; ' , tokenType printString , ' unexpected')
- position:tokenPosition to:source position - 1.
- ^ #Error
- ]
- ]
- ]
- ].
-
- "obscure (unspecified ?) if selector follows; Question:
-
- is
- 'expr sel1; sel2 sel3'
-
- to be parsed as:
- (t := expr.
- t sel1.
- t sel2) sel3
-
- or:
- (t := expr.
- t sel1.
- t sel2 sel3)
- "
- ((tokenType == #Identifier)
- or:[(tokenType == #BinaryOperator)
- or:[tokenType == #Keyword]]) ifTrue:[
- self syntaxError:'ambigous cascade - please group using ( ...)'
- position:tokenPosition to:source position - 1.
- ^ #Error
- ]
+ [tokenType == $;] whileTrue:[
+ receiver isMessage ifFalse:[
+ self syntaxError:'left side of cascade must be a message expression'
+ position:pos to:tokenPosition
+ ].
+ self nextToken.
+ (tokenType == #Identifier) ifTrue:[
+ self markSelectorFrom:pos to:(tokenPosition + tokenName size - 1).
+ sel := self selectorCheck:tokenName for:receiver position:tokenPosition to:(tokenPosition + tokenName size - 1).
+ receiver := CascadeNode receiver:receiver selector:sel.
+ receiver lineNumber:tokenLineNr.
+ parseForCode ifFalse:[self rememberSelectorUsed:sel].
+ self nextToken.
+ ] ifFalse:[
+ (tokenType == #BinaryOperator) ifTrue:[
+ self markSelectorFrom:pos to:(tokenPosition + tokenName size - 1).
+ sel := self selectorCheck:tokenName for:receiver position:tokenPosition to:(tokenPosition + tokenName size - 1).
+ lno := tokenLineNr.
+ self nextToken.
+ arg := self unaryExpression.
+ (arg == #Error) ifTrue:[^ #Error].
+ receiver := CascadeNode receiver:receiver selector:sel arg:arg.
+ receiver lineNumber:lno.
+ parseForCode ifFalse:[self rememberSelectorUsed:sel].
+ ] ifFalse:[
+ (tokenType == #Keyword) ifTrue:[
+ self markSelectorFrom:pos to:(tokenPosition + tokenName size - 1).
+ pos := tokenPosition.
+ lno := tokenLineNr.
+ sel := tokenName.
+ self nextToken.
+ arg := self binaryExpression.
+ (arg == #Error) ifTrue:[^ #Error].
+ args := Array with:arg.
+ [tokenType == #Keyword] whileTrue:[
+ self markSelectorFrom:pos to:(tokenPosition + tokenName size - 1).
+ sel := sel , tokenName.
+ self nextToken.
+ arg := self binaryExpression.
+ (arg == #Error) ifTrue:[^ #Error].
+ args := args copyWith:arg.
+ pos2 := tokenPosition
+ ].
+ sel := self selectorCheck:sel for:receiver position:pos to:pos2.
+ receiver := CascadeNode receiver:receiver selector:sel args:args.
+ receiver lineNumber:lno.
+ parseForCode ifFalse:[self rememberSelectorUsed:sel].
+ ] ifFalse:[
+ (tokenType == #Error) ifTrue:[^ #Error].
+ self syntaxError:('invalid cascade; ' , tokenType printString , ' unexpected')
+ position:tokenPosition to:source position - 1.
+ ^ #Error
+ ]
+ ]
+ ]
+ ].
+
+ "obscure (unspecified ?) if selector follows; Question:
+
+ is
+ 'expr sel1; sel2 sel3'
+
+ to be parsed as:
+ (t := expr.
+ t sel1.
+ t sel2) sel3
+
+ or:
+ (t := expr.
+ t sel1.
+ t sel2 sel3)
+ "
+ ((tokenType == #Identifier)
+ or:[(tokenType == #BinaryOperator)
+ or:[tokenType == #Keyword]]) ifTrue:[
+ self syntaxError:'ambigous cascade - please group using ( ...)'
+ position:tokenPosition to:source position - 1.
+ ^ #Error
+ ]
].
^ receiver
+
+ "Modified: / 31.3.1998 / 17:52:52 / cg"
!
inWhichClassIsClassInstVar:aString
@@ -2956,7 +3013,7 @@
"parse a keyword-expression; return a node-tree, nil or #Error.
keywordExpression ::= binaryexpression
- | { KEYWORD-PART binaryExpression }
+ | { KEYWORD-PART binaryExpression }
"
|receiver sel arg args posR1 posR2 pos1 pos2 try lno note|
@@ -2965,56 +3022,58 @@
receiver := self binaryExpression.
(receiver == #Error) ifTrue:[^ #Error].
(tokenType == #Keyword) ifTrue:[
- pos1 := posR2 := tokenPosition.
- pos2 := tokenPosition + tokenName size - 1.
- 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.
- self nextToken.
- arg := self binaryExpression.
- (arg == #Error) ifTrue:[^ #Error].
- args := args copyWith:arg.
- ].
- sel := self selectorCheck:sel for:receiver position:pos1 to:pos2.
- 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.
- note := receiver plausibilityCheck.
- note notNil ifTrue:[
- self warning:note position:pos1 to:pos2
- ].
- ] ifFalse:[
- receiver := try
- ].
- receiver lineNumber:lno.
- parseForCode ifFalse:[self rememberSelectorUsed:sel].
-
- (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
- ]
- ].
+ self markSelectorFrom:tokenPosition to:(tokenPosition + tokenName size - 1).
+ pos1 := posR2 := tokenPosition.
+ pos2 := tokenPosition + tokenName size - 1.
+ sel := tokenName.
+ lno := tokenLineNr.
+ self nextToken.
+ arg := self binaryExpression.
+ (arg == #Error) ifTrue:[^ #Error].
+ args := Array with:arg.
+ [tokenType == #Keyword] whileTrue:[
+ self markSelectorFrom:tokenPosition to:(tokenPosition + tokenName size - 1).
+ sel := sel , tokenName.
+ pos2 := tokenPosition + tokenName size - 1.
+ self nextToken.
+ arg := self binaryExpression.
+ (arg == #Error) ifTrue:[^ #Error].
+ args := args copyWith:arg.
+ ].
+ sel := self selectorCheck:sel for:receiver position:pos1 to:pos2.
+ 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.
+ note := receiver plausibilityCheck.
+ note notNil ifTrue:[
+ self warning:note position:pos1 to:pos2
+ ].
+ ] ifFalse:[
+ receiver := try
+ ].
+ receiver lineNumber:lno.
+ parseForCode ifFalse:[self rememberSelectorUsed:sel].
+
+ (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
- "Modified: 18.7.1996 / 10:33:26 / cg"
+ "Modified: / 31.3.1998 / 17:54:16 / cg"
!
parseMethod
@@ -3101,58 +3160,59 @@
Return #Error or nil.
methodBodyVarSpec ::= '|' { IDENTIFIER } '|'
- | <empty>
+ | <empty>
"
|var pos msg|
((tokenType == #BinaryOperator) and:[tokenName = '<']) ifTrue:[
- self parsePrimitiveOrResourceSpecOrEmpty.
+ self parsePrimitiveOrResourceSpecOrEmpty.
].
(tokenType == $|) ifTrue:[
- "memorize position for declaration in correction"
- localVarDefPosition := tokenPosition.
- self nextToken.
- pos := tokenPosition.
- [tokenType == #Identifier] whileTrue:[
- var := Variable name:tokenName.
- methodVars isNil ifTrue:[
- methodVars := OrderedCollection with:var.
- methodVarNames := OrderedCollection with:tokenName
- ] ifFalse:[
- (methodVarNames includes:tokenName) ifTrue:[
- self parseError:'redefinition of ''' , tokenName , ''' in local variables'
- position:tokenPosition to:tokenPosition + tokenName size -1.
- ] ifFalse:[
- methodVars add:var.
- methodVarNames add:tokenName
- ]
- ].
- methodArgNames notNil ifTrue:[
- (methodArgNames includes:tokenName) ifTrue:[
- self warning:'local variable ''' , tokenName , ''' hides argument.'
- position:tokenPosition
- to:(tokenPosition + tokenName size - 1)
- ]
- ].
- self nextToken.
- pos := tokenPosition
- ].
- (tokenType ~~ $|) ifTrue:[
- (#(True False Self Nil Super ThisContext) includes:tokenType) ifTrue:[
- msg := 'Reserved keyword in local var declaration'
- ] ifFalse:[
- msg := 'Identifier or | expected in local var declaration'
- ].
- self syntaxError:msg position:tokenPosition to:source position-1.
- ^ #Error
- ].
- self nextToken
+ "memorize position for declaration in correction"
+ localVarDefPosition := tokenPosition.
+ self nextToken.
+ pos := tokenPosition.
+ [tokenType == #Identifier] whileTrue:[
+ self markLocalIdentifierFrom:tokenPosition to:(tokenPosition + tokenName size - 1).
+ var := Variable name:tokenName.
+ methodVars isNil ifTrue:[
+ methodVars := OrderedCollection with:var.
+ methodVarNames := OrderedCollection with:tokenName
+ ] ifFalse:[
+ (methodVarNames includes:tokenName) ifTrue:[
+ self parseError:'redefinition of ''' , tokenName , ''' in local variables'
+ position:tokenPosition to:tokenPosition + tokenName size -1.
+ ] ifFalse:[
+ methodVars add:var.
+ methodVarNames add:tokenName
+ ]
+ ].
+ methodArgNames notNil ifTrue:[
+ (methodArgNames includes:tokenName) ifTrue:[
+ self warning:'local variable ''' , tokenName , ''' hides argument.'
+ position:tokenPosition
+ to:(tokenPosition + tokenName size - 1)
+ ]
+ ].
+ self nextToken.
+ pos := tokenPosition
+ ].
+ (tokenType ~~ $|) ifTrue:[
+ (#(True False Self Nil Super ThisContext) includes:tokenType) ifTrue:[
+ msg := 'Reserved keyword in local var declaration'
+ ] ifFalse:[
+ msg := 'Identifier or | expected in local var declaration'
+ ].
+ self syntaxError:msg position:tokenPosition to:source position-1.
+ ^ #Error
+ ].
+ self nextToken
].
^ nil
- "Modified: 25.6.1997 / 15:45:35 / cg"
+ "Modified: / 31.3.1998 / 17:30:33 / cg"
!
parseMethodSpec
@@ -3174,11 +3234,11 @@
(tokenType == #Keyword) ifTrue:[
selector := ''.
[tokenType == #Keyword] whileTrue:[
- self markSelectorFrom:tokenPosition to:(tokenPosition+tokenName size).
+ self markMethodSelectorFrom:tokenPosition to:(tokenPosition+tokenName size-1).
selector := selector , tokenName.
self nextToken.
(tokenType ~~ #Identifier) ifTrue:[^ #Error].
- self markArgumentIdentifierFrom:tokenPosition to:(tokenPosition+tokenName size).
+ self markArgumentIdentifierFrom:tokenPosition to:(tokenPosition+tokenName size-1).
var := Variable name:tokenName.
methodArgs isNil ifTrue:[
methodArgs := Array with:var.
@@ -3198,7 +3258,7 @@
^ self
].
(tokenType == #Identifier) ifTrue:[
- self markSelectorFrom:tokenPosition to:(tokenPosition+tokenName size).
+ self markMethodSelectorFrom:tokenPosition to:(tokenPosition+tokenName size-1).
selector := tokenName asSymbol.
self nextToken.
^ self
@@ -3211,11 +3271,11 @@
].
(tokenType == #BinaryOperator) ifTrue:[
- self markSelectorFrom:tokenPosition to:(tokenPosition+tokenName size).
+ self markMethodSelectorFrom:tokenPosition to:(tokenPosition+tokenName size-1).
selector := tokenName asSymbol.
self nextToken.
(tokenType ~~ #Identifier) ifTrue:[^ #Error].
- self markArgumentIdentifierFrom:tokenPosition to:(tokenPosition+tokenName size).
+ self markArgumentIdentifierFrom:tokenPosition to:(tokenPosition+tokenName size-1).
var := Variable name:tokenName.
"/ methodArgs isNil ifTrue:[
@@ -3231,7 +3291,7 @@
^ #Error
- "Modified: / 31.3.1998 / 13:29:01 / cg"
+ "Modified: / 31.3.1998 / 17:31:59 / cg"
!
parsePrimitiveOrResourceSpecOrEmpty
@@ -3360,6 +3420,7 @@
selfNode isNil ifTrue:[
selfNode := SelfNode value:selfValue
].
+ self markSelfFrom:pos to:pos+3.
^ selfNode
].
(tokenType == #Identifier) ifTrue:[
@@ -3377,7 +3438,7 @@
only warn once
"
warnSTXHereExtensionUsed := false
- ]
+ ].
]
]
].
@@ -3598,6 +3659,7 @@
self parseError:'assignment to true' position:pos to:tokenPosition.
^ #Error
].
+ self markBooleanConstantFrom:pos to:pos+3.
^ ConstantNode type:#True value:true
].
(tokenType == #False) ifTrue:[
@@ -3606,6 +3668,7 @@
self parseError:'assignment to false' position:pos to:tokenPosition.
^ #Error
].
+ self markBooleanConstantFrom:pos to:pos+4.
^ ConstantNode type:#False value:false
].
(tokenType == #Super) ifTrue:[
@@ -3621,6 +3684,7 @@
superNode isNil ifTrue:[
superNode := SuperNode value:selfValue inClass:classToCompileFor
].
+ self markIdentifierFrom:pos to:pos+5.
^ superNode
].
(tokenType == #Here) ifTrue:[
@@ -3632,6 +3696,7 @@
classToCompileFor isNil ifTrue:[
self warning:'in which class are you ?' position:pos to:(pos + 3).
].
+ self markIdentifierFrom:pos to:pos+3.
^ SuperNode value:selfValue inClass:classToCompileFor here:true
].
(tokenType == #ThisContext) ifTrue:[
@@ -3640,6 +3705,7 @@
self parseError:'assignment to thisContext' position:pos to:tokenPosition.
^ #Error
].
+ self markIdentifierFrom:pos to:pos+10.
contextToEvaluateIn notNil ifTrue:[
^ VariableNode type:#ThisContext context:contextToEvaluateIn
] ifFalse:[
@@ -3726,7 +3792,7 @@
^ #Error
"Created: / 13.9.1995 / 12:50:50 / claus"
- "Modified: / 16.2.1998 / 14:11:12 / cg"
+ "Modified: / 31.3.1998 / 18:08:37 / cg"
!
statement
@@ -3881,51 +3947,69 @@
receiver := self primary.
(receiver == #Error) ifTrue:[^ #Error].
[tokenType == #Identifier] whileTrue:[
- pos := tokenPosition.
- pos2 := pos + tokenName size - 1.
- sel := self selectorCheck:tokenName for:receiver position:pos to:pos2.
- try := UnaryNode receiver:receiver selector:sel fold:foldConstants.
- (try isMemberOf:String) ifTrue:[
- self parseError:try 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
- ].
- receiver lineNumber:tokenLineNr.
- parseForCode ifFalse:[self rememberSelectorUsed:sel].
- self nextToken.
+ self markSelectorFrom:tokenPosition to:(tokenPosition + tokenName size - 1).
+ pos := tokenPosition.
+ pos2 := pos + tokenName size - 1.
+ sel := self selectorCheck:tokenName for:receiver position:pos to:pos2.
+ try := UnaryNode receiver:receiver selector:sel fold:foldConstants.
+ (try isMemberOf:String) ifTrue:[
+ self parseError:try 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
+ ].
+ receiver lineNumber:tokenLineNr.
+ parseForCode ifFalse:[self rememberSelectorUsed:sel].
+ self nextToken.
].
^ receiver
- "Modified: 21.3.1996 / 16:09:11 / cg"
+ "Modified: / 31.3.1998 / 17:53:36 / cg"
!
variable
"parse a variable; if undefined, notify error and correct if user wants to"
- |v|
-
+ |v pos1 type|
+
+ pos1 := tokenPosition.
v := self variableOrError:tokenName.
- (v == #Error) ifFalse:[^ v].
+ (v == #Error) ifFalse:[
+ (v isMemberOf:VariableNode) ifTrue:[
+ type := v type.
+ (type == #BlockVariable
+ or:[type == #MethodVariable]) ifTrue:[
+ self markLocalIdentifierFrom:pos1 to:pos1+tokenName size-1.
+ ] ifFalse:[
+ (type == #GlobalVariable) ifTrue:[
+ self markGlobalIdentifierFrom:pos1 to:pos1+tokenName size-1.
+ ] ifFalse:[
+ self markIdentifierFrom:pos1 to:pos1+tokenName size-1.
+ ]
+ ]
+ ].
+ ^ v
+ ].
v := self correctVariable.
(v == #Error) ifFalse:[^ v].
parseForCode ifFalse:[
- self rememberGlobalUsed:tokenName
+ self rememberGlobalUsed:tokenName
] ifTrue:[
- tokenName first isLowercase ifTrue:[
- ImplicitSelfSends ifTrue:[
- selfNode isNil ifTrue:[
- selfNode := SelfNode value:selfValue
- ].
- ^ UnaryNode receiver:selfNode selector:('implicit_' , tokenName) asSymbol.
- ].
- ^ #Error
- ]
+ tokenName first isLowercase ifTrue:[
+ ImplicitSelfSends ifTrue:[
+ selfNode isNil ifTrue:[
+ selfNode := SelfNode value:selfValue
+ ].
+ ^ UnaryNode receiver:selfNode selector:('implicit_' , tokenName) asSymbol.
+ ].
+ ^ #Error
+ ]
].
+ self markGlobalIdentifierFrom:pos1 to:pos1+tokenName size-1.
^ VariableNode type:#GlobalVariable name:tokenName asSymbol
- "Modified: 19.12.1996 / 22:30:01 / cg"
+ "Modified: / 31.3.1998 / 18:15:17 / cg"
!
variableOrError
@@ -4506,6 +4590,6 @@
!Parser class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libcomp/Parser.st,v 1.156 1998-03-31 12:00:31 cg Exp $'
+ ^ '$Header: /cvs/stx/stx/libcomp/Parser.st,v 1.157 1998-03-31 16:44:20 cg Exp $'
! !
Parser initialize!