diff options
Diffstat (limited to 'LuaSL')
-rw-r--r-- | LuaSL/src/LuaSL_compile.c | 14 | ||||
-rw-r--r-- | LuaSL/src/LuaSL_lemon_yaccer.y | 15 |
2 files changed, 16 insertions, 13 deletions
diff --git a/LuaSL/src/LuaSL_compile.c b/LuaSL/src/LuaSL_compile.c index 9c301b8..a98c833 100644 --- a/LuaSL/src/LuaSL_compile.c +++ b/LuaSL/src/LuaSL_compile.c | |||
@@ -660,7 +660,7 @@ LSL_Leaf *addStatement(LuaSL_compiler *compiler, LSL_Leaf *lval, LSL_Type type, | |||
660 | stat->identifier = identifier->value.identifierValue; | 660 | stat->identifier = identifier->value.identifierValue; |
661 | if (left) | 661 | if (left) |
662 | { | 662 | { |
663 | LSL_Leaf *parens = addParenthesis(left, expr, LSL_PARENTHESIS_OPEN, right); | 663 | LSL_Leaf *parens = addParenthesis(left, expr, LSL_EXPRESSION, right); |
664 | 664 | ||
665 | if (parens) | 665 | if (parens) |
666 | stat->parenthesis = parens->value.parenthesis; | 666 | stat->parenthesis = parens->value.parenthesis; |
@@ -1310,8 +1310,10 @@ static void outputRawStatement(FILE *file, outputMode mode, LSL_Statement *state | |||
1310 | { | 1310 | { |
1311 | boolean isBlock = FALSE; | 1311 | boolean isBlock = FALSE; |
1312 | 1312 | ||
1313 | switch (statement->type) | 1313 | if (statement) |
1314 | { | 1314 | { |
1315 | switch (statement->type) | ||
1316 | { | ||
1315 | case LSL_EXPRESSION : | 1317 | case LSL_EXPRESSION : |
1316 | { | 1318 | { |
1317 | break; | 1319 | break; |
@@ -1389,7 +1391,7 @@ static void outputRawStatement(FILE *file, outputMode mode, LSL_Statement *state | |||
1389 | if (!LUASL_DIFF_CHECK) | 1391 | if (!LUASL_DIFF_CHECK) |
1390 | fprintf(file, "\n"); | 1392 | fprintf(file, "\n"); |
1391 | } | 1393 | } |
1392 | 1394 | } | |
1393 | } | 1395 | } |
1394 | 1396 | ||
1395 | static void outputStatementToken(FILE *file, outputMode mode, LSL_Leaf *content) | 1397 | static void outputStatementToken(FILE *file, outputMode mode, LSL_Leaf *content) |
@@ -1414,11 +1416,11 @@ static void outputBlockToken(FILE *file, outputMode mode, LSL_Leaf *content) | |||
1414 | fprintf(file, "\n{\n"); | 1416 | fprintf(file, "\n{\n"); |
1415 | if (content->value.blockValue) | 1417 | if (content->value.blockValue) |
1416 | { | 1418 | { |
1417 | LSL_Statement *statement = NULL; | 1419 | LSL_Statement *stat = NULL; |
1418 | 1420 | ||
1419 | EINA_CLIST_FOR_EACH_ENTRY(statement, &(content->value.blockValue->statements), LSL_Statement, statement) | 1421 | EINA_CLIST_FOR_EACH_ENTRY(stat, &(content->value.blockValue->statements), LSL_Statement, statement) |
1420 | { | 1422 | { |
1421 | outputRawStatement(file, mode, statement); | 1423 | outputRawStatement(file, mode, stat); |
1422 | } | 1424 | } |
1423 | } | 1425 | } |
1424 | if (LUASL_DIFF_CHECK) | 1426 | if (LUASL_DIFF_CHECK) |
diff --git a/LuaSL/src/LuaSL_lemon_yaccer.y b/LuaSL/src/LuaSL_lemon_yaccer.y index ed53fd4..5ae66ce 100644 --- a/LuaSL/src/LuaSL_lemon_yaccer.y +++ b/LuaSL/src/LuaSL_lemon_yaccer.y | |||
@@ -39,7 +39,7 @@ state(S) ::= LSL_STATE_CHANGE LSL_IDENTIFIER(I) stateBlock(B). { S = addState( | |||
39 | 39 | ||
40 | %nonassoc LSL_PARAMETER LSL_PARAMETER_LIST LSL_FUNCTION. | 40 | %nonassoc LSL_PARAMETER LSL_PARAMETER_LIST LSL_FUNCTION. |
41 | functionList(A) ::= functionList(B) functionBody(C). { A = collectStatements(compiler, B, C); } | 41 | functionList(A) ::= functionList(B) functionBody(C). { A = collectStatements(compiler, B, C); } |
42 | //functionList(A) ::= functionBody(C). { A = collectStatements(compiler, NULL, C); } | 42 | functionList(A) ::= functionBody(C). { A = collectStatements(compiler, NULL, C); } |
43 | functionList(A) ::= . { A = collectStatements(compiler, NULL, NULL); } | 43 | functionList(A) ::= . { A = collectStatements(compiler, NULL, NULL); } |
44 | 44 | ||
45 | functionBody(A) ::= function(F) funcBlock(B). { A = addFunctionBody(compiler, F, B); } // addFunctionBody has an implied addStatement(compiler, NULL, LSL_FUNCTION, NULL, B, NULL, NULL); | 45 | functionBody(A) ::= function(F) funcBlock(B). { A = addFunctionBody(compiler, F, B); } // addFunctionBody has an implied addStatement(compiler, NULL, LSL_FUNCTION, NULL, B, NULL, NULL); |
@@ -55,8 +55,7 @@ function(A) ::= type(B) LSL_IDENTIFIER(C) LSL_PARENTHESIS_OPEN(D) parameterList( | |||
55 | // Blocks. | 55 | // Blocks. |
56 | 56 | ||
57 | block(A) ::= funcBlock(B). { A = B; } | 57 | block(A) ::= funcBlock(B). { A = B; } |
58 | block(A) ::= statement(B). { A = B; } | 58 | block(A) ::= statementList(B). { A = B; } |
59 | funcBlock(A) ::= LSL_BLOCK_OPEN statementList(B) LSL_BLOCK_CLOSE. { A = B; } | ||
60 | // Perhaps change this to block? No ,this is what differentiates it from a single statement, which functions can't handle. | 59 | // Perhaps change this to block? No ,this is what differentiates it from a single statement, which functions can't handle. |
61 | funcBlock(A) ::= beginBlock(L) statementList(B) LSL_BLOCK_CLOSE(R). { A = addBlock(compiler, L, B, R); } | 60 | funcBlock(A) ::= beginBlock(L) statementList(B) LSL_BLOCK_CLOSE(R). { A = addBlock(compiler, L, B, R); } |
62 | 61 | ||
@@ -64,6 +63,7 @@ funcBlock(A) ::= beginBlock(L) statementList(B) LSL_BLOCK_CLOSE(R). { A = addBl | |||
64 | 63 | ||
65 | %nonassoc LSL_STATEMENT. | 64 | %nonassoc LSL_STATEMENT. |
66 | statementList(A) ::= statementList(B) statement(C). { A = collectStatements(compiler, B, C); } | 65 | statementList(A) ::= statementList(B) statement(C). { A = collectStatements(compiler, B, C); } |
66 | // This causes infinite loops (and about 150 conflicts) with - if () single statement; | ||
67 | //statementList(A) ::= statement(C). { A = collectStatements(compiler, NULL, C); } | 67 | //statementList(A) ::= statement(C). { A = collectStatements(compiler, NULL, C); } |
68 | statementList(A) ::= . { A = collectStatements(compiler, NULL, NULL); } | 68 | statementList(A) ::= . { A = collectStatements(compiler, NULL, NULL); } |
69 | 69 | ||
@@ -72,10 +72,11 @@ statementList(A) ::= . { A = collectStatements(compiler, NULL, NULL); } | |||
72 | statement(A) ::= LSL_DO(F) block(B) LSL_WHILE(W) LSL_PARENTHESIS_OPEN(L) expr(E) LSL_PARENTHESIS_CLOSE(R) LSL_STATEMENT(S). { A = addStatement(compiler, S, F->toKen->type, L, E, R, B, W); } | 72 | statement(A) ::= LSL_DO(F) block(B) LSL_WHILE(W) LSL_PARENTHESIS_OPEN(L) expr(E) LSL_PARENTHESIS_CLOSE(R) LSL_STATEMENT(S). { A = addStatement(compiler, S, F->toKen->type, L, E, R, B, W); } |
73 | statement(A) ::= LSL_FOR(F) LSL_PARENTHESIS_OPEN(L) expr(E0) LSL_STATEMENT(S0) expr(E1) LSL_STATEMENT(S1) expr(E2) LSL_PARENTHESIS_CLOSE(R) block(B). { A = addStatement(compiler, NULL, F->toKen->type, L, E1, R, B, NULL); } // three expressions, two semi colons | 73 | statement(A) ::= LSL_FOR(F) LSL_PARENTHESIS_OPEN(L) expr(E0) LSL_STATEMENT(S0) expr(E1) LSL_STATEMENT(S1) expr(E2) LSL_PARENTHESIS_CLOSE(R) block(B). { A = addStatement(compiler, NULL, F->toKen->type, L, E1, R, B, NULL); } // three expressions, two semi colons |
74 | 74 | ||
75 | ifBlock ::= ifBlock LSL_ELSE block. | 75 | statement(A) ::= ifBlock(B). { A = B; } |
76 | ifBlock ::= block. | 76 | //ifBlock ::= ifBlock LSL_ELSE block. |
77 | // The [LSL_ELSE] part causes a conflict. | 77 | statement ::= LSL_ELSE block. |
78 | statement(A) ::= LSL_IF(F) LSL_PARENTHESIS_OPEN(L) expr(E) LSL_PARENTHESIS_CLOSE(R) ifBlock(B). [LSL_ELSE] { A = addStatement(compiler, NULL, F->token->type, L, E, R, B, NULL); } // optional else, optional else if | 78 | ifBlock(A) ::= LSL_IF(F) LSL_PARENTHESIS_OPEN(L) expr(E) LSL_PARENTHESIS_CLOSE(R) block(B). /*[LSL_ELSE]*/ { A = addStatement(compiler, NULL, F->toKen->type, L, E, R, B, NULL); } // optional else, optional else if |
79 | ifBlock(A) ::= LSL_IF(F) LSL_PARENTHESIS_OPEN(L) expr(E) LSL_PARENTHESIS_CLOSE(R) statement(S). /*[LSL_ELSE]*/ { A = addStatement(compiler, S, F->toKen->type, L, E, R, NULL, NULL); } // optional else, optional else if | ||
79 | 80 | ||
80 | statement(A) ::= LSL_JUMP(F) LSL_IDENTIFIER(I) LSL_STATEMENT(S). { A = addStatement(compiler, S, F->toKen->type, NULL, NULL, NULL, NULL, I); } | 81 | statement(A) ::= LSL_JUMP(F) LSL_IDENTIFIER(I) LSL_STATEMENT(S). { A = addStatement(compiler, S, F->toKen->type, NULL, NULL, NULL, NULL, I); } |
81 | statement(A) ::= LSL_RETURN(F) expr(E) LSL_STATEMENT(S). { A = addStatement(compiler, S, F->toKen->type, NULL, E, NULL, NULL, NULL); } | 82 | statement(A) ::= LSL_RETURN(F) expr(E) LSL_STATEMENT(S). { A = addStatement(compiler, S, F->toKen->type, NULL, E, NULL, NULL, NULL); } |