Parser.st
changeset 663 6c6a20f144ea
parent 660 f68ddffc6921
child 664 63d1460e8ee3
--- 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!