'From Croquet1.0beta of 11 April 2006 [latest update: #1] on 6 August 2008 at 12:53:01 pm'! Compiler subclass: #CCompiler instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Tweak-Compiler'! Parser subclass: #CScanner instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Tweak-Compiler'! !CScanner commentStamp: '' prior: 0! I am a subclass of Scanner for tokenising for the Tweak compiler. Since I need to be subclassed by CParser, which also needs to subclass Parser, and since we don't have multiple inheritance I directly inherit from Parser, whose superclass is Scanner.! ]style[(251)i! CScanner subclass: #CParser instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Tweak-Compiler'! !ClassDescription methodsFor: 'compiling' stamp: 'eem 5/13/2008 09:48'! instVarNamesAndOffsetsDo: aBinaryBlock "This is part of the interface between the compiler and a class's instance or field names. The class should enumerate aBinaryBlock with the instance variable name strings and their integer offsets. The order is important. Names evaluated later will override the same names occurring earlier." | superInstSize | (superInstSize := superclass notNil ifTrue: [superclass instSize] ifFalse: [0]) > 0 ifTrue: [superclass instVarNamesAndOffsetsDo: aBinaryBlock]. 1 to: self instSize - superInstSize do: [:i| aBinaryBlock value: (instanceVariables at: i) value: i + superInstSize]! ! !CCompiler class methodsFor: 'accessing' stamp: 'eem 5/13/2008 11:38'! parserClass "Answer a parser class to use for parsing methods compiled by instances of the receiver." ^CParser! ! !CProtoObject class methodsFor: 'compiling' stamp: 'eem 5/12/2008 15:06'! fieldVariableNodes "Answer the variable nodes for our fields" ^self allFields collect:[:each| FieldNode new fieldDefinition: each].! ! !CProtoObject class methodsFor: 'compiling' stamp: 'eem 6/19/2008 09:08'! variablesAndOffsetsDo: aBinaryBlock "This is the interface between the compiler and a class's instance or field names. The class should enumerate aBinaryBlock with the field definitions (with nil offsets) followed by the instance variable name strings and their integer offsets (1-relative). The order is important; names evaluated later will override the same names occurring earlier." self allFieldsReverseDo: [:field| aBinaryBlock value: field value: nil]. self instVarNamesAndOffsetsDo: aBinaryBlock! ! !CProtoObject class methodsFor: 'class definition' stamp: 'eem 5/13/2008 09:55'! allFieldsReverseDo: aBlock "Evaluate aBlock with all field definitions, in superclass preceeding subclass order." superclass == nil ifFalse: [superclass allFieldsReverseDo: aBlock]. self classFields do: aBlock! ! !CParser methodsFor: 'expression types' stamp: 'eem 5/12/2008 13:50'! remoteAssignment | leftHandNode selector start | hereType == #leftArrow ifFalse:[^true]. parseNode isMessageNode ifFalse:[^true]. parseNode arguments size = 0 ifFalse:[^true]. leftHandNode := parseNode. selector := leftHandNode selector key, ':'. (Symbol hasInterned: selector ifTrue: [ :sym | selector := sym]) ifFalse:[ "Argh... how would we correct this???" selector := selector asSymbol. ]. self advance. self expression ifFalse:[^false]. start := (encoder sourceRangeFor: leftHandNode) first. parseNode := MessageNode new receiver: leftHandNode receiver selector: selector arguments: (Array with: parseNode) precedence: 3 from: encoder sourceRange: (start to: self endOfLastToken). ^true! ! !CParser methodsFor: 'expression types' stamp: 'eem 5/13/2008 14:39'! variable ^tokenType == #scopeRef ifTrue:[self scopeVariable] ifFalse: [super variable]! ! !CScanner class methodsFor: 'testing' stamp: 'eem 5/13/2008 15:59'! isLiteralSymbol: aSymbol "Test whether a symbol can be stored as # followed by its characters. Symbols created internally with asSymbol may not have this property, e.g. '3' asSymbol." | typeTable i ascii type | typeTable := superclass classPool at: #TypeTable. "yuck!!" i := aSymbol size. i = 0 ifTrue: [^ false]. i = 1 ifTrue: [('$''"()#0123456789' includes: (aSymbol at: 1)) ifTrue: [^ false] ifFalse: [^ true]]. ascii := (aSymbol at: 1) asciiValue. "TypeTable should have been origined at 0 rather than 1 ..." ascii = 0 ifTrue: [^ false]. type := typeTable at: ascii. (type == #xColon or: [type == #verticalBar]) ifTrue: [^ i = 1]. type == #xBinary ifTrue: [[i > 1] whileTrue: [ascii := (aSymbol at: i) asciiValue. ascii = 0 ifTrue: [^ false]. (typeTable at: ascii) == #xBinary ifFalse: [^ false]. i := i - 1]. ^ true]. type == #xLetter ifTrue: [[i > 1] whileTrue: [ascii := (aSymbol at: i) asciiValue. ascii = 0 ifTrue: [^ false]. type := typeTable at: ascii. (type == #xLetter or: [type == #xDigit or: [type == #xColon]]) ifFalse: [^ false]. i := i - 1]. ^ true]. ^ false! ! !FutureNode methodsFor: 'testing' stamp: 'eem 7/18/2008 16:22'! isFutureNode ^true! ! CScanner class removeSelector: #initialize! CScanner class removeSelector: #new! !CScanner class reorganize! ('testing' isLiteralSymbol:) ! CParser removeSelector: #addComment! CParser removeSelector: #addProperty:value:! CParser removeSelector: #advance! CParser removeSelector: #allocateLiteral:! CParser removeSelector: #argumentName! CParser removeSelector: #assignment:! CParser removeSelector: #bindArg:! CParser removeSelector: #bindTemp:! CParser removeSelector: #blockExpression! CParser removeSelector: #braceExpression! CParser removeSelector: #cascade! CParser removeSelector: #declareClassVar:! CParser removeSelector: #declareGlobal:! CParser removeSelector: #declareTempAndPaste:! CParser removeSelector: #encoder! CParser removeSelector: #endOfLastToken! CParser removeSelector: #expected:! CParser removeSelector: #externalFunctionDeclaration! CParser removeSelector: #externalType:! CParser removeSelector: #fail! CParser removeSelector: #hasProperty:! CParser removeSelector: #initPattern:notifying:return:! CParser removeSelector: #init:notifying:failBlock:! CParser removeSelector: #interactive! CParser removeSelector: #keylessMessagePartTest:repeat:! CParser removeSelector: #matchReturn! CParser removeSelector: #matchToken:! CParser removeSelector: #match:! CParser removeSelector: #matrixExpression:! CParser removeSelector: #messagePart:repeat:! CParser removeSelector: #newMethodNode! CParser removeSelector: #notify:! CParser removeSelector: #notify:at:! CParser removeSelector: #offEnd:! CParser removeSelector: #parseArgsAndTemps:notifying:! CParser removeSelector: #parseMethodComment:setPattern:! CParser removeSelector: #parseSelector:! CParser removeSelector: #parse:class:! CParser removeSelector: #parse:class:category:noPattern:context:notifying:ifFail:! CParser removeSelector: #parse:class:noPattern:context:notifying:ifFail:! CParser removeSelector: #positionalArgs! CParser removeSelector: #positionalArgsExpression! CParser removeSelector: #positionalMessagePart:repeat:! CParser removeSelector: #primaryExpression! CParser removeSelector: #primitive! CParser removeSelector: #primitiveDeclaration! CParser removeSelector: #primitiveDeclarations! CParser removeSelector: #properties! CParser removeSelector: #queryUndefined! CParser removeSelector: #removeUnusedTemps! CParser removeSelector: #sourceString! CParser removeSelector: #startOfNextToken! CParser removeSelector: #statements:innerBlock:! CParser removeSelector: #substituteSelector:wordIntervals:! CParser removeSelector: #substituteWord:wordInterval:offset:! CParser removeSelector: #temporaries! CParser removeSelector: #temporaryBlockVariables! !CParser reorganize! ('expression types' expression remoteAssignment scopeVariable variable) ('events' blockTrigger eventSignaler eventTrigger parseArgNames:) ('properties' correctProperty:interval: property) ('error correction' correctSelector:wordIntervals:exprInterval:ifAbort: correctVariable:interval:) ('public access' parseArgs:notifying:) ('error handling' addWarning:) ! CScanner removeSelector: #advance! CScanner removeSelector: #checkpoint! CScanner removeSelector: #initScanner! CScanner removeSelector: #nextLiteral! CScanner removeSelector: #notify:! CScanner removeSelector: #offEnd:! CScanner removeSelector: #revertToCheckpoint:! CScanner removeSelector: #scanFieldNames:! CScanner removeSelector: #scanLitVec! CScanner removeSelector: #scanLitWord! CScanner removeSelector: #scanMessageParts:! CScanner removeSelector: #scanStringStruct! CScanner removeSelector: #scanStringStruct:! CScanner removeSelector: #scanToken! CScanner removeSelector: #scan:! CScanner removeSelector: #step! CScanner removeSelector: #typeTableAt:! CScanner removeSelector: #xDelimiter! CScanner removeSelector: #xDigit! CScanner removeSelector: #xDollar! CScanner removeSelector: #xDoubleQuote! CScanner removeSelector: #xIllegal! CScanner removeSelector: #xLitQuote! CScanner removeSelector: #xSingleQuote! CScanner removeSelector: #xUnderscore! !CScanner reorganize! ('public access' scanTokens:) ('multi-character scans' xBinary xColon xLetter) ! CProtoObject class removeSelector: #decompilerClass! CProtoObject class removeSelector: #instanceVariableNodes! CProtoObject class removeSelector: #variableNodes! CProtoObject class removeSelector: #variableNodesAndOffsetsDo:! CCompiler class removeSelector: #evaluate:! CCompiler class removeSelector: #evaluate:for:logged:! CCompiler class removeSelector: #evaluate:for:notifying:logged:! CCompiler class removeSelector: #evaluate:logged:! CCompiler class removeSelector: #evaluate:notifying:logged:! CCompiler class removeSelector: #new! ClassDescription removeSelector: #variableNodesAndOffsetsDo:! ClassDescription removeSelector: #variablesAndOffsetsDo:! CCompiler removeSelector: #cacheDoItNode:! CCompiler removeSelector: #compileNoPattern:in:context:notifying:ifFail:! CCompiler removeSelector: #compile:in:classified:notifying:ifFail:! CCompiler removeSelector: #compile:in:notifying:ifFail:! CCompiler removeSelector: #evaluate:in:to:notifying:ifFail:logged:! CCompiler removeSelector: #format:in:notifying:contentsSymbol:! CCompiler removeSelector: #format:in:notifying:decorated:! CCompiler removeSelector: #format:noPattern:ifFail:! CCompiler removeSelector: #from:class:classified:context:notifying:! CCompiler removeSelector: #from:class:context:notifying:! CCompiler removeSelector: #interactive! CCompiler removeSelector: #notify:! CCompiler removeSelector: #notify:at:! CCompiler removeSelector: #parserClass! CCompiler removeSelector: #parserClass:! CCompiler removeSelector: #parse:in:notifying:! CCompiler removeSelector: #translate:noPattern:ifFail:! Smalltalk removeClassNamed: #CAssignmentNode! Smalltalk removeClassNamed: #CBlockNode! Smalltalk removeClassNamed: #CBraceNode! Smalltalk removeClassNamed: #CCascadeNode! Smalltalk removeClassNamed: #CCommentNode! Smalltalk removeClassNamed: #CDecompiler! Smalltalk removeClassNamed: #CDecompilerConstructor! Smalltalk removeClassNamed: #CEncoder! Smalltalk removeClassNamed: #CFieldNode! Smalltalk removeClassNamed: #CFutureNode! Smalltalk removeClassNamed: #CInstanceVariableNode! Smalltalk removeClassNamed: #CLeafNode! Smalltalk removeClassNamed: #CLiteralDictionary! Smalltalk removeClassNamed: #CLiteralNode! Smalltalk removeClassNamed: #CLiteralVariableNode! Smalltalk removeClassNamed: #CMessageAsTempNode! Smalltalk removeClassNamed: #CMessageNode! Smalltalk removeClassNamed: #CMethodNode! Smalltalk removeClassNamed: #CMethodTempsNode! Smalltalk removeClassNamed: #CParseNode! Smalltalk removeClassNamed: #CReturnNode! Smalltalk removeClassNamed: #CSelectorNode! Smalltalk removeClassNamed: #CTempVariableNode! Smalltalk removeClassNamed: #CUndeclaredVariableReference! Smalltalk removeClassNamed: #CVariableNode!