'From Squeak3.9 of 7 November 2006 [latest update: #7067] on 18 July 2007 at 5:49:30 pm'! Compiler subclass: #ModifiedCompiler instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Category-doukaku2-2'! Parser subclass: #ModifiedParser instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Category-doukaku2-2'! !ModifiedCompiler class methodsFor: 'accessing' stamp: 'sumim 7/18/2007 17:44'! parserClass ^ModifiedParser! ! !ModifiedParser methodsFor: 'multi-character scans' stamp: 'sumim 7/18/2007 17:43'! 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: [((hereType == #binary or: [hereType == #verticalBar]) 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 == #multiplicative and: [level >= 1]) ifTrue: [start := self startOfNextToken. selector := self advance asOctetString asSymbol. self primaryExpression ifFalse: [^ self expected: 'Argument']. self messagePart: 0 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 ! ! !ModifiedParser methodsFor: 'multi-character scans' stamp: 'sumim 7/18/2007 17:42'! xBinary super xBinary. (#(* /) includes: token) ifTrue: [tokenType := #multiplicative] ! ! 'Compiler evaluate: ''1 + 2 * 3'' "=> 9" ModifiedCompiler evaluate: ''1 + 2 * 3'' "=> 7" | results1 results2 index | results1 := OrderedCollection new. results2 := OrderedCollection new. ''searching...'' displayProgressAt: Display center from: (index := 0) to: (5 raisedTo: 8) during: [:bar | #(''+'' ''-'' ''*'' ''/'' '''') asDigitsToPower: 8 do: [:signs | | expression | bar value: (index := index + 1). expression := ''1{1}2{2}3{3}4{4}5{5}6{6}7{7}8{8}9'' format: signs. (ModifiedCompiler evaluate: expression) = 100 ifTrue: [results1 add: expression]. (Compiler evaluate: expression) = 100 ifTrue: [results2 add: expression]]]. ^{results1 inspect; size. results2 inspect; size}' openInWorkspaceWithTitle: 'doukaku2-2'!