[squeak-dev] The Inbox: Compiler-mtf.136.mcz
commits at source.squeak.org
commits at source.squeak.org
Tue Jan 11 23:11:44 UTC 2011
Matthew Fulmer uploaded a new version of Compiler to project The Inbox:
http://source.squeak.org/inbox/Compiler-mtf.136.mcz
==================== Summary ====================
Name: Compiler-mtf.136
Author: mtf
Time: 9 March 2010, 10:48:59.139 am
UUID: 71e22677-ede7-4e49-b415-6a70a97dcd9d
Ancestors: Compiler-nice.135, Compiler-mtf.105
Merge OpenGL compiler with trunk
=============== Diff against Compiler-nice.135 ===============
Item was added:
+ ----- Method: Parser>>matrixExpression: (in category 'expression types') -----
+ matrixExpression: primary
+ "primaryExpression [ ... ] -> index node"
+ | start rcvrNode selector args msgStart msgStop |
+ self primaryExpression ifFalse:[^false].
+ (hereType == #leftBracket) ifFalse:[^primary].
+ start := self startOfNextToken.
+ rcvrNode := parseNode.
+ selector := WriteStream on: (String new: 32).
+ args := OrderedCollection new.
+ [ self advance.
+ parseNode := nil.
+ self primaryExpression ifFalse:[^self expected:'expression'].
+ args size = 0
+ ifTrue:[selector nextPutAll:'matrixAt:']
+ ifFalse:[selector nextPutAll:'at:'].
+ args add: parseNode.
+ here == #, ] whileTrue.
+ (self match: #rightBracket) ifFalse:[^self expected:']'].
+
+ msgStart := start.
+ msgStop := self endOfLastToken.
+ (primary not and:[hereType == #leftArrow]) ifTrue:[
+ selector nextPutAll:'put:'.
+ start := self startOfNextToken.
+ self advance.
+ self expression ifFalse: [^self expected: 'Expression'].
+ (parseNode isKindOf: BlockNode) ifFalse:[
+ parseNode := BlockNode new
+ arguments: #()
+ statements: (OrderedCollection with: parseNode)
+ returns: false
+ from: encoder.
+ ].
+ args add: parseNode].
+ parseNode := MessageNode new
+ receiver: rcvrNode
+ selector: selector contents asSymbol
+ arguments: args
+ precedence: 1
+ from: encoder
+ sourceRange: (msgStart to: msgStop).
+ primary ifTrue:[^true].
+ (self messagePart: 3 repeat: true)
+ ifTrue: [hereType == #semicolon ifTrue: [self cascade]].
+ ^ true!
Item was changed:
----- Method: Parser>>messagePart:repeat: (in category 'expression types') -----
messagePart: level repeat: repeat
+ | start receiver selector args precedence words keywordStart type |
- | start receiver selector args precedence words keywordStart |
[receiver := parseNode.
(hereType == #keyword and: [level >= 3])
ifTrue:
[start := self startOfNextToken.
selector := WriteStream on: (String new: 32).
args := OrderedCollection new.
words := OrderedCollection new.
[hereType == #keyword]
whileTrue:
[keywordStart := self startOfNextToken + requestorOffset.
selector nextPutAll: self advance.
words addLast: (keywordStart to: self endOfLastToken + requestorOffset).
+ (self matrixExpression: true) ifFalse: [^self expected: 'Argument'].
- self primaryExpression ifFalse: [^self expected: 'Argument'].
self messagePart: 2 repeat: true.
args addLast: parseNode].
(Symbol hasInterned: selector contents ifTrue: [ :sym | selector := sym])
ifFalse: [ selector := self correctSelector: selector contents
wordIntervals: words
exprInterval: (start to: self endOfLastToken)
ifAbort: [ ^ self fail ] ].
precedence := 3]
ifFalse: [((hereType == #binary or: [hereType == #verticalBar])
and: [level >= 2])
ifTrue:
[start := self startOfNextToken.
+ selector := self advance asSymbol.
+ (self matrixExpression: true) ifFalse: [^self expected: 'Argument'].
- selector := self advance asOctetString asSymbol.
- self primaryExpression ifFalse: [^self expected: 'Argument'].
self messagePart: 1 repeat: true.
args := Array with: parseNode.
precedence := 2]
+ ifFalse: [(hereType == #word or:[hereType == #positionalMessage])
- ifFalse: [hereType == #word
ifTrue:
[start := self startOfNextToken.
+ type := hereType.
selector := self advance.
+ type == #word ifTrue:[
+ args := #().
+ ] ifFalse:[
+ args := self positionalArgs.
+ selector := selector,'/', args size printString.
+ ].
- args := #().
words := OrderedCollection with: (start + requestorOffset to: self endOfLastToken + requestorOffset).
(Symbol hasInterned: selector ifTrue: [ :sym | selector := sym])
ifFalse: [ selector := self correctSelector: selector
wordIntervals: words
exprInterval: (start to: self endOfLastToken)
ifAbort: [ ^ self fail ] ].
precedence := 1]
ifFalse: [^args notNil]]].
parseNode := MessageNode new
receiver: receiver
selector: selector
arguments: args
precedence: precedence
from: encoder
sourceRange: (start to: self endOfLastToken).
repeat]
whileTrue: [].
+ ^true
+ !
- ^true!
Item was added:
+ ----- Method: Parser>>positionalArgs (in category 'positional messages') -----
+ positionalArgs
+ "Parse a series of positional arguments, separated by comma."
+ | args |
+ (hereType == #rightParenthesis) ifTrue:[self advance. ^#()].
+ args := WriteStream on: (Array new: 3).
+ [
+ self positionalArgsExpression ifFalse:[^self expected: 'argument'].
+ args nextPut: parseNode.
+ hereType == #rightParenthesis ifTrue:[self advance. ^args contents].
+ here == #, ifFalse:[^self expected: 'comma'].
+ self advance.
+ ] repeat.
+ !
Item was added:
+ ----- Method: Parser>>positionalArgsExpression (in category 'positional messages') -----
+ positionalArgsExpression
+ "Just like #expression just keep track of commas"
+ (hereType == #word and: [tokenType == #leftArrow])
+ ifTrue: [^ self assignment: self variable].
+ hereType == #leftBrace
+ ifTrue: [self braceExpression]
+ ifFalse: [self primaryExpression ifFalse: [^ false]].
+ (here == #, or:[hereType == #rightParenthesis]) ifTrue:[^true].
+ ^self positionalMessagePart: 3 repeat: true!
Item was added:
+ ----- Method: Parser>>positionalMessagePart:repeat: (in category 'positional messages') -----
+ positionalMessagePart: level repeat: repeat
+ "Just like #messagePart but keep track of comma"
+ | start receiver selector args precedence words keywordStart type |
+ [receiver := parseNode.
+ (hereType == #keyword and: [level >= 3])
+ ifTrue:
+ [start := self startOfNextToken.
+ selector := WriteStream on: (String new: 32).
+ args := OrderedCollection new.
+ words := OrderedCollection new.
+ [hereType == #keyword]
+ whileTrue:
+ [keywordStart := self startOfNextToken + requestorOffset.
+ selector nextPutAll: self advance.
+ words addLast: (keywordStart to: self endOfLastToken + requestorOffset).
+ self primaryExpression ifFalse: [^self expected: 'Argument'].
+ self messagePart: 2 repeat: true.
+ args addLast: parseNode].
+ (Symbol hasInterned: selector contents ifTrue: [ :sym | selector := sym])
+ ifFalse: [ selector := self correctSelector: selector contents
+ wordIntervals: words
+ exprInterval: (start to: self endOfLastToken)
+ ifAbort: [ ^ self fail ] ].
+ precedence := 3]
+ ifFalse: [((hereType == #binary or: [hereType == #verticalBar])
+ and: [level >= 2 and:[here ~= #,]])
+ ifTrue:
+ [start := self startOfNextToken.
+ selector := self advance asSymbol.
+ self primaryExpression ifFalse: [^self expected: 'Argument'].
+ self messagePart: 1 repeat: true.
+ args := Array with: parseNode.
+ precedence := 2]
+ ifFalse: [(hereType == #word or:[hereType == #positionalMessage])
+ ifTrue:
+ [start := self startOfNextToken.
+ type := hereType.
+ selector := self advance.
+ type == #word ifTrue:[
+ args := #().
+ ] ifFalse:[
+ args := self positionalArgs.
+ selector := selector,'/', args size printString.
+ ].
+ words := OrderedCollection with: (start + requestorOffset to: self endOfLastToken + requestorOffset).
+ (Symbol hasInterned: selector ifTrue: [ :sym | selector := sym])
+ ifFalse: [ selector := self correctSelector: selector
+ wordIntervals: words
+ exprInterval: (start to: self endOfLastToken)
+ ifAbort: [ ^ self fail ] ].
+ precedence := 1]
+ ifFalse: [^args notNil]]].
+ parseNode := MessageNode new
+ receiver: receiver
+ selector: selector
+ arguments: args
+ precedence: precedence
+ from: encoder
+ sourceRange: (start to: self endOfLastToken).
+ repeat]
+ whileTrue: [].
+ ^true!
More information about the Squeak-dev
mailing list
|