Balázs Kósi uploaded a new version of ShoutCore to project The Inbox:
http://source.squeak.org/inbox/ShoutCore.quasiquote-kb.41.mcz ==================== Summary ==================== Name: ShoutCore.quasiquote-kb.41 Author: kb Time: 5 February 2014, 3:15:36.334 pm UUID: c127a411-2d61-468d-b4cb-04410f5a2663 Ancestors: ShoutCore-cwp.40 Syntax highlighting for Eliot's quasiquote syntax extension. =============== Diff against ShoutCore-cwp.40 =============== Item was changed: ----- Method: SHParserST80>>parseLiteral: (in category 'parse') ----- parseLiteral: inArray currentTokenFirst == $$ ifTrue: [ | pos | self failWhen: self currentChar isNil. self rangeType: #'$'. pos := currentTokenSourcePosition + 1. self nextChar. ^self scanPast: #character start: pos end: pos]. currentTokenFirst isDigit ifTrue: [ "do not parse the number, can be time consuming" ^self scanPast: #number]. currentToken = '-' ifTrue: [ | c | c := self currentChar. (inArray and: [c isNil or: [c isDigit not]]) ifTrue: [ "single - can be a symbol in an Array" ^self scanPast: #symbol]. self scanPast: #-. self failWhen: currentToken isNil. "token isNil ifTrue: [self error: 'Unexpected End Of Input']." "do not parse the number, can be time consuming" ^self scanPast: #number]. + currentTokenFirst == $` ifTrue: [ ^self parseQuasiQuotedString ]. currentTokenFirst == $' ifTrue: [^self parseString]. currentTokenFirst == $# ifTrue: [^self parseSymbol]. (inArray and: [currentToken notNil]) ifTrue: [^self scanPast: #symbol]. self failWhen: currentTokenFirst == $. . self error ": 'argument missing'"! Item was added: + ----- Method: SHParserST80>>parseQuasiQuoteBlock (in category 'parse') ----- + parseQuasiQuoteBlock + self enterBlock. + self scanPast: #blockStart level: bracketDepth. + self parseStatementList. + self failUnless: currentTokenFirst == $]. + self rangeType: (self typePlusCycleFor: #blockEnd level: bracketDepth). + self leaveBlock! Item was added: + ----- Method: SHParserST80>>parseQuasiQuotedString (in category 'parse') ----- + parseQuasiQuotedString + + | first c last | + first := sourcePosition. + c := self currentChar. + [ + c ifNil: [ + self rangeType: #unfinishedString start: first - 1 end: source size. + self error ": 'unfinished string'"]. + c + caseOf: { + [ $[ ] -> [ + self scanPast: #string start: first - 1 end: sourcePosition. + self parseQuasiQuoteBlock. + first := sourcePosition + 1. + self currentChar == $` ]. + [ $$ ] -> [ + c := self nextChar. + false ] } + otherwise: [ c == $` ] ] whileFalse: [ c := self nextChar ]. + last := sourcePosition. + self nextChar. + self scanPast: #string start: first - 1 end: last.! Item was changed: ----- Method: SHParserST80>>scanPast:level: (in category 'scan') ----- scanPast: rangeType level: level - "first level adds no suffix to the rangeType. - Suffix from 1 to 7 added in cycles , ((level-2) mod(7) + 1)" - | cycle typePlusCycle | + ^self scanPast: (self typePlusCycleFor: rangeType level: level) - cycle := level <= 1 - ifTrue: [0] - ifFalse:[ ((level - 2) \\ 7) + 1]. - typePlusCycle := cycle = 0 - ifTrue:[rangeType] - ifFalse:[(rangeType, cycle asString) asSymbol]. - ^self scanPast: typePlusCycle ! Item was added: + ----- Method: SHParserST80>>typePlusCycleFor:level: (in category 'scan') ----- + typePlusCycleFor: rangeType level: level + "first level adds no suffix to the rangeType. + Suffix from 1 to 7 added in cycles , ((level-2) mod(7) + 1)" + | cycle | + + cycle := level <= 1 + ifTrue: [ 0 ] + ifFalse: [ ((level - 2) \\ 7) + 1 ]. + ^cycle = 0 + ifTrue: [ rangeType ] + ifFalse: [ (rangeType, cycle asString) asSymbol ]! |
Free forum by Nabble | Edit this page |