class: Parser
added: #parsePragma
changed:
#arrayIndexingExpression
#parsePrimitive
#parseResourcePragma
fix for <pragma: +arrayIndexSyntaxExtension>
--- 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