[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
|