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!
squeak-dev@lists.squeakfoundation.org