[squeak-dev] The Inbox: Compiler-nice.280.mcz

commits at source.squeak.org commits at source.squeak.org
Mon Feb 24 21:41:59 UTC 2014


Nicolas Cellier uploaded a new version of Compiler to project The Inbox:
http://source.squeak.org/inbox/Compiler-nice.280.mcz

==================== Summary ====================

Name: Compiler-nice.280
Author: nice
Time: 24 February 2014, 10:41:41.999 pm
UUID: 6e62064c-bd88-4957-98e4-c57da15738fc
Ancestors: Compiler-nice.279

Accept ^ as a binary selector
With this change, binary selector can be arbitrarily composed of #verticalBar | #upArrow ^ or any other Character classified as #binary (See Scanner class>>initializeTypeTable)

=============== Diff against Compiler-nice.279 ===============

Item was changed:
  ----- Method: Parser>>messagePart:repeat: (in category 'expression types') -----
  messagePart: level repeat: repeat
  
  	| 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 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: [
+ 			(level >= 2 and: [hereType == #verticalBar or: [hereType == #upArrow]]) ifTrue: [self transformVerticalBarAndUpArrowIntoABinarySelector].
- 			(level >= 2 and: [hereType == #verticalBar]) ifTrue: [self transformAVerticalBarIntoABinarySelector].
  			(hereType == #binary and: [level >= 2])
  				ifTrue: 
  					[start := self startOfNextToken.
  					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
  						ifTrue: 
  							[start := self startOfNextToken.
  							selector := self advance.
  							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!

Item was changed:
  ----- Method: Parser>>pattern:inContext: (in category 'expression types') -----
  pattern: fromDoit inContext: ctxt
  	" unarySelector | binarySelector arg | keyword arg {keyword arg} =>
  	{selector, arguments, precedence}."
  	| args selector |
  	doitFlag := fromDoit.
  	fromDoit ifTrue:
  		[^ctxt == nil
  			ifTrue: [{#DoIt. {}. 1}]
  			ifFalse: [{#DoItIn:. {encoder encodeVariable: encoder doItInContextName}. 3}]].
  
  	hereType == #word ifTrue: [^ {self advance asSymbol. {}. 1}].
  
+ 	(hereType == #verticalBar or: [hereType == #upArrow]) ifTrue: [self transformVerticalBarAndUpArrowIntoABinarySelector].
+ 	hereType == #binary ifTrue: 
- 	(hereType == #binary or: [hereType == #verticalBar]) ifTrue: 
  		[selector := self advance asSymbol.
  		args := Array with: (encoder bindArg: self argumentName).
  		^ {selector. args. 2}].
  
  	hereType == #keyword ifTrue: 
  		[selector := WriteStream on: (String new: 32).
  		args := OrderedCollection new.
  		[hereType == #keyword] whileTrue:[
  			selector nextPutAll: self advance.
  			args addLast: (encoder bindArg: self argumentName).
  		].
  		^ {selector contents asSymbol. args. 3}].
  	^self expected: 'Message pattern'!

Item was removed:
- ----- Method: Parser>>transformAVerticalBarIntoABinarySelector (in category 'scanning') -----
- transformAVerticalBarIntoABinarySelector
- 	"Transform a vertical bar into a binary selector.
- 	Eventually aggregate a serie of immediately following vertical bars and a binary selector.
- 	Note that this aggregation cannot occur at scan time, because a pair of vertical bars can be encountered in two valid constructs:
- 	- either as an empty temporaries specification,
- 	- or as a local temporaries specification in a block of arity > 0"
- 	here := '|'.
- 	hereType := #binary.
- 	[tokenType == #verticalBar and: [hereMark + here size = mark]]
- 		whileTrue: [
- 			here := here , '|'.
- 			hereEnd := hereEnd + 1.
- 			self scanToken].
- 	(tokenType == #binary and: [hereMark + here size = mark])
- 		ifTrue: [
- 			here := here asString , token.
- 			hereType := #binary.
- 			hereEnd := hereEnd + token size.
- 			self scanToken].!

Item was added:
+ ----- Method: Parser>>transformVerticalBarAndUpArrowIntoABinarySelector (in category 'scanning') -----
+ transformVerticalBarAndUpArrowIntoABinarySelector
+ 	"Transform a vertical bar and or a up arrow into a binary selector.
+ 	Eventually aggregate a serie of immediately following vertical bars, up arrows and a binary selector.
+ 	Note that this aggregation cannot occur at scan time, because a pair of vertical bars can be encountered in two valid constructs:
+ 	- either as an empty temporaries specification,
+ 	- or as a local temporaries specification in a block of arity > 0"
+ 	here := String with: here.
+ 	hereType := #binary.
+ 	[(tokenType == #verticalBar or: [tokenType == #upArrow]) and: [hereMark + here size = mark]]
+ 		whileTrue: [
+ 			here := here , (String with: token).
+ 			hereEnd := hereEnd + 1.
+ 			self scanToken].
+ 	(tokenType == #binary and: [hereMark + here size = mark])
+ 		ifTrue: [
+ 			here := here asString , token.
+ 			hereType := #binary.
+ 			hereEnd := hereEnd + token size.
+ 			self scanToken].!

Item was changed:
  ----- Method: Scanner>>xBinary (in category 'multi-character scans') -----
  xBinary
  
+ 	| startOfToken type |
- 	| startOfToken |
  	tokenType := #binary.
  	startOfToken := mark.
  	token := String with: self step.
+ 	[(type := self typeTableAt: hereChar) == #xBinary or: [type == #verticalBar or: [type == #upArrow]]] whileTrue:
- 	[(self typeTableAt: hereChar) == #xBinary or: [(self typeTableAt: hereChar) == #verticalBar]] whileTrue:
  		[(hereChar == $- and: [(self typeTableAt: aheadChar) == #xDigit])
  			ifTrue: [^self ambiguousSelector: (token , '-')
  					inRange: (startOfToken to: source position - 1).].
  		token := token, (String with: self step)].
  	token := token asSymbol!



More information about the Squeak-dev mailing list