aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/LuaSL/src/LuaSL_LSL_tree.c
diff options
context:
space:
mode:
Diffstat (limited to 'LuaSL/src/LuaSL_LSL_tree.c')
-rw-r--r--LuaSL/src/LuaSL_LSL_tree.c132
1 files changed, 75 insertions, 57 deletions
diff --git a/LuaSL/src/LuaSL_LSL_tree.c b/LuaSL/src/LuaSL_LSL_tree.c
index 76dd433..ff7da8b 100644
--- a/LuaSL/src/LuaSL_LSL_tree.c
+++ b/LuaSL/src/LuaSL_LSL_tree.c
@@ -149,20 +149,42 @@ static void burnAST(LSL_AST *ast)
149 149
150 burnAST(ast->left); 150 burnAST(ast->left);
151 burnAST(ast->right); 151 burnAST(ast->right);
152 free(ast->content.ignorableText);
152 free(ast); 153 free(ast);
153} 154}
154 155
155LSL_AST *addInteger(int value) 156static LSL_AST *checkAndAddIgnorable(LSL_AST *root)
157{
158 if (root)
159 {
160 if (root->content.ignorableText)
161 {
162 LSL_AST *ast = newAST(LSL_SPACE, NULL, root);
163
164 if (ast)
165 {
166 ast->content.value.spaceValue = root->content.ignorableText;
167 return ast;
168 }
169 }
170 }
171 return root;
172}
173
174LSL_AST *addInteger(LSL_Leaf *lval, int value)
156{ 175{
157 LSL_AST *ast = newAST(LSL_INTEGER, NULL, NULL); 176 LSL_AST *ast = newAST(LSL_INTEGER, NULL, NULL);
158 177
159 if (ast) 178 if (ast)
160 ast->content.integerValue = value; 179 {
180 ast->content.value.integerValue = value;
181 ast->content.ignorableText = lval->ignorableText;
182 }
161 183
162 return ast; 184 return checkAndAddIgnorable(ast);
163} 185}
164 186
165LSL_AST *addOperation(LSL_Type type, LSL_AST *left, LSL_AST *right) 187LSL_AST *addOperation(LSL_Leaf *lval, LSL_Type type, LSL_AST *left, LSL_AST *right)
166{ 188{
167 LSL_AST *ast = newAST(type, left, right); 189 LSL_AST *ast = newAST(type, left, right);
168 190
@@ -170,24 +192,30 @@ LSL_AST *addOperation(LSL_Type type, LSL_AST *left, LSL_AST *right)
170 { 192 {
171 if (LSL_EXPRESSION == type) 193 if (LSL_EXPRESSION == type)
172 { 194 {
173 ast->content.expressionValue = right; 195 ast->content.value.expressionValue = right;
174 ast->left = NULL; 196 ast->left = NULL;
175 } 197 }
176 else 198 else
177 ast->content.operationValue = type; 199 {
200 ast->content.value.operationValue = type;
201 ast->content.ignorableText = lval->ignorableText;
202 }
178 } 203 }
179 204
180 return ast; 205 return checkAndAddIgnorable(ast);
181} 206}
182 207
183LSL_AST *addParenthesis(LSL_AST *expr) 208LSL_AST *addParenthesis(LSL_Leaf *lval, LSL_AST *expr)
184{ 209{
185 LSL_AST *ast = newAST(LSL_PARENTHESIS_OPEN, NULL, expr); 210 LSL_AST *ast = newAST(LSL_PARENTHESIS_OPEN, NULL, expr);
186 211
187 if (ast) 212 if (ast)
213 {
188 ast = newAST(LSL_PARENTHESIS_CLOSE, ast, NULL); 214 ast = newAST(LSL_PARENTHESIS_CLOSE, ast, NULL);
215 ast->content.ignorableText = lval->ignorableText;
216 }
189 217
190 return ast; 218 return checkAndAddIgnorable(ast);
191} 219}
192 220
193LSL_Statement *createStatement(LSL_Type type, LSL_AST *expr) 221LSL_Statement *createStatement(LSL_Type type, LSL_AST *expr)
@@ -202,24 +230,14 @@ LSL_Statement *createStatement(LSL_Type type, LSL_AST *expr)
202 return stat; 230 return stat;
203} 231}
204 232
205LSL_AST *addSpace(char *text, LSL_AST *root)
206{
207 LSL_AST *ast = newAST(LSL_SPACE, root, NULL);
208
209 if (ast)
210 ast->content.spaceValue = text;
211
212 return ast;
213}
214
215LSL_AST *addStatement(LSL_Statement *statement, LSL_AST *root) 233LSL_AST *addStatement(LSL_Statement *statement, LSL_AST *root)
216{ 234{
217 LSL_AST *ast = newAST(LSL_STATEMENT, root, NULL); 235 LSL_AST *ast = newAST(LSL_STATEMENT, root, NULL);
218 236
219 if (ast) 237 if (ast)
220 ast->content.statementValue = statement; 238 ast->content.value.statementValue = statement;
221 239
222 return ast; 240 return checkAndAddIgnorable(ast);
223} 241}
224 242
225static void evaluateAST(LSL_AST *ast, LSL_Value *left, LSL_Value *right) 243static void evaluateAST(LSL_AST *ast, LSL_Value *left, LSL_Value *right)
@@ -259,7 +277,7 @@ static void evaluateAST(LSL_AST *ast, LSL_Value *left, LSL_Value *right)
259 else 277 else
260 { 278 {
261#ifdef LUASL_DEBUG 279#ifdef LUASL_DEBUG
262 printf(" eval <%s %d %d %d %d> ", ast->token->token, left->content.integerValue, right->content.integerValue, lresult.content.integerValue, rresult.content.integerValue); 280 printf(" eval <%s %d %d %d %d> ", ast->token->token, left->content.value.integerValue, right->content.value.integerValue, lresult.content.value.integerValue, rresult.content.value.integerValue);
263#endif 281#endif
264 memcpy(left, &rresult, sizeof(LSL_Value)); 282 memcpy(left, &rresult, sizeof(LSL_Value));
265 } 283 }
@@ -271,9 +289,9 @@ static void evaluateIntegerToken(LSL_Leaf *content, LSL_Value *left, LSL_Value *
271 if (content) 289 if (content)
272 { 290 {
273#ifdef LUASL_DEBUG 291#ifdef LUASL_DEBUG
274 printf(" <%d> ", content->integerValue); 292 printf(" <%d> ", content->value.integerValue);
275#endif 293#endif
276 left->content.integerValue = content->integerValue; 294 left->content.value.integerValue = content->value.integerValue;
277 left->type = LSL_INTEGER; 295 left->type = LSL_INTEGER;
278 } 296 }
279} 297}
@@ -284,13 +302,13 @@ static void evaluateNoToken(LSL_Leaf *content, LSL_Value *left, LSL_Value *right
284 302
285static void evaluateOperationToken(LSL_Leaf *content, LSL_Value *left, LSL_Value *right) 303static void evaluateOperationToken(LSL_Leaf *content, LSL_Value *left, LSL_Value *right)
286{ 304{
287 if ((content) && (content->operationValue)) 305 if ((content) && (content->value.operationValue))
288 { 306 {
289#ifdef LUASL_DEBUG 307#ifdef LUASL_DEBUG
290 printf(" [%s] ", tokens[content->operationValue - lowestToken]->token); 308 printf(" [%s] ", tokens[content->value.operationValue - lowestToken]->token);
291#endif 309#endif
292 310
293 switch (content->operationValue) 311 switch (content->value.operationValue)
294 { 312 {
295 case LSL_COMMA : 313 case LSL_COMMA :
296 case LSL_INCREMENT_PRE : 314 case LSL_INCREMENT_PRE :
@@ -314,33 +332,33 @@ static void evaluateOperationToken(LSL_Leaf *content, LSL_Value *left, LSL_Value
314// case LSL_TYPECAST_OPEN : 332// case LSL_TYPECAST_OPEN :
315// case LSL_TYPECAST_CLOSE : 333// case LSL_TYPECAST_CLOSE :
316 break; 334 break;
317 case LSL_BIT_NOT : left->content.integerValue = ~ right->content.integerValue; break; 335 case LSL_BIT_NOT : left->content.value.integerValue = ~ right->content.value.integerValue; break;
318 case LSL_BOOL_NOT : left->content.integerValue = ! right->content.integerValue; break; 336 case LSL_BOOL_NOT : left->content.value.integerValue = ! right->content.value.integerValue; break;
319 case LSL_NEGATION : left->content.integerValue = 0 - right->content.integerValue; break; 337 case LSL_NEGATION : left->content.value.integerValue = 0 - right->content.value.integerValue; break;
320 case LSL_DIVIDE : left->content.integerValue = left->content.integerValue / right->content.integerValue; break; 338 case LSL_DIVIDE : left->content.value.integerValue = left->content.value.integerValue / right->content.value.integerValue; break;
321 case LSL_MODULO : left->content.integerValue = left->content.integerValue % right->content.integerValue; break; 339 case LSL_MODULO : left->content.value.integerValue = left->content.value.integerValue % right->content.value.integerValue; break;
322 case LSL_MULTIPLY : left->content.integerValue = left->content.integerValue * right->content.integerValue; break; 340 case LSL_MULTIPLY : left->content.value.integerValue = left->content.value.integerValue * right->content.value.integerValue; break;
323// case LSL_DOT_PRODUCT : break; 341// case LSL_DOT_PRODUCT : break;
324// case LSL_CROSS_PRODUCT : break; 342// case LSL_CROSS_PRODUCT : break;
325 case LSL_SUBTRACT : left->content.integerValue = left->content.integerValue - right->content.integerValue; break; 343 case LSL_SUBTRACT : left->content.value.integerValue = left->content.value.integerValue - right->content.value.integerValue; break;
326 case LSL_ADD : left->content.integerValue = left->content.integerValue + right->content.integerValue; break; 344 case LSL_ADD : left->content.value.integerValue = left->content.value.integerValue + right->content.value.integerValue; break;
327// case LSL_CONCATENATE : break; 345// case LSL_CONCATENATE : break;
328 case LSL_LEFT_SHIFT : left->content.integerValue = left->content.integerValue << right->content.integerValue; break; 346 case LSL_LEFT_SHIFT : left->content.value.integerValue = left->content.value.integerValue << right->content.value.integerValue; break;
329 case LSL_RIGHT_SHIFT : left->content.integerValue = left->content.integerValue >> right->content.integerValue; break; 347 case LSL_RIGHT_SHIFT : left->content.value.integerValue = left->content.value.integerValue >> right->content.value.integerValue; break;
330 case LSL_LESS_THAN : left->content.integerValue = left->content.integerValue < right->content.integerValue; break; 348 case LSL_LESS_THAN : left->content.value.integerValue = left->content.value.integerValue < right->content.value.integerValue; break;
331 case LSL_GREATER_THAN : left->content.integerValue = left->content.integerValue > right->content.integerValue; break; 349 case LSL_GREATER_THAN : left->content.value.integerValue = left->content.value.integerValue > right->content.value.integerValue; break;
332 case LSL_LESS_EQUAL : left->content.integerValue = left->content.integerValue <= right->content.integerValue; break; 350 case LSL_LESS_EQUAL : left->content.value.integerValue = left->content.value.integerValue <= right->content.value.integerValue; break;
333 case LSL_GREATER_EQUAL : left->content.integerValue = left->content.integerValue >= right->content.integerValue; break; 351 case LSL_GREATER_EQUAL : left->content.value.integerValue = left->content.value.integerValue >= right->content.value.integerValue; break;
334 case LSL_EQUAL : left->content.integerValue = left->content.integerValue == right->content.integerValue; break; 352 case LSL_EQUAL : left->content.value.integerValue = left->content.value.integerValue == right->content.value.integerValue; break;
335 case LSL_NOT_EQUAL : left->content.integerValue = left->content.integerValue != right->content.integerValue; break; 353 case LSL_NOT_EQUAL : left->content.value.integerValue = left->content.value.integerValue != right->content.value.integerValue; break;
336 case LSL_BIT_AND : left->content.integerValue = left->content.integerValue & right->content.integerValue; break; 354 case LSL_BIT_AND : left->content.value.integerValue = left->content.value.integerValue & right->content.value.integerValue; break;
337 case LSL_BIT_XOR : left->content.integerValue = left->content.integerValue ^ right->content.integerValue; break; 355 case LSL_BIT_XOR : left->content.value.integerValue = left->content.value.integerValue ^ right->content.value.integerValue; break;
338 case LSL_BIT_OR : left->content.integerValue = left->content.integerValue | right->content.integerValue; break; 356 case LSL_BIT_OR : left->content.value.integerValue = left->content.value.integerValue | right->content.value.integerValue; break;
339 case LSL_BOOL_OR : left->content.integerValue = left->content.integerValue || right->content.integerValue; break; 357 case LSL_BOOL_OR : left->content.value.integerValue = left->content.value.integerValue || right->content.value.integerValue; break;
340 case LSL_BOOL_AND : left->content.integerValue = left->content.integerValue && right->content.integerValue; break; 358 case LSL_BOOL_AND : left->content.value.integerValue = left->content.value.integerValue && right->content.value.integerValue; break;
341 } 359 }
342#ifdef LUASL_DEBUG 360#ifdef LUASL_DEBUG
343 printf(" (=%d) ", left->content.integerValue); 361 printf(" (=%d) ", left->content.value.integerValue);
344#endif 362#endif
345 } 363 }
346} 364}
@@ -348,7 +366,7 @@ static void evaluateOperationToken(LSL_Leaf *content, LSL_Value *left, LSL_Value
348static void evaluateStatementToken(LSL_Leaf *content, LSL_Value *left, LSL_Value *right) 366static void evaluateStatementToken(LSL_Leaf *content, LSL_Value *left, LSL_Value *right)
349{ 367{
350 if (content) 368 if (content)
351 evaluateAST(content->statementValue->expression, left, right); 369 evaluateAST(content->value.statementValue->expression, left, right);
352} 370}
353 371
354static void outputAST(LSL_AST *ast) 372static void outputAST(LSL_AST *ast)
@@ -367,26 +385,26 @@ static void outputAST(LSL_AST *ast)
367static void outputIntegerToken(LSL_Leaf *content) 385static void outputIntegerToken(LSL_Leaf *content)
368{ 386{
369 if (content) 387 if (content)
370 printf("%d", content->integerValue); 388 printf("%d", content->value.integerValue);
371} 389}
372 390
373static void outputOperationToken(LSL_Leaf *content) 391static void outputOperationToken(LSL_Leaf *content)
374{ 392{
375 if (content) 393 if (content)
376 printf("%s", tokens[content->operationValue - lowestToken]->token); 394 printf("%s", tokens[content->value.operationValue - lowestToken]->token);
377} 395}
378 396
379static void outputStatementToken(LSL_Leaf *content) 397static void outputStatementToken(LSL_Leaf *content)
380{ 398{
381 if (content) 399 if (content)
382 outputAST(content->statementValue->expression); 400 outputAST(content->value.statementValue->expression);
383 printf(";"); 401 printf(";");
384} 402}
385 403
386static void outputSpaceToken(LSL_Leaf *content) 404static void outputSpaceToken(LSL_Leaf *content)
387{ 405{
388 if (content) 406 if (content)
389 printf("%s", content->spaceValue); 407 printf("%s", content->value.spaceValue);
390} 408}
391 409
392static void convertAST2Lua(LSL_AST *ast) 410static void convertAST2Lua(LSL_AST *ast)
@@ -523,9 +541,9 @@ int main(int argc, char **argv)
523 { 541 {
524 LSL_Value left, right; 542 LSL_Value left, right;
525 543
526 left.content.integerValue = 0; 544 left.content.value.integerValue = 0;
527 left.type = LSL_INTEGER; 545 left.type = LSL_INTEGER;
528 right.content.integerValue = 0; 546 right.content.value.integerValue = 0;
529 right.type = LSL_INTEGER; 547 right.type = LSL_INTEGER;
530 evaluateAST(ast, &left, &right); 548 evaluateAST(ast, &left, &right);
531 549
@@ -535,7 +553,7 @@ int main(int argc, char **argv)
535 printf("Result of -\n"); 553 printf("Result of -\n");
536 outputAST(ast); 554 outputAST(ast);
537 printf("\n"); 555 printf("\n");
538 printf("is %d %d. And converted to Lua it is -\n", left.content.integerValue, right.content.integerValue); 556 printf("is %d %d. And converted to Lua it is -\n", left.content.value.integerValue, right.content.value.integerValue);
539 convertAST2Lua(ast); 557 convertAST2Lua(ast);
540 printf("\n"); 558 printf("\n");
541 burnAST(ast); 559 burnAST(ast);