--- a/Parser.st Thu Jul 08 17:22:09 1999 +0200
+++ b/Parser.st Thu Jul 08 17:42:03 1999 +0200
@@ -3740,7 +3740,7 @@
"parse a primary-expression; return a node-tree, nil or #Error"
|val var expr pos name t cls nameSpace nameSpaceGlobal globlName lnr node
- pos2 eMsg|
+ pos2 eMsg exprList|
pos := tokenPosition.
(tokenType == #Self) ifTrue:[
@@ -4114,6 +4114,47 @@
^ val
].
+ (tokenType == ${ ) ifTrue:[
+ AllowSqueakComputedArrays ifFalse:[
+ self parseError:'non-Standard Squeak extension (enable in settings)' position:pos to:tokenPosition.
+ ^ #Error
+ ].
+ self nextToken.
+ exprList := self squeakComputedArray.
+
+ tokenType ~~ $} ifTrue:[
+ self parseError:'''}'' expected' position:tokenPosition.
+ ^ #Error
+ ].
+ self nextToken.
+ ((tokenType == $_) or:[tokenType == #':=']) ifTrue:[
+ self parseError:'invalid assignment' position:pos to:tokenPosition.
+ ^ #Error
+ ].
+
+ "/ make it an array creation expression ...
+ expr := MessageNode
+ receiver:(VariableNode type:#GlobalVariable name:#Array)
+ selector:#new:
+ arg:(ConstantNode type:#Integer value:(exprList size)).
+
+ exprList size == 0 ifTrue:[
+ ^ expr.
+ ].
+ exprList keysAndValuesDo:[:idx :e |
+ expr := (idx == 1 ifTrue:[MessageNode] ifFalse:[CascadeNode])
+ receiver:expr
+ selector:#at:put:
+ arg1:(ConstantNode type:#Integer value:idx)
+ arg2:e
+ fold:false.
+ ].
+ expr := CascadeNode
+ receiver:expr
+ selector:#yourself.
+ ^ expr
+ ].
+
(tokenType == #Primitive) ifTrue:[
self nextToken.
node := PrimitiveNode code:tokenValue.
@@ -4145,6 +4186,30 @@
"Modified: / 3.8.1998 / 15:31:52 / cg"
!
+squeakComputedArray
+ |expressions elem pos1|
+
+ pos1 := tokenPosition.
+ expressions := OrderedCollection new:20.
+ [tokenType ~~ $} ] whileTrue:[
+ elem := self expression.
+ (elem == #Error) ifTrue:[
+ (tokenType == #EOF) ifTrue:[
+ self syntaxError:'unterminated computed-array-element; ''}'' expected'
+ position:pos1 to:tokenPosition
+ ].
+ ^ #Error
+ ].
+ expressions add:elem.
+ tokenType == $. ifTrue:[
+ self nextToken.
+ ] ifFalse:[
+ ^ expressions
+ ]
+ ].
+ ^ expressions
+!
+
unaryExpression
"parse a unary-expression; return a node-tree, nil or #Error"
@@ -4942,6 +5007,6 @@
!Parser class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libcomp/Parser.st,v 1.207 1999-07-04 17:48:24 cg Exp $'
+ ^ '$Header: /cvs/stx/stx/libcomp/Parser.st,v 1.208 1999-07-08 15:42:03 cg Exp $'
! !
Parser initialize!