Hi All,
�� �the following won't parse because of support for positional messages (whatever they are; I'll come to that later).
�� � � �#(word()) should be equal to { #word. #() }
but because of the�type == #leftParenthesis clause in the below it causes a syntax error:
Scanner methods for multi-character scans
xLetter
"Form a word or keyword."
| type |
buffer reset.
[(type := self typeTableAt: hereChar) == #xLetter
or: [type == #xDigit
or: [type == #xUnderscore and:[self allowUnderscoreSelectors]]]] whileTrue:
["open code step for speed"
buffer nextPut: hereChar.
hereChar := aheadChar.
aheadChar := source atEnd
ifTrue: [30 asCharacter "doit"]
ifFalse: [source next]].
tokenType := (type == #colon or: [type == #xColon and: [aheadChar ~~ $=]])
ifTrue:�
[buffer nextPut: self step.
"Allow any number of embedded colons in literal symbols"
[(self typeTableAt: hereChar) == #xColon] whileTrue:
[buffer nextPut: self step].
#keyword]
ifFalse:�
[type == #leftParenthesis�
ifTrue:
[buffer nextPut: self step; nextPut: $).
#positionalMessage]
ifFalse:[#word]].
token := buffer contents
e.g. evaluate any of the following:
�� �#(word())
�� �Compiler evaluate: '#(word())'
�� �Scanner new scanTokens: '#(word())'
What is this support for? �Is it for those funky ffi calls in the OpenGL code? �Can it not be hoisted out of the scanner and into the parser proper? [and optimistically anyone have a fix already?]
best,
Eliot