Parser.st
changeset 894 943b6d0d26b3
parent 887 e42ea977b85d
child 897 346df366b4d5
--- 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!