--- a/Parser.st Thu May 02 10:44:30 2002 +0200
+++ b/Parser.st Thu May 02 11:09:10 2002 +0200
@@ -3038,6 +3038,18 @@
!Parser methodsFor:'error handling'!
+blockArgRedefined:tokenName from:pos1 to:pos2
+ "argname reuse"
+
+ self isSyntaxHighlighter ifTrue:[
+ self markBadIdentifierFrom:pos1 to:pos2.
+ ] ifFalse:[
+ self
+ syntaxError:'redefinition of ''' , tokenName , ''' in argument list.'
+ position:pos1 to:pos2
+ ].
+!
+
exitWith:something
"this is the longjump out of evaluation via a return expression"
@@ -3056,6 +3068,18 @@
^ #Error
!
+methodArgRedefined:tokenName from:pos1 to:pos2
+ "argname reuse"
+
+ self isSyntaxHighlighter ifTrue:[
+ self markBadIdentifierFrom:pos1 to:pos2.
+ ] ifFalse:[
+ self
+ syntaxError:'redefinition of ''' , tokenName , ''' in argument list.'
+ position:pos1 to:pos2
+ ].
+!
+
showErrorMessage:aMessage position:pos
"redefined since parser can give more detailed info about
the class & selector where the error occured."
@@ -3236,14 +3260,7 @@
argNames := Array with:tokenName.
] ifFalse:[
(argNames includes:tokenName) ifTrue:[
- "/ argname reuse
- self isSyntaxHighlighter ifTrue:[
- self markBadIdentifierFrom:tokenPosition to:pos2.
- ] ifFalse:[
- self
- syntaxError:'redefinition of ''' , tokenName , ''' in argument list.'
- position:tokenPosition to:pos2
- ]
+ self blockArgRedefined:tokenName from:tokenPosition to:pos2
].
args := args copyWith:arg.
argNames := argNames copyWith:tokenName.
@@ -3485,6 +3502,47 @@
"Created: / 14.12.1999 / 15:11:37 / cg"
!
+parseExtendedMethodSpec
+ |pos1 pos2 var|
+
+ "/ EXPERIMENTAL
+false ifTrue:[
+ (tokenType == #Symbol) ifTrue:[
+ pos1 := tokenPosition.
+ selector := token asSymbol.
+ self nextToken.
+ self markMethodSelectorFrom:pos1 to:(tokenPosition-1).
+ endOfSelectorPosition := tokenPosition.
+
+ tokenType == $( ifTrue:[
+ self nextToken.
+ [ tokenType ~~ $) ] whileTrue:[
+
+ (tokenType ~~ #Identifier) ifTrue:[^ #Error].
+ pos2 := tokenPosition+tokenName size-1.
+ self markArgumentIdentifierFrom:tokenPosition to:pos2.
+ var := Variable name:tokenName.
+ methodArgs isNil ifTrue:[
+ methodArgs := Array with:var.
+ methodArgNames := Array with:tokenName
+ ] ifFalse:[
+ (methodArgNames includes:tokenName) ifTrue:[
+ self methodArgRedefined:tokenName from:tokenPosition to:pos2
+ ].
+ methodArgs := methodArgs copyWith:var.
+ methodArgNames := methodArgNames copyWith:tokenName
+ ].
+ self nextToken.
+ ].
+ self nextToken.
+ ].
+
+ ^ self
+ ].
+].
+ ^ #Error
+!
+
parseMethod
"parse a method.
Return the parseTree or #Error.
@@ -3686,7 +3744,11 @@
selector := selector , tokenName.
self nextToken.
- (tokenType ~~ #Identifier) ifTrue:[^ #Error].
+ (tokenType ~~ #Identifier) ifTrue:[
+ "/ ^ #Error].
+ ^ self identifierExpectedIn:'method-arg declaration'
+ ].
+
pos2 := tokenPosition+tokenName size-1.
self markArgumentIdentifierFrom:tokenPosition to:pos2.
var := Variable name:tokenName.
@@ -3695,14 +3757,7 @@
methodArgNames := Array with:tokenName
] ifFalse:[
(methodArgNames includes:tokenName) ifTrue:[
- "/ argname reuse
- self isSyntaxHighlighter ifTrue:[
- self markBadIdentifierFrom:tokenPosition to:pos2.
- ] ifFalse:[
- self
- syntaxError:'redefinition of ''' , tokenName , ''' in argument list.'
- position:tokenPosition to:pos2
- ]
+ self methodArgRedefined:tokenName from:tokenPosition to:pos2
].
methodArgs := methodArgs copyWith:var.
methodArgNames := methodArgNames copyWith:tokenName
@@ -3720,7 +3775,6 @@
endOfSelectorPosition := tokenPosition.
^ self
].
-
"/ special handling for |, which is also a lexical token
tokenType == $| ifTrue:[
tokenType := #BinaryOperator.
@@ -3747,7 +3801,7 @@
^ self
].
- ^ #Error
+ ^ self parseExtendedMethodSpec
"Modified: / 31.3.1998 / 17:31:59 / cg"
!
@@ -6325,6 +6379,6 @@
!Parser class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libcomp/Parser.st,v 1.327 2002-03-05 17:55:45 tm Exp $'
+ ^ '$Header: /cvs/stx/stx/libcomp/Parser.st,v 1.328 2002-05-02 09:09:10 cg Exp $'
! !
Parser initialize!