class: Parser
authorClaus Gittinger <cg@exept.de>
Wed, 23 Jan 2013 18:50:16 +0100
changeset 2996 286c5425492a
parent 2995 ced78dd20036
child 2997 c9e4109b6420
class: Parser added: #parsePragma changed: #arrayIndexingExpression #parsePrimitive #parseResourcePragma fix for <pragma: +arrayIndexSyntaxExtension>
Parser.st
--- a/Parser.st	Tue Jan 15 17:34:47 2013 +0100
+++ b/Parser.st	Wed Jan 23 18:50:16 2013 +0100
@@ -5947,13 +5947,15 @@
 
 arrayIndexingExpression
     "parse an array index expression; this is a squeak/stx extension.
-     foo[idx] is syntactic sugar for foo matrixAt:x
-     and foo[idx] := expr is syntactic sugar for foo matrixAt:x put:expr"
+     foo[x] is syntactic sugar for 'foo at:x'
+     and foo[x] := expr is syntactic sugar for 'foo at:x put:expr';
+     with commas, foo[x , y] generates foo at:x at:y"
 
     |receiver argList selectorStream valNode|
 
     receiver := self functionCallExpression.
     tokenType == $[ ifFalse:[^ receiver].
+
     parserFlags allowArrayIndexSyntaxExtension == true ifFalse:[^ receiver.].
     (receiver == #Error) ifTrue:[^ #Error].
 
@@ -5965,7 +5967,7 @@
             |indexNode|
 
             self nextToken.
-            indexNode := self primary.
+            indexNode := self expression.
             argList isEmpty ifTrue:[selectorStream nextPutAll:'_'].
             selectorStream nextPutAll:'at:'.
             argList add: indexNode.
@@ -8496,6 +8498,38 @@
     "Modified (comment): / 09-04-2012 / 20:18:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
+parsePragma
+    " '<' has already been parsed."
+    
+    |type flagValue|
+
+    type := token.
+    type ~= 'pragma:' ifTrue:[
+        self parseError:'pragma expected'.
+        ^ #self
+    ].
+
+    self nextToken.
+    ((token = '+') or:[token = '-']) ifTrue:[
+        flagValue := (token = '+').
+        self nextToken.
+        (tokenType == #Identifier) ifTrue:[
+            token = 'arrayIndexSyntaxExtension' ifTrue:[
+                parserFlags perform:('allow',token asUppercaseFirst,':') asSymbol with:flagValue.
+                self nextToken.
+                self checkForClosingAngle.
+                ^ self.
+            ].
+        ].
+        self halt.
+        self parseError:'unknown pragma'.
+        ^  self
+    ].
+
+    self parseError:'+/- expected'.
+    ^ self
+!
+
 parsePrimitive
     "parse an ST-80 type primitive as '< primitive: nr >';
         (return primitive number or #Error)
@@ -8581,6 +8615,12 @@
         "/ no primitive number
         .
     ].
+    (tokenName = 'pragma:') ifTrue:[
+        self parsePragma.
+        ^ nil
+        "/ no primitive number
+        .
+    ].
     (tokenName = 'exception:' or:[ tokenName = 'context:' ]) ifTrue:[
         (self parseExceptionOrContextPragma) == #Error ifTrue:[
             ^ #Error
@@ -8670,29 +8710,13 @@
 !
 
 parseResourcePragma
-    " '< resource:' has already been parsed."
+    " '<' has already been parsed."
     
-    |type keys resource resourceValue flagValue|
+    |type keys resource resourceValue|
 
     type := token.
     self nextToken.
     (tokenType ~~ #Symbol) ifTrue:[
-        type = 'pragma:' ifTrue:[
-            ((token = '+') or:[token = '-']) ifTrue:[
-                flagValue := (token = '+').
-                self nextToken.
-                (tokenType == #Identifier) ifTrue:[
-                    token = 'arrayIndexSyntaxExtension' ifTrue:[
-                        parserFlags perform:('allow',token asUppercaseFirst,':') asSymbol with:flagValue.
-                        self nextToken.
-                        self checkForClosingAngle.
-                        ^ self.
-                    ].
-self halt.
-                ].
-            ].
-        ].
-
         self parseError:'symbol expected'.
         ^ #Error
     ].
@@ -10894,11 +10918,11 @@
 !Parser class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libcomp/Parser.st,v 1.734 2013-01-15 16:34:47 stefan Exp $'
+    ^ '$Header: /cvs/stx/stx/libcomp/Parser.st,v 1.735 2013-01-23 17:50:16 cg Exp $'
 !
 
 version_CVS
-    ^ '$Header: /cvs/stx/stx/libcomp/Parser.st,v 1.734 2013-01-15 16:34:47 stefan Exp $'
+    ^ '$Header: /cvs/stx/stx/libcomp/Parser.st,v 1.735 2013-01-23 17:50:16 cg Exp $'
 !
 
 version_SVN