@@ -100,6 +100,20 @@ -(void)declare:(NSString*)name with:(JawaObjectRef*)value {
100
100
[currentScope setValue: value forKey: name];
101
101
}
102
102
103
+ -(JawaObjectRef*)declareFunction : (NSDictionary *)ast {
104
+ printf (" Running FUNCTION_DECLARATION\n " );
105
+ NSString *name = (NSString *)[ast objectForKey: PR_id];
106
+ NSArray *params = (NSArray *)[ast objectForKey: PR_params];
107
+ NSMutableArray *paramStrs = [[NSMutableArray alloc ]init];
108
+ for (NSString * paramStr in params) {
109
+ [paramStrs addObject: paramStr];
110
+ }
111
+ NSDictionary * body = (NSDictionary *)[ast objectForKey: PR_body];
112
+ JawaFunc* func = [[JawaFunc alloc ]initWithName:name in: self taking: paramStrs is: false is: false and: body];
113
+ [self declare: name with: [JawaObjectRef RefWithJawaFunc: func]];
114
+ return nil ;
115
+ }
116
+
103
117
-(JawaObjectRef*)declareVar : (NSDictionary *)ast {
104
118
printf (" Running VARIABLE_DECLARATION\n " );
105
119
NSString * name = (NSString *)[ast objectForKey: PR_varName];
@@ -122,6 +136,31 @@ -(JawaObjectRef*)execVarStatement:(NSDictionary*)ast {
122
136
return nil ;
123
137
}
124
138
139
+ -(JawaObjectRef*)evalBlockStatement : (NSDictionary *)ast {
140
+ printf (" Running BLOCK_STATEMENT\n " );
141
+ BOOL oldIsFromCallExpression = self.isFromCallExpression ;
142
+ if (!self.isFromCallExpression ) {
143
+ // Create a new scope
144
+ [self .currentActivation addObject: [[NSDictionary alloc ]init]];
145
+ }
146
+ self.isFromCallExpression = false ;
147
+ NSArray * statements = [ast objectForKey: PR_statements];
148
+ for (NSDictionary * statement in statements) {
149
+ [self evaluate: statement];
150
+ if ([[self .currentActivation objectAtIndex: 0 ] objectForKey: @" return" ] != nil ) {
151
+ break ;
152
+ }
153
+ if (self.currentIterationScope != nil &&
154
+ ([self .currentIterationScope objectForKey: @" break" ] != nil ||
155
+ [self .currentIterationScope objectForKey: @" continue" ] != nil ))
156
+ break ;
157
+ }
158
+ self.isFromCallExpression = oldIsFromCallExpression;
159
+ if (!self.isFromCallExpression )
160
+ [self .currentActivation removeLastObject ];
161
+ return nil ;
162
+ }
163
+
125
164
-(JawaObjectRef*)evalScriptBody : (NSDictionary *)ast {
126
165
printf (" Running SCRIPT_BODY\n " );
127
166
NSArray * statements = (NSArray *)[ast objectForKey: PR_statements];
@@ -131,6 +170,25 @@ -(JawaObjectRef*)evalScriptBody:(NSDictionary*)ast {
131
170
return nil ;
132
171
}
133
172
173
+ -(JawaObjectRef*)evalLiteral : (NSDictionary *)ast {
174
+ printf (" Running LITERAL\n " );
175
+ NSString * literal = [ast objectForKey: PR_literal];
176
+ NSUInteger sp = [literal rangeOfString: @" ," ].location ;
177
+ NSString * type = [literal substringWithRange: NSMakeRange (0 , sp)];
178
+ NSString * content = [literal substringFromIndex: sp + 1 ];
179
+ if ([type isEqualToString: @" STRING_LITERAL" ])
180
+ return [JawaObjectRef RefWithString: content in: self ];
181
+ else if ([type isEqualToString: @" NUMERIC_LITERAL" ])
182
+ return [JawaObjectRef RefWithNumber: [content doubleValue ] in: self ];
183
+ else if ([type isEqualToString: @" BOOLEAN" ])
184
+ return [JawaObjectRef RefWithBoolean: [content boolValue ] in: self ];
185
+ else if ([type isEqualToString: @" NULL" ])
186
+ return [JawaObjectRef RefIn: self ];
187
+ else
188
+ [NSException raise: @" Unknown literal type" format: @" %@ " , literal];
189
+ return nil ;
190
+ }
191
+
134
192
-(JawaObjectRef*)evaluate : (NSDictionary *)tree {
135
193
if (tree == nil )
136
194
return nil ;
@@ -139,9 +197,9 @@ -(JawaObjectRef*)evaluate:(NSDictionary *)tree {
139
197
case SCRIPT_BODY:
140
198
return [self evalScriptBody: tree];
141
199
case FUNCTION_DECLARATION:
142
- break ;
200
+ return [ self declareFunction: tree] ;
143
201
case BLOCK_STATEMENT:
144
- break ;
202
+ return [ self evalBlockStatement: tree] ;
145
203
case EMPTY_STATEMENT:
146
204
break ;
147
205
case SEQUENCE_EXPRESSION:
@@ -207,7 +265,7 @@ -(JawaObjectRef*)evaluate:(NSDictionary *)tree {
207
265
case VARIABLE_DECLARATION:
208
266
return [self declareVar: tree];
209
267
case LITERAL:
210
- break ;
268
+ return [ self evalLiteral: tree] ;
211
269
default :
212
270
break ;
213
271
}
0 commit comments