From d3356bf6e8eeadd3afbd9db2e59621d50dbefb63 Mon Sep 17 00:00:00 2001 From: David Walter Seikel Date: Tue, 17 Jan 2012 10:47:26 +1000 Subject: Actually make state work. lol --- LuaSL/src/LuaSL_LSL_tree.c | 24 +++++++++++++++++++----- LuaSL/src/LuaSL_LSL_tree.h | 4 ++-- LuaSL/src/LuaSL_lemon_yaccer.y | 4 ++-- 3 files changed, 23 insertions(+), 9 deletions(-) (limited to 'LuaSL') diff --git a/LuaSL/src/LuaSL_LSL_tree.c b/LuaSL/src/LuaSL_LSL_tree.c index e37f794..af6e02f 100644 --- a/LuaSL/src/LuaSL_LSL_tree.c +++ b/LuaSL/src/LuaSL_LSL_tree.c @@ -15,6 +15,7 @@ static void outputIntegerToken(FILE *file, LSL_Leaf *content); static void outputParameterToken(FILE *file, LSL_Leaf *content); static void outputParameterListToken(FILE *file, LSL_Leaf *content); static void outputParenthesisToken(FILE *file, LSL_Leaf *content); +static void outputStateToken(FILE *file, LSL_Leaf *content); static void outputStatementToken(FILE *file, LSL_Leaf *content); static void outputVariableToken(FILE *file, LSL_Leaf *content); @@ -119,7 +120,7 @@ LSL_Token LSL_Tokens[] = {LSL_PARAMETER, ST_NONE, "parameter", LSL_NONE, outputParameterToken, NULL, NULL}, {LSL_PARAMETER_LIST, ST_NONE, "plist", LSL_NONE, outputParameterListToken, NULL, NULL}, {LSL_FUNCTION, ST_NONE, "function", LSL_NONE, outputFunctionToken, NULL, NULL}, - {LSL_STATE, ST_NONE, "state", LSL_NONE, NULL, NULL, NULL}, + {LSL_STATE, ST_NONE, "state", LSL_NONE, outputStateToken, NULL, NULL}, {LSL_SCRIPT, ST_NONE, "", LSL_NONE, NULL, NULL, NULL}, {LSL_UNKNOWN, ST_NONE, "unknown", LSL_NONE, NULL, NULL, NULL}, @@ -362,19 +363,21 @@ LSL_Leaf *addParenthesis(LSL_Leaf *lval, LSL_Leaf *expr, LSL_Type type, LSL_Leaf return lval; } -LSL_Leaf *addState(LuaSL_yyparseParam *param, char *name, LSL_Leaf *state) +LSL_Leaf *addState(LuaSL_yyparseParam *param, LSL_Leaf *identifier, LSL_Leaf *block) { LSL_State *result = calloc(1, sizeof(LSL_State)); - if (result) + if ((identifier) && (result)) { - result->name = name; + result->name = identifier->value.stringValue; + result->block = block; + identifier->value.stateValue = result; param->script.scount++; param->script.states = realloc(param->script.states, param->script.scount * sizeof(LSL_State *)); param->script.states[param->script.scount - 1] = result; } - return state; + return identifier; } LSL_Leaf *addStatement(LSL_Leaf *lval, LSL_Type type, LSL_Leaf *expr) @@ -829,6 +832,17 @@ static void outputParenthesisToken(FILE *file, LSL_Leaf *content) } } +static void outputStateToken(FILE *file, LSL_Leaf *content) +{ + if (content) + { + LSL_State *state = content->value.stateValue; + + fprintf(file, "%s", state->name); + outputLeaf(file, state->block); + } +} + static void outputStatementToken(FILE *file, LSL_Leaf *content) { if (content) diff --git a/LuaSL/src/LuaSL_LSL_tree.h b/LuaSL/src/LuaSL_LSL_tree.h index 4113454..e9fddb7 100644 --- a/LuaSL/src/LuaSL_LSL_tree.h +++ b/LuaSL/src/LuaSL_LSL_tree.h @@ -254,6 +254,7 @@ struct _LSL_Function struct _LSL_State { char *name; + LSL_Leaf *block; LSL_Function **handlers; }; @@ -282,7 +283,6 @@ typedef struct LSL_Leaf *lval; int column, line; LSL_Block *currentBlock; - LSL_Leaf *currentFunction; } LuaSL_yyparseParam; @@ -296,7 +296,7 @@ LSL_Leaf *addFunction(LuaSL_yyparseParam *param, LSL_Leaf *type, LSL_Leaf *ident LSL_Leaf *addOperation(LSL_Leaf *left, LSL_Leaf *lval, LSL_Leaf *right); LSL_Leaf *addParameter(LuaSL_yyparseParam *param, LSL_Leaf *type, LSL_Leaf *newParam); LSL_Leaf *addParenthesis(LSL_Leaf *lval, LSL_Leaf *expr, LSL_Type type, LSL_Leaf *rval); -LSL_Leaf *addState(LuaSL_yyparseParam *param, char *name, LSL_Leaf *state); +LSL_Leaf *addState(LuaSL_yyparseParam *param, LSL_Leaf *identifier, LSL_Leaf *block); LSL_Leaf *addStatement(LSL_Leaf *lval, LSL_Type type, LSL_Leaf *expr); LSL_Leaf *addTypecast(LSL_Leaf *lval, LSL_Leaf *type, LSL_Leaf *rval, LSL_Leaf *expr); LSL_Leaf *addVariable(LuaSL_yyparseParam *param, LSL_Leaf *type, LSL_Leaf *identifier, LSL_Leaf *assignment, LSL_Leaf *expr); diff --git a/LuaSL/src/LuaSL_lemon_yaccer.y b/LuaSL/src/LuaSL_lemon_yaccer.y index f79c228..f90b236 100644 --- a/LuaSL/src/LuaSL_lemon_yaccer.y +++ b/LuaSL/src/LuaSL_lemon_yaccer.y @@ -23,7 +23,7 @@ program ::= script LSL_SCRIPT(A). { if (NULL != A) A->left = param->ast; p // Basic script structure. %nonassoc LSL_SCRIPT. -script ::= script state. +script ::= script state(A). { if (NULL != A) A->left = param->ast; param->ast = A; } script ::= script function(A). { if (NULL != A) A->left = param->ast; param->ast = A; } script ::= script statement(A). { if (NULL != A) A->left = param->ast; param->ast = A; } script ::= . @@ -32,7 +32,7 @@ script ::= . %nonassoc LSL_BLOCK_OPEN LSL_BLOCK_CLOSE LSL_STATE. stateBlock ::= LSL_BLOCK_OPEN functionList LSL_BLOCK_CLOSE. -state(S) ::= LSL_IDENTIFIER(I) stateBlock(B). { S = addState(param, I->value.stringValue, B); } +state(S) ::= LSL_IDENTIFIER(I) stateBlock(B). { S = addState(param, I, B); } // Function definitions. -- cgit v1.1