15 "When tokenizing, do not use guards" |
15 "When tokenizing, do not use guards" |
16 ^ false |
16 ^ false |
17 ! |
17 ! |
18 |
18 |
19 tokenGenerator |
19 tokenGenerator |
20 ^ tokenGenerator isNil |
20 tokenGenerator isNil ifTrue: [ |
21 ifTrue: [ tokenGenerator := (PPCTokenCodeGenerator on: compiler) |
21 tokenGenerator := PPCTokenCodeGenerator on: compiler. |
22 arguments: arguments; |
22 tokenGenerator arguments: arguments. |
23 yourself ] |
23 ]. |
24 ifFalse: [ tokenGenerator ] |
24 ^ tokenGenerator |
25 ! |
25 ! |
26 |
26 |
27 tokenGenerator: whatever |
27 tokenGenerator: whatever |
28 tokenGenerator := whatever |
28 tokenGenerator := whatever |
29 ! |
29 ! |
48 compiler addOnLine: ' ifTrue: ['. |
48 compiler addOnLine: ' ifTrue: ['. |
49 compiler indent. |
49 compiler indent. |
50 trueBlock value. |
50 trueBlock value. |
51 compiler dedent. |
51 compiler dedent. |
52 falseBlock isNil ifTrue: [ compiler addOnLine: '].' ] |
52 falseBlock isNil ifTrue: [ compiler addOnLine: '].' ] |
53 ifFalse: [ compiler add: ']'. ] |
53 ifFalse: [ compiler add: ']'. ] |
54 ]. |
54 ]. |
55 falseBlock isNil ifFalse: [ |
55 falseBlock isNil ifFalse: [ |
56 compiler addOnLine: ' ifFalse: ['. |
56 compiler addOnLine: ' ifFalse: ['. |
57 compiler indent. |
57 compiler indent. |
58 falseBlock value. |
58 falseBlock value. |
71 currentTokenVar := compiler allocateTemporaryVariableNamed: 'currentToken'. |
71 currentTokenVar := compiler allocateTemporaryVariableNamed: 'currentToken'. |
72 |
72 |
73 compiler smartRemember: node child to: mementoVar. |
73 compiler smartRemember: node child to: mementoVar. |
74 compiler codeAssign: '{ currentTokenValue . currentTokenType }.' to: currentTokenVar. |
74 compiler codeAssign: '{ currentTokenValue . currentTokenType }.' to: currentTokenVar. |
75 |
75 |
76 compiler codeStoreValueOf: [ self visit: node child ] intoVariable: self retvalVar. |
76 compiler |
|
77 codeAssignParsedValueOf:[ self visit:node child ] |
|
78 to:self retvalVar. |
77 |
79 |
78 compiler smartRestore: node child from: mementoVar. |
80 compiler smartRestore: node child from: mementoVar. |
79 compiler codeAssign: '(', currentTokenVar, ' at: 1).' to: 'currentTokenValue'. |
81 compiler codeAssign: '(', currentTokenVar, ' at: 1).' to: 'currentTokenValue'. |
80 compiler codeAssign: '(', currentTokenVar, ' at: 2).' to: 'currentTokenType'. |
82 compiler codeAssign: '(', currentTokenVar, ' at: 2).' to: 'currentTokenType'. |
81 |
83 |
90 node children do: [ :child | |
92 node children do: [ :child | |
91 | tokenMethodName | |
93 | tokenMethodName | |
92 |
94 |
93 child acceptsEpsilon ifTrue: [ |
95 child acceptsEpsilon ifTrue: [ |
94 possibleError := false. |
96 possibleError := false. |
95 compiler codeStoreValueOf: [ self visit: child ] intoVariable: self retvalVar. |
97 compiler codeAssignParsedValueOf:[ self visit:child ] to:self retvalVar. |
96 compiler codeReturn |
98 compiler codeReturn |
97 ] ifFalse: [ |
99 ] ifFalse: [ |
98 child firstSetWithTokens do: [ :first | |
100 child firstSetWithTokens do: [ :first | |
99 "For each child, for each first compile this:" |
101 "For each child, for each first compile this:" |
100 |
102 |
101 tokenMethodName := compiler idFor: first. |
103 tokenMethodName := compiler idFor: first. |
102 compiler add: '(self ', tokenMethodName asString, ')'. |
104 compiler add: '(self ', tokenMethodName asString, ')'. |
103 compiler addOnLine: ' ifTrue: ['. |
105 compiler addOnLine: ' ifTrue: ['. |
104 compiler indent. |
106 compiler indent. |
105 compiler codeStoreValueOf: [ self visit: child ] intoVariable: self retvalVar. |
107 compiler codeAssignParsedValueOf:[ self visit:child ] to:self retvalVar. |
106 compiler add: 'error ifFalse: ['. |
108 compiler add: 'error ifFalse: ['. |
107 compiler indent. |
109 compiler indent. |
108 compiler codeReturn: self retvalVar. |
110 compiler codeReturn: self retvalVar. |
109 compiler dedent. |
111 compiler dedent. |
110 compiler add: '] ifTrue: ['. |
112 compiler add: '] ifTrue: ['. |
125 |
127 |
126 "Modified: / 10-05-2015 / 07:37:53 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
128 "Modified: / 10-05-2015 / 07:37:53 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
127 ! |
129 ! |
128 |
130 |
129 visitDeterministicChoiceNode: node |
131 visitDeterministicChoiceNode: node |
130 | dictionary | |
132 | dictionary isInlined | |
131 dictionary := IdentityDictionary new. |
133 dictionary := IdentityDictionary new. |
|
134 |
|
135 isInlined := node isMarkedForInline. |
132 |
136 |
133 node children do: [ :child | |
137 node children do: [ :child | |
134 | firstSet | |
138 | firstSet | |
135 firstSet := child firstSetWithTokens. |
139 firstSet := child firstSetWithTokens. |
136 self assert: firstSet size = 1. |
140 self assert: firstSet size = 1. |
143 | tokenMethodName | |
147 | tokenMethodName | |
144 tokenMethodName := compiler idFor: (dictionary at: child). |
148 tokenMethodName := compiler idFor: (dictionary at: child). |
145 compiler add: '(self ', tokenMethodName asString, ')'. |
149 compiler add: '(self ', tokenMethodName asString, ')'. |
146 compiler addOnLine: ' ifTrue: ['. |
150 compiler addOnLine: ' ifTrue: ['. |
147 compiler indent. |
151 compiler indent. |
148 compiler codeStoreValueOf: [ self visit: child ] intoVariable: self retvalVar. |
152 compiler codeReturnParsedValueOf:[ self visit:child ]. |
149 compiler codeReturn: self retvalVar. |
153 compiler dedent. |
150 compiler dedent. |
154 isInlined ifTrue:[ |
151 compiler add: '].' |
155 compiler add: '] ifFalse: [' |
152 ]. |
156 ] ifFalse:[ |
153 |
157 compiler add: '].'. |
|
158 ] |
|
159 ]. |
154 compiler codeError: 'no choice found'. |
160 compiler codeError: 'no choice found'. |
|
161 isInlined ifTrue:[ |
|
162 node children size timesRepeat: [ compiler addOnLine: ']' ]. |
|
163 compiler addOnLine: '.'. |
|
164 ] |
|
165 |
|
166 "Modified: / 21-05-2015 / 15:31:26 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
155 ! |
167 ! |
156 |
168 |
157 visitTokenChoiceNode: node |
169 visitTokenChoiceNode: node |
158 | trimmingToken | |
170 | trimmingToken | |
159 self assert: (node children allSatisfy: [ :e | e isMarkedForInline not ]). |
171 self assert: (node children allSatisfy: [ :e | e isMarkedForInline not ]). |
196 visitTokenizingParserNode: node |
208 visitTokenizingParserNode: node |
197 self visit: node tokenizer. |
209 self visit: node tokenizer. |
198 self visit: node whitespace. |
210 self visit: node whitespace. |
199 |
211 |
200 compiler codeHaltIfShiftPressed. |
212 compiler codeHaltIfShiftPressed. |
201 compiler codeStoreValueOf: [ self visit: node parser ] intoVariable: self retvalVar. |
213 compiler |
|
214 codeAssignParsedValueOf:[ self visit:node parser ] |
|
215 to:self retvalVar. |
202 compiler codeReturn. |
216 compiler codeReturn. |
203 ! |
217 ! |
204 |
218 |
205 visitTrimmingTokenNode: node |
219 visitTrimmingTokenNode: node |
206 self error: 'shoudl not happend!!' |
220 self error: 'shoudl not happend!!' |