aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/LuaSL
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--LuaSL/src/LuaSL_compile.c14
-rw-r--r--LuaSL/src/LuaSL_lemon_yaccer.y15
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
1395static void outputStatementToken(FILE *file, outputMode mode, LSL_Leaf *content) 1397static 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.
41functionList(A) ::= functionList(B) functionBody(C). { A = collectStatements(compiler, B, C); } 41functionList(A) ::= functionList(B) functionBody(C). { A = collectStatements(compiler, B, C); }
42//functionList(A) ::= functionBody(C). { A = collectStatements(compiler, NULL, C); } 42functionList(A) ::= functionBody(C). { A = collectStatements(compiler, NULL, C); }
43functionList(A) ::= . { A = collectStatements(compiler, NULL, NULL); } 43functionList(A) ::= . { A = collectStatements(compiler, NULL, NULL); }
44 44
45functionBody(A) ::= function(F) funcBlock(B). { A = addFunctionBody(compiler, F, B); } // addFunctionBody has an implied addStatement(compiler, NULL, LSL_FUNCTION, NULL, B, NULL, NULL); 45functionBody(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
57block(A) ::= funcBlock(B). { A = B; } 57block(A) ::= funcBlock(B). { A = B; }
58block(A) ::= statement(B). { A = B; } 58block(A) ::= statementList(B). { A = B; }
59funcBlock(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.
61funcBlock(A) ::= beginBlock(L) statementList(B) LSL_BLOCK_CLOSE(R). { A = addBlock(compiler, L, B, R); } 60funcBlock(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.
66statementList(A) ::= statementList(B) statement(C). { A = collectStatements(compiler, B, C); } 65statementList(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); }
68statementList(A) ::= . { A = collectStatements(compiler, NULL, NULL); } 68statementList(A) ::= . { A = collectStatements(compiler, NULL, NULL); }
69 69
@@ -72,10 +72,11 @@ statementList(A) ::= . { A = collectStatements(compiler, NULL, NULL); }
72statement(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); } 72statement(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); }
73statement(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 73statement(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
75ifBlock ::= ifBlock LSL_ELSE block. 75statement(A) ::= ifBlock(B). { A = B; }
76ifBlock ::= block. 76//ifBlock ::= ifBlock LSL_ELSE block.
77// The [LSL_ELSE] part causes a conflict. 77statement ::= LSL_ELSE block.
78statement(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 78ifBlock(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
79ifBlock(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
80statement(A) ::= LSL_JUMP(F) LSL_IDENTIFIER(I) LSL_STATEMENT(S). { A = addStatement(compiler, S, F->toKen->type, NULL, NULL, NULL, NULL, I); } 81statement(A) ::= LSL_JUMP(F) LSL_IDENTIFIER(I) LSL_STATEMENT(S). { A = addStatement(compiler, S, F->toKen->type, NULL, NULL, NULL, NULL, I); }
81statement(A) ::= LSL_RETURN(F) expr(E) LSL_STATEMENT(S). { A = addStatement(compiler, S, F->toKen->type, NULL, E, NULL, NULL, NULL); } 82statement(A) ::= LSL_RETURN(F) expr(E) LSL_STATEMENT(S). { A = addStatement(compiler, S, F->toKen->type, NULL, E, NULL, NULL, NULL); }