diff options
Diffstat (limited to 'LuaSL/src/LuaSL_compile.c')
-rw-r--r-- | LuaSL/src/LuaSL_compile.c | 88 |
1 files changed, 72 insertions, 16 deletions
diff --git a/LuaSL/src/LuaSL_compile.c b/LuaSL/src/LuaSL_compile.c index dc2dd5c..00f41da 100644 --- a/LuaSL/src/LuaSL_compile.c +++ b/LuaSL/src/LuaSL_compile.c | |||
@@ -584,7 +584,7 @@ LSL_Leaf *addFunctionBody(LuaSL_compiler *compiler, LSL_Leaf *function, LSL_Leaf | |||
584 | if (function) | 584 | if (function) |
585 | { | 585 | { |
586 | function->value.functionValue->block = block->value.blockValue; | 586 | function->value.functionValue->block = block->value.blockValue; |
587 | statement = addStatement(compiler, NULL, LSL_FUNCTION, NULL, function, NULL, NULL, NULL); | 587 | statement = addStatement(compiler, NULL, function, NULL, function, NULL, NULL, NULL); |
588 | } | 588 | } |
589 | 589 | ||
590 | return statement; | 590 | return statement; |
@@ -676,17 +676,18 @@ LSL_Leaf *addState(LuaSL_compiler *compiler, LSL_Leaf *state, LSL_Leaf *identifi | |||
676 | return identifier; | 676 | return identifier; |
677 | } | 677 | } |
678 | 678 | ||
679 | LSL_Leaf *addStatement(LuaSL_compiler *compiler, LSL_Leaf *lval, LSL_Type type, LSL_Leaf *left, LSL_Leaf *expr, LSL_Leaf *right, LSL_Leaf *block, LSL_Leaf *identifier) | 679 | LSL_Leaf *addStatement(LuaSL_compiler *compiler, LSL_Leaf *lval, LSL_Leaf *flow, LSL_Leaf *left, LSL_Leaf *expr, LSL_Leaf *right, LSL_Leaf *block, LSL_Leaf *identifier) |
680 | { | 680 | { |
681 | gameGlobals *game = compiler->game; | 681 | gameGlobals *game = compiler->game; |
682 | LSL_Statement *stat = calloc(1, sizeof(LSL_Statement)); | 682 | LSL_Statement *stat = calloc(1, sizeof(LSL_Statement)); |
683 | boolean justOne = FALSE; | ||
683 | 684 | ||
684 | if (NULL == lval) | 685 | if (NULL == lval) |
685 | lval = newLeaf(LSL_STATEMENT, NULL, NULL); | 686 | lval = newLeaf(LSL_STATEMENT, NULL, NULL); |
686 | 687 | ||
687 | if (stat) | 688 | if (stat) |
688 | { | 689 | { |
689 | stat->type = type; | 690 | stat->type = flow->toKen->type; |
690 | stat->expressions = expr; | 691 | stat->expressions = expr; |
691 | if (block) | 692 | if (block) |
692 | stat->block = block->value.blockValue; | 693 | stat->block = block->value.blockValue; |
@@ -701,17 +702,7 @@ LSL_Leaf *addStatement(LuaSL_compiler *compiler, LSL_Leaf *lval, LSL_Type type, | |||
701 | stat->parenthesis = parens->value.parenthesis; | 702 | stat->parenthesis = parens->value.parenthesis; |
702 | } | 703 | } |
703 | 704 | ||
704 | if (lval) | 705 | switch (stat->type) |
705 | { | ||
706 | #if LUASL_DIFF_CHECK | ||
707 | stat->ignorable = calloc(1, sizeof(Eina_Strbuf *)); | ||
708 | stat->ignorable[0] = lval->ignorable; | ||
709 | lval->ignorable = NULL; | ||
710 | #endif | ||
711 | lval->value.statementValue = stat; | ||
712 | } | ||
713 | |||
714 | switch (type) | ||
715 | { | 706 | { |
716 | case LSL_EXPRESSION : | 707 | case LSL_EXPRESSION : |
717 | { | 708 | { |
@@ -731,28 +722,37 @@ LSL_Leaf *addStatement(LuaSL_compiler *compiler, LSL_Leaf *lval, LSL_Type type, | |||
731 | } | 722 | } |
732 | case LSL_IF : | 723 | case LSL_IF : |
733 | { | 724 | { |
725 | justOne = TRUE; | ||
734 | break; | 726 | break; |
735 | } | 727 | } |
736 | case LSL_ELSE : | 728 | case LSL_ELSE : |
737 | { | 729 | { |
730 | justOne = TRUE; | ||
738 | break; | 731 | break; |
739 | } | 732 | } |
740 | case LSL_JUMP : | 733 | case LSL_JUMP : |
741 | { | 734 | { |
735 | justOne = TRUE; | ||
742 | break; | 736 | break; |
743 | } | 737 | } |
744 | case LSL_RETURN : | 738 | case LSL_RETURN : |
745 | { | 739 | { |
740 | justOne = TRUE; | ||
746 | break; | 741 | break; |
747 | } | 742 | } |
748 | case LSL_STATE_CHANGE : | 743 | case LSL_STATE_CHANGE : |
749 | { | 744 | { |
745 | justOne = TRUE; | ||
746 | break; | ||
747 | } | ||
748 | case LSL_STATEMENT : | ||
749 | { | ||
750 | break; | 750 | break; |
751 | } | 751 | } |
752 | case LSL_WHILE : | 752 | case LSL_WHILE : |
753 | { | 753 | { |
754 | stat->identifier = NULL; | 754 | stat->identifier = NULL; |
755 | // TODO - need to stash the while's white space somewhere. | 755 | justOne = TRUE; |
756 | break; | 756 | break; |
757 | } | 757 | } |
758 | case LSL_IDENTIFIER : | 758 | case LSL_IDENTIFIER : |
@@ -765,11 +765,34 @@ LSL_Leaf *addStatement(LuaSL_compiler *compiler, LSL_Leaf *lval, LSL_Type type, | |||
765 | } | 765 | } |
766 | default : | 766 | default : |
767 | { | 767 | { |
768 | PE("Should not be here %d.", type); | 768 | PE("Should not be here %d.", stat->type); |
769 | break; | 769 | break; |
770 | } | 770 | } |
771 | } | 771 | } |
772 | 772 | ||
773 | if (justOne && (flow)) | ||
774 | { | ||
775 | stat->ignorable = calloc(2, sizeof(Eina_Strbuf *)); | ||
776 | if (stat->ignorable) | ||
777 | { | ||
778 | stat->ignorable[1] = flow->ignorable; | ||
779 | flow->ignorable = NULL; | ||
780 | } | ||
781 | } | ||
782 | |||
783 | if (lval) | ||
784 | { | ||
785 | #if LUASL_DIFF_CHECK | ||
786 | if (NULL == stat->ignorable) | ||
787 | stat->ignorable = calloc(1, sizeof(Eina_Strbuf *)); | ||
788 | if (stat->ignorable) | ||
789 | { | ||
790 | stat->ignorable[0] = lval->ignorable; | ||
791 | lval->ignorable = NULL; | ||
792 | } | ||
793 | #endif | ||
794 | lval->value.statementValue = stat; | ||
795 | } | ||
773 | } | 796 | } |
774 | 797 | ||
775 | return lval; | 798 | return lval; |
@@ -1195,6 +1218,11 @@ static LSL_Leaf *evaluateStatementToken(LSL_Leaf *content, LSL_Leaf *left, LSL_L | |||
1195 | { | 1218 | { |
1196 | break; | 1219 | break; |
1197 | } | 1220 | } |
1221 | case LSL_STATEMENT : | ||
1222 | { | ||
1223 | result = evaluateLeaf(content->value.statementValue->expressions, left, right); | ||
1224 | break; | ||
1225 | } | ||
1198 | case LSL_WHILE : | 1226 | case LSL_WHILE : |
1199 | { | 1227 | { |
1200 | break; | 1228 | break; |
@@ -1326,32 +1354,60 @@ static void outputRawStatement(FILE *file, outputMode mode, LSL_Statement *state | |||
1326 | case LSL_IF : | 1354 | case LSL_IF : |
1327 | { | 1355 | { |
1328 | isBlock = TRUE; | 1356 | isBlock = TRUE; |
1357 | #if LUASL_DIFF_CHECK | ||
1358 | if ((statement->ignorable) && (statement->ignorable[1])) | ||
1359 | fwrite(eina_strbuf_string_get(statement->ignorable[1]), 1, eina_strbuf_length_get(statement->ignorable[1]), file); | ||
1360 | #endif | ||
1329 | fprintf(file, "%s", tokens[statement->type - lowestToken]->toKen); | 1361 | fprintf(file, "%s", tokens[statement->type - lowestToken]->toKen); |
1330 | break; | 1362 | break; |
1331 | } | 1363 | } |
1332 | case LSL_ELSE : | 1364 | case LSL_ELSE : |
1333 | { | 1365 | { |
1366 | #if LUASL_DIFF_CHECK | ||
1367 | if ((statement->ignorable) && (statement->ignorable[1])) | ||
1368 | fwrite(eina_strbuf_string_get(statement->ignorable[1]), 1, eina_strbuf_length_get(statement->ignorable[1]), file); | ||
1369 | #endif | ||
1334 | fprintf(file, "%s", tokens[statement->type - lowestToken]->toKen); | 1370 | fprintf(file, "%s", tokens[statement->type - lowestToken]->toKen); |
1335 | break; | 1371 | break; |
1336 | } | 1372 | } |
1337 | case LSL_JUMP : | 1373 | case LSL_JUMP : |
1338 | { | 1374 | { |
1375 | #if LUASL_DIFF_CHECK | ||
1376 | if ((statement->ignorable) && (statement->ignorable[1])) | ||
1377 | fwrite(eina_strbuf_string_get(statement->ignorable[1]), 1, eina_strbuf_length_get(statement->ignorable[1]), file); | ||
1378 | #endif | ||
1339 | fprintf(file, "%s", tokens[statement->type - lowestToken]->toKen); | 1379 | fprintf(file, "%s", tokens[statement->type - lowestToken]->toKen); |
1340 | break; | 1380 | break; |
1341 | } | 1381 | } |
1342 | case LSL_RETURN : | 1382 | case LSL_RETURN : |
1343 | { | 1383 | { |
1384 | #if LUASL_DIFF_CHECK | ||
1385 | if ((statement->ignorable) && (statement->ignorable[1])) | ||
1386 | fwrite(eina_strbuf_string_get(statement->ignorable[1]), 1, eina_strbuf_length_get(statement->ignorable[1]), file); | ||
1387 | #endif | ||
1344 | fprintf(file, "%s", tokens[statement->type - lowestToken]->toKen); | 1388 | fprintf(file, "%s", tokens[statement->type - lowestToken]->toKen); |
1345 | break; | 1389 | break; |
1346 | } | 1390 | } |
1347 | case LSL_STATE_CHANGE : | 1391 | case LSL_STATE_CHANGE : |
1348 | { | 1392 | { |
1393 | #if LUASL_DIFF_CHECK | ||
1394 | if ((statement->ignorable) && (statement->ignorable[1])) | ||
1395 | fwrite(eina_strbuf_string_get(statement->ignorable[1]), 1, eina_strbuf_length_get(statement->ignorable[1]), file); | ||
1396 | #endif | ||
1349 | fprintf(file, "%s", tokens[statement->type - lowestToken]->toKen); | 1397 | fprintf(file, "%s", tokens[statement->type - lowestToken]->toKen); |
1350 | break; | 1398 | break; |
1351 | } | 1399 | } |
1400 | case LSL_STATEMENT : | ||
1401 | { | ||
1402 | break; | ||
1403 | } | ||
1352 | case LSL_WHILE : | 1404 | case LSL_WHILE : |
1353 | { | 1405 | { |
1354 | isBlock = TRUE; | 1406 | isBlock = TRUE; |
1407 | #if LUASL_DIFF_CHECK | ||
1408 | if ((statement->ignorable) && (statement->ignorable[1])) | ||
1409 | fwrite(eina_strbuf_string_get(statement->ignorable[1]), 1, eina_strbuf_length_get(statement->ignorable[1]), file); | ||
1410 | #endif | ||
1355 | fprintf(file, "%s", tokens[statement->type - lowestToken]->toKen); | 1411 | fprintf(file, "%s", tokens[statement->type - lowestToken]->toKen); |
1356 | break; | 1412 | break; |
1357 | } | 1413 | } |