diff --git a/src/Carp/CarpArrayNode.class.st b/src/Carp/CarpArrayNode.class.st new file mode 100644 index 0000000..7f75826 --- /dev/null +++ b/src/Carp/CarpArrayNode.class.st @@ -0,0 +1,40 @@ +Class { + #name : #CarpArrayNode, + #superclass : #CarpExpressionNode, + #instVars : [ + 'expressions' + ], + #category : #Carp +} + +{ #category : #generated } +CarpArrayNode >> acceptVisitor: anExpressionVisitor [ + + ^ anExpressionVisitor visitArray: self +] + +{ #category : #generated } +CarpArrayNode >> compositeNodeVariables [ + + ^ #( #expressions ) +] + +{ #category : #generated } +CarpArrayNode >> expressions [ + + ^ expressions +] + +{ #category : #generated } +CarpArrayNode >> expressions: anOrderedCollection [ + + self setParents: self expressions to: nil. + expressions := anOrderedCollection. + self setParents: self expressions to: self +] + +{ #category : #'generated-initialize-release' } +CarpArrayNode >> initialize [ + super initialize. + expressions := OrderedCollection new: 2. +] diff --git a/src/Carp/CarpCharacterNode.class.st b/src/Carp/CarpCharacterNode.class.st new file mode 100644 index 0000000..187064f --- /dev/null +++ b/src/Carp/CarpCharacterNode.class.st @@ -0,0 +1,32 @@ +Class { + #name : #CarpCharacterNode, + #superclass : #CarpExpressionNode, + #instVars : [ + 'value' + ], + #category : #Carp +} + +{ #category : #generated } +CarpCharacterNode >> acceptVisitor: anExpressionVisitor [ + + ^ anExpressionVisitor visitCharacter: self +] + +{ #category : #generated } +CarpCharacterNode >> tokenVariables [ + + ^ #( #value ) +] + +{ #category : #generated } +CarpCharacterNode >> value [ + + ^ value +] + +{ #category : #generated } +CarpCharacterNode >> value: aSmaCCToken [ + + value := aSmaCCToken +] diff --git a/src/Carp/CarpDerefNode.class.st b/src/Carp/CarpDerefNode.class.st new file mode 100644 index 0000000..804f832 --- /dev/null +++ b/src/Carp/CarpDerefNode.class.st @@ -0,0 +1,34 @@ +Class { + #name : #CarpDerefNode, + #superclass : #CarpExpressionNode, + #instVars : [ + 'value' + ], + #category : #Carp +} + +{ #category : #generated } +CarpDerefNode >> acceptVisitor: anExpressionVisitor [ + + ^ anExpressionVisitor visitDeref: self +] + +{ #category : #generated } +CarpDerefNode >> nodeVariables [ + + ^ #( #value ) +] + +{ #category : #generated } +CarpDerefNode >> value [ + + ^ value +] + +{ #category : #generated } +CarpDerefNode >> value: aCarpExpressionNode [ + + self value notNil ifTrue: [ self value parent: nil ]. + value := aCarpExpressionNode. + self value notNil ifTrue: [ self value parent: self ] +] diff --git a/src/Carp/CarpExpressionNode.class.st b/src/Carp/CarpExpressionNode.class.st new file mode 100644 index 0000000..6b69b42 --- /dev/null +++ b/src/Carp/CarpExpressionNode.class.st @@ -0,0 +1,11 @@ +Class { + #name : #CarpExpressionNode, + #superclass : #SmaCCParseNode, + #category : #'Carp-Carp' +} + +{ #category : #generated } +CarpExpressionNode >> acceptVisitor: anExpressionVisitor [ + + ^ anExpressionVisitor visitExpression: self +] diff --git a/src/Carp/CarpExpressionNodeVisitor.class.st b/src/Carp/CarpExpressionNodeVisitor.class.st new file mode 100644 index 0000000..b4c5ac3 --- /dev/null +++ b/src/Carp/CarpExpressionNodeVisitor.class.st @@ -0,0 +1,7 @@ +Class { + #name : #CarpExpressionNodeVisitor, + #superclass : #Object, + #traits : 'TCarpExpressionNodeVisitor', + #classTraits : 'TCarpExpressionNodeVisitor classTrait', + #category : #Carp +} diff --git a/src/Carp/CarpFile.class.st b/src/Carp/CarpFile.class.st new file mode 100644 index 0000000..8381f8b --- /dev/null +++ b/src/Carp/CarpFile.class.st @@ -0,0 +1,36 @@ +Class { + #name : #CarpFile, + #superclass : #Object, + #instVars : [ + 'fileName', + 'contents' + ], + #category : #Carp +} + +{ #category : #'instance creation' } +CarpFile class >> for: aFileName [ + ^ self new for: aFileName +] + +{ #category : #accessing } +CarpFile >> contents [ + + ^ contents +] + +{ #category : #accessing } +CarpFile >> contents: aString [ + contents := aString +] + +{ #category : #accessing } +CarpFile >> fileName: aFileName [ + fileName := aFileName +] + +{ #category : #accessing } +CarpFile >> for: aFileName [ + self fileName: aFileName. + self contents: (CarpParser parse: aFileName asFileReference contents). +] diff --git a/src/Carp/CarpListNode.class.st b/src/Carp/CarpListNode.class.st new file mode 100644 index 0000000..dd4f2b1 --- /dev/null +++ b/src/Carp/CarpListNode.class.st @@ -0,0 +1,40 @@ +Class { + #name : #CarpListNode, + #superclass : #CarpExpressionNode, + #instVars : [ + 'expressions' + ], + #category : #Carp +} + +{ #category : #generated } +CarpListNode >> acceptVisitor: anExpressionVisitor [ + + ^ anExpressionVisitor visitList: self +] + +{ #category : #generated } +CarpListNode >> compositeNodeVariables [ + + ^ #( #expressions ) +] + +{ #category : #generated } +CarpListNode >> expressions [ + + ^ expressions +] + +{ #category : #generated } +CarpListNode >> expressions: anOrderedCollection [ + + self setParents: self expressions to: nil. + expressions := anOrderedCollection. + self setParents: self expressions to: self +] + +{ #category : #'generated-initialize-release' } +CarpListNode >> initialize [ + super initialize. + expressions := OrderedCollection new: 2. +] diff --git a/src/Carp/CarpModuleOrTypeNode.class.st b/src/Carp/CarpModuleOrTypeNode.class.st new file mode 100644 index 0000000..73ac289 --- /dev/null +++ b/src/Carp/CarpModuleOrTypeNode.class.st @@ -0,0 +1,34 @@ +Class { + #name : #CarpModuleOrTypeNode, + #superclass : #CarpExpressionNode, + #instVars : [ + 'value' + ], + #category : #Carp +} + +{ #category : #generated } +CarpModuleOrTypeNode >> acceptVisitor: anExpressionVisitor [ + + ^ anExpressionVisitor visitModuleOrType: self +] + +{ #category : #generated } +CarpModuleOrTypeNode >> otherVariables [ + + ^ #( #value ) +] + +{ #category : #generated } +CarpModuleOrTypeNode >> value [ + + ^ value +] + +{ #category : #generated } +CarpModuleOrTypeNode >> value: anObject [ + + self setParent: self value to: nil. + value := anObject. + self setParent: self value to: self +] diff --git a/src/Carp/CarpNumberNode.class.st b/src/Carp/CarpNumberNode.class.st new file mode 100644 index 0000000..a4f05dd --- /dev/null +++ b/src/Carp/CarpNumberNode.class.st @@ -0,0 +1,32 @@ +Class { + #name : #CarpNumberNode, + #superclass : #CarpExpressionNode, + #instVars : [ + 'value' + ], + #category : #Carp +} + +{ #category : #generated } +CarpNumberNode >> acceptVisitor: anExpressionVisitor [ + + ^ anExpressionVisitor visitNumber: self +] + +{ #category : #generated } +CarpNumberNode >> tokenVariables [ + + ^ #( #value ) +] + +{ #category : #generated } +CarpNumberNode >> value [ + + ^ value +] + +{ #category : #generated } +CarpNumberNode >> value: aSmaCCToken [ + + value := aSmaCCToken +] diff --git a/src/Carp/CarpParser.class.st b/src/Carp/CarpParser.class.st index 1eea29b..c141dd1 100644 --- a/src/Carp/CarpParser.class.st +++ b/src/Carp/CarpParser.class.st @@ -6,18 +6,18 @@ Class { { #category : #'generated-accessing' } CarpParser class >> cacheId [ - ^'2020-10-05T22:57:25.346883+02:00' + ^'2022-03-20T19:54:13.067877+01:00' ] { #category : #generated } CarpParser class >> definitionComment [ "%glr; - - : [0-9a-fA-F] - ; +%root Expression; +%prefix Carp; +%suffix Node; - : \\ ([^\r\n] | (u {4,4}))+ + : \\ (. | u[0-9A-F]{4,4} | o[0-7]{3,3} | newline | return | space | tab | space | backspace | formfeed) # other character types ; : (\"" ([^\""\\] | )* \"") @@ -29,29 +29,23 @@ CarpParser class >> definitionComment [ : \) ; - : \' + : \' | \` ; - : | _ | \$ | \+ | \* | \/ | \? | ! | > | < | = | : + : | _ | \$ | \+ | \* | \/ | \? | ! | > | < | = | : | - ; default : * ; - : | + : | | ; : * ; - - : ( | ,)+ - ; : \. ; - - : a - ; : \[ ; @@ -73,71 +67,103 @@ default ; : | | + ; + + : \; [^\r\n]* + | \, # commas are treated as whitespace, but whitespace is not saved, so I made them comments instead + ; + + : \s+ + ; + + : \\ (. | u[0-9A-F]{4,4} | o[0-7]{3,3} | newline | return | space | tab | space | backspace | formfeed) # other character types ;Start - : Expression+ + : Expressions {{}} + ; +Expressions + : + | Expressions Expression 'expression' ; Expression : Literal + | Deref + | Ref + | Unquote + ; +Unquote + : (""%"" | ""%@"") Expression 'value' {{}} + ; +Ref + : ""&"" Expression 'value' {{}} + ; +Deref + : ""@"" Expression 'value' {{}} ; Literal - : String | List | Array | Symbol | Quote | Number + : String | List | Array | Symbol | Quote | Number | Character + ; +Character + : 'value' {{}} ; Number - : + : 'value' {{}} ; Array - : ListContents + : Expressions {{}} ; Quote - : Expression + : Expression 'value' {{}} ; Symbol : ModuleOrType | Variable ; Variable - : + : 'value' {{}} ; ModuleOrType - : Symbol - | + : Symbol 'value' {{}} + | 'value' {{}} ; List - : ListContents - ; -ListContents - : Expression ListContents - | Expression + : Expressions {{}} ; String - : + : 'value' {{}} ;" ] { #category : #generated } CarpParser class >> reduceTable [ ^#( - #(25 1 #reduceFor: 1310721 false ) - #(21 1 #reduceFor: 1111041 false ) - #(22 1 #reduceFor: 1137666 false ) - #(17 1 #reduceFor: 952321 false ) - #(13 1 #reduceFor: 837633 false ) - #(14 1 #reduceFor: 847873 false ) - #(15 1 #reduceFor: 863233 false ) - #(16 1 #reduceFor: 888838 false ) - #(16 1 #reduceFor: 888835 false ) - #(16 1 #reduceFor: 888837 false ) - #(16 1 #reduceFor: 888836 false ) - #(20 1 #reduceFor: 1073154 false ) - #(20 1 #reduceFor: 1073153 false ) - #(16 1 #reduceFor: 888834 false ) - #(16 1 #reduceFor: 888833 false ) - #(24 1 #reduceFor: 1244162 false ) - #(19 2 #reduceFor: 1041409 false ) - #(14 2 #reduceFor: 847874 false ) - #(23 3 #reduceFor: 1191937 false ) - #(22 3 #reduceFor: 1137665 false ) - #(18 3 #reduceFor: 984065 false ) - #(24 3 #reduceFor: 1244161 false ) + #(20 0 #reduceActionForExpressions1: 1258497 false) + #(19 1 #reduceActionForStart1: 1227777 false) + #(34 1 #reduceActionForString1: 1988609 false) + #(31 1 #reduceActionForVariable1: 1811457 false) + #(32 1 #reduceActionForModuleOrType2: 1851394 false) + #(27 1 #reduceActionForNumber1: 1620993 false) + #(26 1 #reduceActionForCharacter1: 1579009 false) + #(20 2 #reduceActionForExpressions2: 1258498 false) + #(21 1 #liftFirstValue: 1316868 false) + #(21 1 #liftFirstValue: 1316867 false) + #(21 1 #liftFirstValue: 1316866 false) + #(21 1 #liftFirstValue: 1316865 false) + #(25 1 #liftFirstValue: 1502215 false) + #(25 1 #liftFirstValue: 1502214 false) + #(25 1 #liftFirstValue: 1502211 false) + #(25 1 #liftFirstValue: 1502213 false) + #(25 1 #liftFirstValue: 1502212 false) + #(30 1 #liftFirstValue: 1773570 false) + #(30 1 #liftFirstValue: 1773569 false) + #(25 1 #liftFirstValue: 1502210 false) + #(25 1 #liftFirstValue: 1502209 false) + #(22 2 #reduceActionForUnquote1: 1370113 false) + #(22 2 #reduceActionForUnquote1: 1370114 false) + #(23 2 #reduceActionForRef1: 1422337 false) + #(24 2 #reduceActionForDeref1: 1461249 false) + #(29 2 #reduceActionForQuote1: 1728513 false) + #(33 3 #reduceActionForList1: 1932289 false) + #(32 3 #reduceActionForModuleOrType1: 1851393 false) + #(28 3 #reduceActionForArray1: 1667073 false) ). ] @@ -148,47 +174,212 @@ CarpParser class >> scannerClass [ { #category : #generated } CarpParser class >> startingStateForStart [ + ^ 1 ] { #category : #generated } CarpParser class >> symbolNames [ - ^ #('' '' '' '' '' '' '' '' '' '' '' 'B e g i n' 'Start' 'Expression+' 'Expression' 'Literal' 'Number' 'Array' 'Quote' 'Symbol' 'Variable' 'ModuleOrType' 'List' 'ListContents' 'String' 'E O F' 'error') + + ^ #( '"%"' '"%@"' '"&"' '"@"' '' '' + '' '' '' '' '' + '' '' '' + '' '' '' 'B e g i n' 'Start' + 'Expressions' 'Expression' 'Unquote' 'Ref' 'Deref' 'Literal' + 'Character' 'Number' 'Array' 'Quote' 'Symbol' 'Variable' + 'ModuleOrType' 'List' 'String' 'E O F' 'error' ) +] + +{ #category : #generated } +CarpParser class >> symbolTypes [ + + ^ #( #SmaCCToken #SmaCCToken #SmaCCToken #SmaCCToken #SmaCCToken + #SmaCCToken #SmaCCToken #SmaCCToken #SmaCCToken #SmaCCToken + #SmaCCToken #SmaCCToken #SmaCCToken #SmaCCToken #SmaCCToken + #SmaCCToken #SmaCCToken #CarpStartNode #CarpStartNode + #OrderedCollection #CarpExpressionNode #CarpUnquoteNode + #CarpRefNode #CarpDerefNode #CarpExpressionNode + #CarpCharacterNode #CarpNumberNode #CarpArrayNode #CarpQuoteNode + #CarpExpressionNode #CarpVariableNode #CarpModuleOrTypeNode + #CarpListNode #CarpStringNode #SmaCCToken #SmaCCErrorNode ) ] { #category : #generated } CarpParser class >> transitionTable [ ^#( -#[1 0 9 0 1 0 13 0 2 0 17 0 4 0 21 0 5 0 25 0 6 0 29 0 9 0 33 0 11 0 37 0 13 0 41 0 14 0 45 0 15 0 49 0 16 0 53 0 17 0 57 0 18 0 61 0 19 0 65 0 20 0 69 0 21 0 73 0 22 0 77 0 23 0 81 0 25] -#[0 0 6 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 9 0 10 0 11 0 26] -#[1 0 9 0 1 0 13 0 2 0 17 0 4 0 21 0 5 0 25 0 6 0 29 0 9 0 33 0 11 0 85 0 15 0 49 0 16 0 53 0 17 0 57 0 18 0 61 0 19 0 65 0 20 0 69 0 21 0 73 0 22 0 77 0 23 0 89 0 24 0 81 0 25] -#[1 0 9 0 1 0 13 0 2 0 17 0 4 0 21 0 5 0 25 0 6 0 29 0 9 0 33 0 11 0 93 0 15 0 49 0 16 0 53 0 17 0 57 0 18 0 61 0 19 0 65 0 20 0 69 0 21 0 73 0 22 0 77 0 23 0 81 0 25] -#[0 0 10 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 9 0 10 0 11 0 26] -#[1 0 14 0 1 0 14 0 2 0 14 0 3 0 14 0 4 0 14 0 5 0 14 0 6 0 14 0 7 0 97 0 8 0 14 0 9 0 14 0 10 0 14 0 11 0 14 0 26] -#[1 0 9 0 1 0 13 0 2 0 17 0 4 0 21 0 5 0 25 0 6 0 29 0 9 0 33 0 11 0 85 0 15 0 49 0 16 0 53 0 17 0 57 0 18 0 61 0 19 0 65 0 20 0 69 0 21 0 73 0 22 0 77 0 23 0 101 0 24 0 81 0 25] -#[0 0 18 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 9 0 10 0 11 0 26] -#[0 0 0 0 26] -#[1 0 9 0 1 0 13 0 2 0 17 0 4 0 21 0 5 0 25 0 6 0 29 0 9 0 33 0 11 0 105 0 15 0 49 0 16 0 53 0 17 0 57 0 18 0 61 0 19 0 65 0 20 0 69 0 21 0 73 0 22 0 77 0 23 0 81 0 25 0 22 0 26] -#[0 0 26 0 1 0 2 0 4 0 5 0 6 0 9 0 11 0 26] -#[0 0 30 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 9 0 10 0 11 0 26] -#[0 0 34 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 9 0 10 0 11 0 26] -#[0 0 38 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 9 0 10 0 11 0 26] -#[0 0 42 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 9 0 10 0 11 0 26] -#[0 0 46 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 9 0 10 0 11 0 26] -#[0 0 50 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 9 0 10 0 11 0 26] -#[0 0 54 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 9 0 10 0 11 0 26] -#[0 0 58 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 9 0 10 0 11 0 26] -#[0 0 62 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 9 0 10 0 11 0 26] -#[1 0 66 0 3 0 109 0 7 0 66 0 10] -#[0 0 113 0 3] -#[0 0 70 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 9 0 10 0 11 0 26] -#[1 0 21 0 5 0 25 0 6 0 117 0 20 0 69 0 21 0 73 0 22] -#[0 0 121 0 10] -#[0 0 74 0 1 0 2 0 4 0 5 0 6 0 9 0 11 0 26] -#[1 0 9 0 1 0 13 0 2 0 17 0 4 0 21 0 5 0 25 0 6 0 29 0 9 0 33 0 11 0 85 0 15 0 49 0 16 0 53 0 17 0 57 0 18 0 61 0 19 0 65 0 20 0 69 0 21 0 73 0 22 0 77 0 23 0 125 0 24 0 81 0 25] -#[0 0 78 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 9 0 10 0 11 0 26] -#[0 0 82 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 9 0 10 0 11 0 26] -#[0 0 86 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 9 0 10 0 11 0 26] -#[0 0 90 0 3 0 10] +#[1 0 6 0 1 0 6 0 2 0 6 0 3 0 6 0 4 0 6 0 5 0 6 0 6 0 6 0 8 0 6 0 9 0 6 0 10 0 6 0 12 0 6 0 14 0 6 0 17 0 9 0 19 0 13 0 20 0 6 0 35] +#[0 0 0 0 35] +#[1 0 17 0 1 0 21 0 2 0 25 0 3 0 29 0 4 0 33 0 5 0 37 0 6 0 41 0 8 0 45 0 9 0 49 0 10 0 53 0 12 0 57 0 14 0 61 0 17 0 65 0 21 0 65 0 22 0 65 0 23 0 65 0 24 0 65 0 25 0 65 0 26 0 65 0 27 0 65 0 28 0 65 0 29 0 65 0 30 0 65 0 31 0 65 0 32 0 65 0 33 0 65 0 34 0 10 0 35] +#[1 0 17 0 1 0 21 0 2 0 25 0 3 0 29 0 4 0 33 0 5 0 37 0 6 0 41 0 8 0 45 0 9 0 49 0 10 0 53 0 12 0 57 0 14 0 61 0 17 0 121 0 21 0 121 0 22 0 121 0 23 0 121 0 24 0 121 0 25 0 121 0 26 0 121 0 27 0 121 0 28 0 121 0 29 0 121 0 30 0 121 0 31 0 121 0 32 0 121 0 33 0 121 0 34] +#[1 0 17 0 1 0 21 0 2 0 25 0 3 0 29 0 4 0 33 0 5 0 37 0 6 0 41 0 8 0 45 0 9 0 49 0 10 0 53 0 12 0 57 0 14 0 61 0 17 0 125 0 21 0 125 0 22 0 125 0 23 0 125 0 24 0 125 0 25 0 125 0 26 0 125 0 27 0 125 0 28 0 125 0 29 0 125 0 30 0 125 0 31 0 125 0 32 0 125 0 33 0 125 0 34] +#[1 0 17 0 1 0 21 0 2 0 25 0 3 0 29 0 4 0 33 0 5 0 37 0 6 0 41 0 8 0 45 0 9 0 49 0 10 0 53 0 12 0 57 0 14 0 61 0 17 0 129 0 21 0 129 0 22 0 129 0 23 0 129 0 24 0 129 0 25 0 129 0 26 0 129 0 27 0 129 0 28 0 129 0 29 0 129 0 30 0 129 0 31 0 129 0 32 0 129 0 33 0 129 0 34] +#[1 0 17 0 1 0 21 0 2 0 25 0 3 0 29 0 4 0 33 0 5 0 37 0 6 0 41 0 8 0 45 0 9 0 49 0 10 0 53 0 12 0 57 0 14 0 61 0 17 0 133 0 21 0 133 0 22 0 133 0 23 0 133 0 24 0 133 0 25 0 133 0 26 0 133 0 27 0 133 0 28 0 133 0 29 0 133 0 30 0 133 0 31 0 133 0 32 0 133 0 33 0 133 0 34] +#[0 0 14 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 10 0 12 0 13 0 14 0 17 0 35] +#[1 0 6 0 1 0 6 0 2 0 6 0 3 0 6 0 4 0 6 0 5 0 6 0 6 0 6 0 7 0 6 0 8 0 6 0 9 0 6 0 10 0 6 0 12 0 6 0 14 0 6 0 17 0 137 0 20] +#[1 0 17 0 1 0 21 0 2 0 25 0 3 0 29 0 4 0 33 0 5 0 37 0 6 0 41 0 8 0 45 0 9 0 49 0 10 0 53 0 12 0 57 0 14 0 61 0 17 0 141 0 21 0 141 0 22 0 141 0 23 0 141 0 24 0 141 0 25 0 141 0 26 0 141 0 27 0 141 0 28 0 141 0 29 0 141 0 30 0 141 0 31 0 141 0 32 0 141 0 33 0 141 0 34] +#[0 0 18 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 10 0 12 0 13 0 14 0 17 0 35] +#[1 0 22 0 1 0 22 0 2 0 22 0 3 0 22 0 4 0 22 0 5 0 22 0 6 0 22 0 7 0 22 0 8 0 22 0 9 0 22 0 10 0 145 0 11 0 22 0 12 0 22 0 13 0 22 0 14 0 22 0 17 0 22 0 35] +#[1 0 6 0 1 0 6 0 2 0 6 0 3 0 6 0 4 0 6 0 5 0 6 0 6 0 6 0 8 0 6 0 9 0 6 0 10 0 6 0 12 0 6 0 13 0 6 0 14 0 6 0 17 0 149 0 20] +#[0 0 26 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 10 0 12 0 13 0 14 0 17 0 35] +#[0 0 30 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 10 0 12 0 13 0 14 0 17 0 35] +#[0 0 34 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 10 0 12 0 13 0 14 0 17 0 35] +#[0 0 38 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 10 0 12 0 13 0 14 0 17 0 35] +#[0 0 42 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 10 0 12 0 13 0 14 0 17 0 35] +#[0 0 46 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 10 0 12 0 13 0 14 0 17 0 35] +#[0 0 50 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 10 0 12 0 13 0 14 0 17 0 35] +#[0 0 54 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 10 0 12 0 13 0 14 0 17 0 35] +#[0 0 58 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 10 0 12 0 13 0 14 0 17 0 35] +#[0 0 62 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 10 0 12 0 13 0 14 0 17 0 35] +#[0 0 66 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 10 0 12 0 13 0 14 0 17 0 35] +#[0 0 70 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 10 0 12 0 13 0 14 0 17 0 35] +#[0 0 74 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 10 0 12 0 13 0 14 0 17 0 35] +#[0 0 78 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 10 0 12 0 13 0 14 0 17 0 35] +#[0 0 82 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 10 0 12 0 13 0 14 0 17 0 35] +#[0 0 86 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 10 0 12 0 13 0 14 0 17 0 35] +#[0 0 90 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 10 0 12 0 13 0 14 0 17 0 35] +#[0 0 94 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 10 0 12 0 13 0 14 0 17 0 35] +#[0 0 98 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 10 0 12 0 13 0 14 0 17 0 35] +#[0 0 102 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 10 0 12 0 13 0 14 0 17 0 35] +#[1 0 17 0 1 0 21 0 2 0 25 0 3 0 29 0 4 0 33 0 5 0 37 0 6 0 153 0 7 0 41 0 8 0 45 0 9 0 49 0 10 0 53 0 12 0 57 0 14 0 61 0 17 0 65 0 21 0 65 0 22 0 65 0 23 0 65 0 24 0 65 0 25 0 65 0 26 0 65 0 27 0 65 0 28 0 65 0 29 0 65 0 30 0 65 0 31 0 65 0 32 0 65 0 33 0 65 0 34] +#[0 0 106 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 10 0 12 0 13 0 14 0 17 0 35] +#[1 0 45 0 9 0 49 0 10 0 157 0 30 0 157 0 31 0 157 0 32] +#[1 0 17 0 1 0 21 0 2 0 25 0 3 0 29 0 4 0 33 0 5 0 37 0 6 0 41 0 8 0 45 0 9 0 49 0 10 0 53 0 12 0 161 0 13 0 57 0 14 0 61 0 17 0 65 0 21 0 65 0 22 0 65 0 23 0 65 0 24 0 65 0 25 0 65 0 26 0 65 0 27 0 65 0 28 0 65 0 29 0 65 0 30 0 65 0 31 0 65 0 32 0 65 0 33 0 65 0 34] +#[0 0 110 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 10 0 12 0 13 0 14 0 17 0 35] +#[0 0 114 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 10 0 12 0 13 0 14 0 17 0 35] +#[0 0 118 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 10 0 12 0 13 0 14 0 17 0 35] ). ] + +{ #category : #'generated-reduction actions' } +CarpParser >> reduceActionForArray1: nodes [ + + | result | + result := CarpArrayNode new. + result addNodes: (nodes at: 2) to: result expressions. + ^ result +] + +{ #category : #'generated-reduction actions' } +CarpParser >> reduceActionForCharacter1: nodes [ + + | result | + result := CarpCharacterNode new. + result value: (nodes at: 1). + ^ result +] + +{ #category : #'generated-reduction actions' } +CarpParser >> reduceActionForDeref1: nodes [ + + | result | + result := CarpDerefNode new. + result value: (nodes at: 2). + ^ result +] + +{ #category : #'generated-reduction actions' } +CarpParser >> reduceActionForExpressions1: nodes [ + + | result | + result := OrderedCollection new: 2. + ^ result +] + +{ #category : #'generated-reduction actions' } +CarpParser >> reduceActionForExpressions2: nodes [ + + | result | + result := nodes at: 1. + self add: (nodes at: 2) to: result. + ^ result +] + +{ #category : #'generated-reduction actions' } +CarpParser >> reduceActionForList1: nodes [ + + | result | + result := CarpListNode new. + result addNodes: (nodes at: 2) to: result expressions. + ^ result +] + +{ #category : #'generated-reduction actions' } +CarpParser >> reduceActionForModuleOrType1: nodes [ + + | result | + result := CarpModuleOrTypeNode new. + result value: (nodes at: 3). + ^ result +] + +{ #category : #'generated-reduction actions' } +CarpParser >> reduceActionForModuleOrType2: nodes [ + + | result | + result := CarpModuleOrTypeNode new. + result value: (nodes at: 1). + ^ result +] + +{ #category : #'generated-reduction actions' } +CarpParser >> reduceActionForNumber1: nodes [ + + | result | + result := CarpNumberNode new. + result value: (nodes at: 1). + ^ result +] + +{ #category : #'generated-reduction actions' } +CarpParser >> reduceActionForQuote1: nodes [ + + | result | + result := CarpQuoteNode new. + result value: (nodes at: 2). + ^ result +] + +{ #category : #'generated-reduction actions' } +CarpParser >> reduceActionForRef1: nodes [ + + | result | + result := CarpRefNode new. + result value: (nodes at: 2). + ^ result +] + +{ #category : #'generated-reduction actions' } +CarpParser >> reduceActionForStart1: nodes [ + + | result | + result := CarpStartNode new. + result addNodes: (nodes at: 1) to: result expressions. + ^ result +] + +{ #category : #'generated-reduction actions' } +CarpParser >> reduceActionForString1: nodes [ + + | result | + result := CarpStringNode new. + result value: (nodes at: 1). + ^ result +] + +{ #category : #'generated-reduction actions' } +CarpParser >> reduceActionForUnquote1: nodes [ + + | result | + result := CarpUnquoteNode new. + result value: (nodes at: 2). + ^ result +] + +{ #category : #'generated-reduction actions' } +CarpParser >> reduceActionForVariable1: nodes [ + + | result | + result := CarpVariableNode new. + result value: (nodes at: 1). + ^ result +] diff --git a/src/Carp/CarpQuoteNode.class.st b/src/Carp/CarpQuoteNode.class.st new file mode 100644 index 0000000..9bec96f --- /dev/null +++ b/src/Carp/CarpQuoteNode.class.st @@ -0,0 +1,34 @@ +Class { + #name : #CarpQuoteNode, + #superclass : #CarpExpressionNode, + #instVars : [ + 'value' + ], + #category : #Carp +} + +{ #category : #generated } +CarpQuoteNode >> acceptVisitor: anExpressionVisitor [ + + ^ anExpressionVisitor visitQuote: self +] + +{ #category : #generated } +CarpQuoteNode >> nodeVariables [ + + ^ #( #value ) +] + +{ #category : #generated } +CarpQuoteNode >> value [ + + ^ value +] + +{ #category : #generated } +CarpQuoteNode >> value: aCarpExpressionNode [ + + self value notNil ifTrue: [ self value parent: nil ]. + value := aCarpExpressionNode. + self value notNil ifTrue: [ self value parent: self ] +] diff --git a/src/Carp/CarpRefNode.class.st b/src/Carp/CarpRefNode.class.st new file mode 100644 index 0000000..8c43210 --- /dev/null +++ b/src/Carp/CarpRefNode.class.st @@ -0,0 +1,34 @@ +Class { + #name : #CarpRefNode, + #superclass : #CarpExpressionNode, + #instVars : [ + 'value' + ], + #category : #Carp +} + +{ #category : #generated } +CarpRefNode >> acceptVisitor: anExpressionVisitor [ + + ^ anExpressionVisitor visitRef: self +] + +{ #category : #generated } +CarpRefNode >> nodeVariables [ + + ^ #( #value ) +] + +{ #category : #generated } +CarpRefNode >> value [ + + ^ value +] + +{ #category : #generated } +CarpRefNode >> value: aCarpExpressionNode [ + + self value notNil ifTrue: [ self value parent: nil ]. + value := aCarpExpressionNode. + self value notNil ifTrue: [ self value parent: self ] +] diff --git a/src/Carp/CarpScanner.class.st b/src/Carp/CarpScanner.class.st index debfeeb..6367492 100644 --- a/src/Carp/CarpScanner.class.st +++ b/src/Carp/CarpScanner.class.st @@ -6,172 +6,285 @@ Class { { #category : #generated } CarpScanner >> emptySymbolTokenId [ - ^ 26 + + ^ 35 ] { #category : #generated } CarpScanner >> errorTokenId [ - ^ 27 + + ^ 36 ] { #category : #generated } CarpScanner >> scan1 [ - [ self step. - currentCharacter == $" - ifTrue: [ ^ self recordAndReportMatch: #(1) ]. - currentCharacter == $\ - ifTrue: [ self step. - (currentCharacter <= Character tab - or: [ (currentCharacter between: Character pageUp and: Character newPage) - or: [ currentCharacter >= (Character value: 14) ] ]) - ifTrue: [ ^ self scan2 ]. - ^ self reportLastMatch ]. + + [ + self step. + currentCharacter == $" ifTrue: [ ^ self recordAndReportMatch: #( 5 ) ]. + currentCharacter == $\ ifTrue: [ + self step. + ^ self scan1 ]. true ] whileTrue ] { #category : #generated } CarpScanner >> scan2 [ - [ self step. - currentCharacter == $" - ifTrue: [ [ self recordMatch: #(1). - self step. - currentCharacter == $" ] whileTrue. - (currentCharacter == Character lf - or: [ currentCharacter == Character cr ]) - ifTrue: [ ^ self scan1 ]. - ^ self scan2 ]. - (currentCharacter == Character lf - or: [ currentCharacter == Character cr ]) - ifTrue: [ ^ self scan1 ]. - true ] whileTrue + + self step. + currentCharacter isDigit ifTrue: [ + [ + self recordMatch: #( 14 ). + self step. + currentCharacter == $f ifTrue: [ + ^ self recordAndReportMatch: #( 14 ) ]. + currentCharacter isDigit ] whileTrue ]. + ^ self reportLastMatch ] { #category : #generated } CarpScanner >> scan3 [ + + [ + self recordMatch: #( 14 ). self step. - currentCharacter isDigit - ifTrue: [ [ self recordMatch: #(11). - self step. - currentCharacter == $f - ifTrue: [ ^ self recordAndReportMatch: #(11) ]. - currentCharacter isDigit ] whileTrue ]. + currentCharacter == $. ifTrue: [ ^ self scan2 ]. + currentCharacter isDigit ] whileTrue. + ('bfl' includes: currentCharacter) ifTrue: [ + ^ self recordAndReportMatch: #( 14 ) ]. ^ self reportLastMatch ] { #category : #generated } CarpScanner >> scan4 [ - [ self recordMatch: #(11). + + (self scanForString: 'ac') ifTrue: [ ^ self scan5 ]. + ^ self reportLastMatch +] + +{ #category : #generated } +CarpScanner >> scan5 [ + self step. - currentCharacter == $. - ifTrue: [ ^ self scan3 ]. - currentCharacter isDigit ] whileTrue. - ('bfl' includes: currentCharacter) - ifTrue: [ ^ self recordAndReportMatch: #(11) ]. + currentCharacter == $e ifTrue: [ + ^ self recordAndReportMatch: #( 17 ) ]. ^ self reportLastMatch ] { #category : #generated } CarpScanner >> scanForToken [ + self step. - currentCharacter == $" - ifTrue: [ ^ self scan1 ]. - currentCharacter == $' - ifTrue: [ ^ self recordAndReportMatch: #(4) ]. - currentCharacter == $( - ifTrue: [ ^ self recordAndReportMatch: #(2) ]. - currentCharacter == $) - ifTrue: [ ^ self recordAndReportMatch: #(3) ]. - currentCharacter == $. - ifTrue: [ ^ self recordAndReportMatch: #(8) ]. - ^ self scanForTokenX5 + currentCharacter == $" ifTrue: [ ^ self scan1 ]. + currentCharacter == $% ifTrue: [ ^ self scanForTokenX7 ]. + currentCharacter == $& ifTrue: [ ^ self recordAndReportMatch: #( 3 ) ]. + currentCharacter == $( ifTrue: [ ^ self recordAndReportMatch: #( 6 ) ]. + currentCharacter == $) ifTrue: [ ^ self recordAndReportMatch: #( 7 ) ]. + currentCharacter == $, ifTrue: [ + ^ self recordAndReportMatch: #( 15 ) ]. + currentCharacter == $. ifTrue: [ + ^ self recordAndReportMatch: #( 11 ) ]. + currentCharacter == $0 ifTrue: [ ^ self scanForTokenX2 ]. + currentCharacter == $; ifTrue: [ ^ self scanForTokenX5 ]. + currentCharacter == $@ ifTrue: [ ^ self recordAndReportMatch: #( 4 ) ]. + currentCharacter == $[ ifTrue: [ + ^ self recordAndReportMatch: #( 12 ) ]. + ^ self scanForTokenX8 ] { #category : #generated } CarpScanner >> scanForTokenX1 [ - self recordMatch: #(11). + self step. - currentCharacter == $. - ifTrue: [ ^ self scan3 ]. - currentCharacter == $b - ifTrue: [ self recordMatch: #(11). + currentCharacter == $b ifTrue: [ + self recordMatch: #( 17 ). + self step. + currentCharacter == $a ifTrue: [ + (self scanForString: 'cksp') ifTrue: [ ^ self scan4 ] ]. + ^ self reportLastMatch ]. + currentCharacter == $f ifTrue: [ + self recordMatch: #( 17 ). + self step. + currentCharacter == $o ifTrue: [ + (self scanForString: 'rmfeed') ifTrue: [ + ^ self recordAndReportMatch: #( 17 ) ] ]. + ^ self reportLastMatch ]. + currentCharacter == $n ifTrue: [ + self recordMatch: #( 17 ). + self step. + currentCharacter == $e ifTrue: [ + (self scanForString: 'wlin') ifTrue: [ ^ self scan5 ] ]. + ^ self reportLastMatch ]. + currentCharacter == $o ifTrue: [ + self recordMatch: #( 17 ). + self step. + (currentCharacter between: $0 and: $7) ifTrue: [ self step. - (currentCharacter between: $0 and: $1) - ifTrue: [ ^ self recordAndReportMatch: #(11) ]. - ^ self reportLastMatch ]. - currentCharacter == $x - ifTrue: [ self step. - (currentCharacter isDigit - or: [ (currentCharacter between: $A and: $F) - or: [ currentCharacter between: $a and: $f ] ]) - ifTrue: [ ^ self recordAndReportMatch: #(11) ]. - ^ self reportLastMatch ]. - currentCharacter isDigit - ifTrue: [ ^ self scan4 ]. - ('fl' includes: currentCharacter) - ifTrue: [ ^ self recordAndReportMatch: #(11) ]. + (currentCharacter between: $0 and: $7) ifTrue: [ + self step. + (currentCharacter between: $0 and: $7) ifTrue: [ + ^ self recordAndReportMatch: #( 17 ) ] ] ]. + ^ self reportLastMatch ]. + currentCharacter == $r ifTrue: [ + self recordMatch: #( 17 ). + self step. + currentCharacter == $e ifTrue: [ + (self scanForString: 'turn') ifTrue: [ + ^ self recordAndReportMatch: #( 17 ) ] ]. + ^ self reportLastMatch ]. + currentCharacter == $s ifTrue: [ + self recordMatch: #( 17 ). + self step. + currentCharacter == $p ifTrue: [ ^ self scan4 ]. + ^ self reportLastMatch ]. + currentCharacter == $t ifTrue: [ + self recordMatch: #( 17 ). + self step. + currentCharacter == $a ifTrue: [ + self step. + currentCharacter == $b ifTrue: [ + ^ self recordAndReportMatch: #( 17 ) ] ]. + ^ self reportLastMatch ]. + currentCharacter == $u ifTrue: [ ^ self scanForTokenX1X1 ]. + ^ self recordAndReportMatch: #( 17 ) +] + +{ #category : #generated } +CarpScanner >> scanForTokenX1X1 [ + + self recordMatch: #( 17 ). + self step. + (currentCharacter isDigit or: [ currentCharacter between: $A and: $F ]) + ifTrue: [ + self step. + (currentCharacter isDigit or: [ + currentCharacter between: $A and: $F ]) ifTrue: [ + self step. + (currentCharacter isDigit or: [ + currentCharacter between: $A and: $F ]) ifTrue: [ + self step. + (currentCharacter isDigit or: [ + currentCharacter between: $A and: $F ]) ifTrue: [ + ^ self recordAndReportMatch: #( 17 ) ] ] ] ]. ^ self reportLastMatch ] { #category : #generated } CarpScanner >> scanForTokenX2 [ - [ self recordMatch: #(6). + + self recordMatch: #( 14 ). self step. - currentCharacter isLowercase - or: [ currentCharacter isDigit - or: [ ('!$' includes: currentCharacter) - or: [ (currentCharacter between: $* and: $+) - or: [ ('/:' includes: currentCharacter) - or: [ (currentCharacter between: $< and: $?) - or: [ currentCharacter == $_ ] ] ] ] ] ] ] whileTrue. + currentCharacter == $. ifTrue: [ ^ self scan2 ]. + currentCharacter == $b ifTrue: [ + self recordMatch: #( 14 ). + self step. + (currentCharacter between: $0 and: $1) ifTrue: [ + ^ self recordAndReportMatch: #( 14 ) ]. + ^ self reportLastMatch ]. + currentCharacter == $x ifTrue: [ + self step. + (currentCharacter isDigit or: [ + (currentCharacter between: $A and: $F) or: [ + currentCharacter between: $a and: $f ] ]) ifTrue: [ + ^ self recordAndReportMatch: #( 14 ) ]. + ^ self reportLastMatch ]. + currentCharacter isDigit ifTrue: [ ^ self scan3 ]. + ('fl' includes: currentCharacter) ifTrue: [ + ^ self recordAndReportMatch: #( 14 ) ]. ^ self reportLastMatch ] { #category : #generated } CarpScanner >> scanForTokenX3 [ - [ self recordMatch: #(5). + + [ + self recordMatch: #( 10 ). self step. - currentCharacter isLowercase - or: [ currentCharacter isDigit - or: [ ('!$' includes: currentCharacter) - or: [ (currentCharacter between: $* and: $+) - or: [ ('/:' includes: currentCharacter) - or: [ (currentCharacter between: $< and: $?) - or: [ currentCharacter == $_ ] ] ] ] ] ] ] whileTrue + currentCharacter isLowercase or: [ + currentCharacter isUppercase or: [ + currentCharacter isDigit or: [ + ('!$' includes: currentCharacter) or: [ + (currentCharacter between: $* and: $+) or: [ + ('-/:' includes: currentCharacter) or: [ + (currentCharacter between: $< and: $?) or: [ + currentCharacter == $_ ] ] ] ] ] ] ] ] whileTrue. + ^ self reportLastMatch ] { #category : #generated } CarpScanner >> scanForTokenX4 [ - [ self recordMatch: #(7). + + [ + self recordMatch: #( 9 ). self step. - currentCharacter isSpaceSeparator or: [ currentCharacter == $, ] ] - whileTrue. - ^ self reportLastMatch + currentCharacter isLowercase or: [ + currentCharacter isUppercase or: [ + currentCharacter isDigit or: [ + ('!$' includes: currentCharacter) or: [ + (currentCharacter between: $* and: $+) or: [ + ('-/:' includes: currentCharacter) or: [ + (currentCharacter between: $< and: $?) or: [ + currentCharacter == $_ ] ] ] ] ] ] ] ] whileTrue ] { #category : #generated } CarpScanner >> scanForTokenX5 [ - currentCharacter == $0 - ifTrue: - [ ^ self scanForTokenX1 ]. - currentCharacter == $[ - ifTrue: [ ^ self recordAndReportMatch: #(9) ]. - currentCharacter == $] - ifTrue: [ ^ self recordAndReportMatch: #(10) ]. - currentCharacter isDigit - ifTrue: [ ^ self scan4 ]. - (currentCharacter isSpaceSeparator or: [ currentCharacter == $, ]) - ifTrue: - [ ^ self scanForTokenX4 ]. - currentCharacter isUppercase - ifTrue: - [ ^ self scanForTokenX2 ]. - (currentCharacter isLowercase - or: [ ('!$' includes: currentCharacter) - or: [ (currentCharacter between: $* and: $+) - or: [ ('/:' includes: currentCharacter) - or: [ (currentCharacter between: $< and: $?) - or: [ currentCharacter == $_ ] ] ] ] ]) - ifTrue: - [ self scanForTokenX3 ]. + + [ + self recordMatch: #( 15 ). + self step. + currentCharacter <= Character tab or: [ + (currentCharacter between: Character pageUp and: Character newPage) + or: [ currentCharacter >= (Character value: 14) ] ] ] whileTrue. ^ self reportLastMatch ] + +{ #category : #generated } +CarpScanner >> scanForTokenX6 [ + + [ + self recordMatch: #( 16 ). + self step. + currentCharacter isSeparator or: [ + currentCharacter == Character pageUp ] ] whileTrue. + ^ self reportLastMatch +] + +{ #category : #generated } +CarpScanner >> scanForTokenX7 [ + + self recordMatch: #( 1 ). + self step. + currentCharacter == $@ ifTrue: [ ^ self recordAndReportMatch: #( 2 ) ]. + ^ self reportLastMatch +] + +{ #category : #generated } +CarpScanner >> scanForTokenX8 [ + + currentCharacter == $\ ifTrue: [ ^ self scanForTokenX1 ]. + currentCharacter == $] ifTrue: [ + ^ self recordAndReportMatch: #( 13 ) ]. + currentCharacter isDigit ifTrue: [ ^ self scan3 ]. + ('''`' includes: currentCharacter) ifTrue: [ + ^ self recordAndReportMatch: #( 8 ) ]. + (currentCharacter isSeparator or: [ + currentCharacter == Character pageUp ]) ifTrue: [ + ^ self scanForTokenX6 ]. + currentCharacter isUppercase ifTrue: [ ^ self scanForTokenX3 ]. + (currentCharacter isLowercase or: [ + ('!$' includes: currentCharacter) or: [ + (currentCharacter between: $* and: $+) or: [ + ('-/:' includes: currentCharacter) or: [ + (currentCharacter between: $< and: $?) or: [ + currentCharacter == $_ ] ] ] ] ]) ifTrue: [ + self scanForTokenX4 ]. + ^ self reportLastMatch +] + +{ #category : #generated } +CarpScanner >> tokenActions [ + + ^ #( nil nil nil nil nil nil nil nil nil nil nil nil nil nil #comment + #whitespace ) +] diff --git a/src/Carp/CarpStartNode.class.st b/src/Carp/CarpStartNode.class.st new file mode 100644 index 0000000..fd60cdd --- /dev/null +++ b/src/Carp/CarpStartNode.class.st @@ -0,0 +1,40 @@ +Class { + #name : #CarpStartNode, + #superclass : #CarpExpressionNode, + #instVars : [ + 'expressions' + ], + #category : #Carp +} + +{ #category : #generated } +CarpStartNode >> acceptVisitor: anExpressionVisitor [ + + ^ anExpressionVisitor visitStart: self +] + +{ #category : #generated } +CarpStartNode >> compositeNodeVariables [ + + ^ #( #expressions ) +] + +{ #category : #generated } +CarpStartNode >> expressions [ + + ^ expressions +] + +{ #category : #generated } +CarpStartNode >> expressions: anOrderedCollection [ + + self setParents: self expressions to: nil. + expressions := anOrderedCollection. + self setParents: self expressions to: self +] + +{ #category : #'generated-initialize-release' } +CarpStartNode >> initialize [ + super initialize. + expressions := OrderedCollection new: 2. +] diff --git a/src/Carp/CarpStringNode.class.st b/src/Carp/CarpStringNode.class.st new file mode 100644 index 0000000..fe2f768 --- /dev/null +++ b/src/Carp/CarpStringNode.class.st @@ -0,0 +1,32 @@ +Class { + #name : #CarpStringNode, + #superclass : #CarpExpressionNode, + #instVars : [ + 'value' + ], + #category : #Carp +} + +{ #category : #generated } +CarpStringNode >> acceptVisitor: anExpressionVisitor [ + + ^ anExpressionVisitor visitString: self +] + +{ #category : #generated } +CarpStringNode >> tokenVariables [ + + ^ #( #value ) +] + +{ #category : #generated } +CarpStringNode >> value [ + + ^ value +] + +{ #category : #generated } +CarpStringNode >> value: aSmaCCToken [ + + value := aSmaCCToken +] diff --git a/src/Carp/CarpUnquoteNode.class.st b/src/Carp/CarpUnquoteNode.class.st new file mode 100644 index 0000000..50e0f8c --- /dev/null +++ b/src/Carp/CarpUnquoteNode.class.st @@ -0,0 +1,34 @@ +Class { + #name : #CarpUnquoteNode, + #superclass : #CarpExpressionNode, + #instVars : [ + 'value' + ], + #category : #Carp +} + +{ #category : #generated } +CarpUnquoteNode >> acceptVisitor: anExpressionVisitor [ + + ^ anExpressionVisitor visitUnquote: self +] + +{ #category : #generated } +CarpUnquoteNode >> nodeVariables [ + + ^ #( #value ) +] + +{ #category : #generated } +CarpUnquoteNode >> value [ + + ^ value +] + +{ #category : #generated } +CarpUnquoteNode >> value: aCarpExpressionNode [ + + self value notNil ifTrue: [ self value parent: nil ]. + value := aCarpExpressionNode. + self value notNil ifTrue: [ self value parent: self ] +] diff --git a/src/Carp/CarpVariableNode.class.st b/src/Carp/CarpVariableNode.class.st new file mode 100644 index 0000000..fdfdd3a --- /dev/null +++ b/src/Carp/CarpVariableNode.class.st @@ -0,0 +1,32 @@ +Class { + #name : #CarpVariableNode, + #superclass : #CarpExpressionNode, + #instVars : [ + 'value' + ], + #category : #Carp +} + +{ #category : #generated } +CarpVariableNode >> acceptVisitor: anExpressionVisitor [ + + ^ anExpressionVisitor visitVariable: self +] + +{ #category : #generated } +CarpVariableNode >> tokenVariables [ + + ^ #( #value ) +] + +{ #category : #generated } +CarpVariableNode >> value [ + + ^ value +] + +{ #category : #generated } +CarpVariableNode >> value: aSmaCCToken [ + + value := aSmaCCToken +] diff --git a/src/Carp/TCarpExpressionNodeVisitor.trait.st b/src/Carp/TCarpExpressionNodeVisitor.trait.st new file mode 100644 index 0000000..5db9030 --- /dev/null +++ b/src/Carp/TCarpExpressionNodeVisitor.trait.st @@ -0,0 +1,84 @@ +Trait { + #name : #TCarpExpressionNodeVisitor, + #traits : 'TSmaCCParseNodeVisitor', + #classTraits : 'TSmaCCParseNodeVisitor classTrait', + #category : #Carp +} + +{ #category : #generated } +TCarpExpressionNodeVisitor >> visitArray: anArray [ + + ^ self visitExpression: anArray +] + +{ #category : #generated } +TCarpExpressionNodeVisitor >> visitCharacter: aCharacter [ + + ^ self visitExpression: aCharacter +] + +{ #category : #generated } +TCarpExpressionNodeVisitor >> visitDeref: aDeref [ + + ^ self visitExpression: aDeref +] + +{ #category : #generated } +TCarpExpressionNodeVisitor >> visitExpression: anExpression [ + + ^ self visitSmaCCParseNode: anExpression +] + +{ #category : #generated } +TCarpExpressionNodeVisitor >> visitList: aList [ + + ^ self visitExpression: aList +] + +{ #category : #generated } +TCarpExpressionNodeVisitor >> visitModuleOrType: aModuleOrType [ + + ^ self visitExpression: aModuleOrType +] + +{ #category : #generated } +TCarpExpressionNodeVisitor >> visitNumber: aNumber [ + + ^ self visitExpression: aNumber +] + +{ #category : #generated } +TCarpExpressionNodeVisitor >> visitQuote: aQuote [ + + ^ self visitExpression: aQuote +] + +{ #category : #generated } +TCarpExpressionNodeVisitor >> visitRef: aRef [ + + ^ self visitExpression: aRef +] + +{ #category : #generated } +TCarpExpressionNodeVisitor >> visitStart: aStart [ + + ^ self visitExpression: aStart +] + +{ #category : #generated } +TCarpExpressionNodeVisitor >> visitString: aString [ + + ^ self visitExpression: aString +] + +{ #category : #generated } +TCarpExpressionNodeVisitor >> visitUnquote: anUnquote [ + + ^ self visitExpression: anUnquote +] + +{ #category : #generated } +TCarpExpressionNodeVisitor >> visitVariable: aVariable [ + + ^ self visitExpression: aVariable +]