diff options
-rw-r--r-- | LuaSL/src/LuaSL_LSL_tree.h | 19 | ||||
-rw-r--r-- | LuaSL/src/LuaSL_compile.c | 30 | ||||
-rw-r--r-- | LuaSL/src/LuaSL_lemon_yaccer.y | 4 |
3 files changed, 23 insertions, 30 deletions
diff --git a/LuaSL/src/LuaSL_LSL_tree.h b/LuaSL/src/LuaSL_LSL_tree.h index fd9c65a..2674542 100644 --- a/LuaSL/src/LuaSL_LSL_tree.h +++ b/LuaSL/src/LuaSL_LSL_tree.h | |||
@@ -223,9 +223,9 @@ struct _LSL_Statement | |||
223 | struct _LSL_Block | 223 | struct _LSL_Block |
224 | { | 224 | { |
225 | LSL_Block *outerBlock; | 225 | LSL_Block *outerBlock; |
226 | LSL_Statement **statements; | 226 | // Eina_Hash *statements; // Probably should be some sort of eina list. |
227 | LSL_Identifier **variables; // Those variables in this scope. | 227 | Eina_Hash *variables; // Those variables in this scope. |
228 | int scount, vcount; | 228 | int scount; |
229 | }; | 229 | }; |
230 | 230 | ||
231 | struct _LSL_Function | 231 | struct _LSL_Function |
@@ -240,16 +240,15 @@ struct _LSL_State | |||
240 | { | 240 | { |
241 | const char *name; | 241 | const char *name; |
242 | LSL_Leaf *block; | 242 | LSL_Leaf *block; |
243 | LSL_Function **handlers; | 243 | Eina_Hash *handlers; |
244 | }; | 244 | }; |
245 | 245 | ||
246 | struct _LSL_Script | 246 | struct _LSL_Script |
247 | { | 247 | { |
248 | const char *name; | 248 | const char *name; |
249 | LSL_Function **functions; | 249 | Eina_Hash *functions; |
250 | LSL_State **states; | 250 | Eina_Hash *states; |
251 | LSL_Identifier **variables; | 251 | Eina_Hash *variables; |
252 | int fcount, scount, vcount; | ||
253 | }; | 252 | }; |
254 | 253 | ||
255 | // Define the type for flex and lemon. | 254 | // Define the type for flex and lemon. |
@@ -277,8 +276,8 @@ typedef struct | |||
277 | #endif | 276 | #endif |
278 | 277 | ||
279 | 278 | ||
280 | void burnLeaf(LSL_Leaf *leaf); | 279 | void burnLeaf(void *data); |
281 | LSL_Leaf *addFunction(LSL_Leaf *type, LSL_Leaf *identifier, LSL_Leaf *open, LSL_Leaf *params, LSL_Leaf *close, LSL_Leaf *block); | 280 | LSL_Leaf *addFunction(LuaSL_compiler *compiler, LSL_Leaf *type, LSL_Leaf *identifier, LSL_Leaf *open, LSL_Leaf *params, LSL_Leaf *close, LSL_Leaf *block); |
282 | LSL_Leaf *addOperation(LuaSL_compiler *compiler, LSL_Leaf *left, LSL_Leaf *lval, LSL_Leaf *right); | 281 | LSL_Leaf *addOperation(LuaSL_compiler *compiler, LSL_Leaf *left, LSL_Leaf *lval, LSL_Leaf *right); |
283 | LSL_Leaf *addParameter(LSL_Leaf *type, LSL_Leaf *newParam); | 282 | LSL_Leaf *addParameter(LSL_Leaf *type, LSL_Leaf *newParam); |
284 | LSL_Leaf *addParenthesis(LSL_Leaf *lval, LSL_Leaf *expr, LSL_Type type, LSL_Leaf *rval); | 283 | LSL_Leaf *addParenthesis(LSL_Leaf *lval, LSL_Leaf *expr, LSL_Type type, LSL_Leaf *rval); |
diff --git a/LuaSL/src/LuaSL_compile.c b/LuaSL/src/LuaSL_compile.c index 277e278..445014e 100644 --- a/LuaSL/src/LuaSL_compile.c +++ b/LuaSL/src/LuaSL_compile.c | |||
@@ -196,8 +196,9 @@ static LSL_Leaf *newLeaf(LSL_Type type, LSL_Leaf *left, LSL_Leaf *right) | |||
196 | return leaf; | 196 | return leaf; |
197 | } | 197 | } |
198 | 198 | ||
199 | void burnLeaf(LSL_Leaf *leaf) | 199 | void burnLeaf(void *data) |
200 | { | 200 | { |
201 | LSL_Leaf *leaf = data; | ||
201 | if (leaf) | 202 | if (leaf) |
202 | { | 203 | { |
203 | burnLeaf(leaf->left); | 204 | burnLeaf(leaf->left); |
@@ -326,7 +327,7 @@ LSL_Leaf *collectParameters(LSL_Leaf *list, LSL_Leaf *comma, LSL_Leaf *newParam) | |||
326 | return newList; | 327 | return newList; |
327 | } | 328 | } |
328 | 329 | ||
329 | LSL_Leaf *addFunction(LSL_Leaf *type, LSL_Leaf *identifier, LSL_Leaf *open, LSL_Leaf *params, LSL_Leaf *close, LSL_Leaf *block) | 330 | LSL_Leaf *addFunction(LuaSL_compiler *compiler, LSL_Leaf *type, LSL_Leaf *identifier, LSL_Leaf *open, LSL_Leaf *params, LSL_Leaf *close, LSL_Leaf *block) |
330 | { | 331 | { |
331 | LSL_Function *func = calloc(1, sizeof(LSL_Function)); | 332 | LSL_Function *func = calloc(1, sizeof(LSL_Function)); |
332 | 333 | ||
@@ -334,11 +335,9 @@ LSL_Leaf *addFunction(LSL_Leaf *type, LSL_Leaf *identifier, LSL_Leaf *open, LSL_ | |||
334 | { | 335 | { |
335 | if (identifier) | 336 | if (identifier) |
336 | { | 337 | { |
337 | const char *temp = identifier->value.stringValue; | 338 | func->name = identifier->value.stringValue; |
338 | |||
339 | identifier->token = tokens[LSL_FUNCTION - lowestToken]; | 339 | identifier->token = tokens[LSL_FUNCTION - lowestToken]; |
340 | identifier->value.functionValue = func; | 340 | identifier->value.functionValue = func; |
341 | identifier->value.functionValue->name = temp; | ||
342 | identifier->value.functionValue->block = block; | 341 | identifier->value.functionValue->block = block; |
343 | func->type = type; | 342 | func->type = type; |
344 | if (type) | 343 | if (type) |
@@ -346,6 +345,7 @@ LSL_Leaf *addFunction(LSL_Leaf *type, LSL_Leaf *identifier, LSL_Leaf *open, LSL_ | |||
346 | else | 345 | else |
347 | identifier->basicType = OT_nothing; | 346 | identifier->basicType = OT_nothing; |
348 | func->params = addParenthesis(open, params, LSL_PARAMETER_LIST, close); | 347 | func->params = addParenthesis(open, params, LSL_PARAMETER_LIST, close); |
348 | eina_hash_add(compiler->script.functions, func->name, identifier); | ||
349 | } | 349 | } |
350 | } | 350 | } |
351 | return identifier; | 351 | return identifier; |
@@ -380,9 +380,7 @@ LSL_Leaf *addState(LuaSL_compiler *compiler, LSL_Leaf *identifier, LSL_Leaf *blo | |||
380 | result->name = identifier->value.stringValue; | 380 | result->name = identifier->value.stringValue; |
381 | result->block = block; | 381 | result->block = block; |
382 | identifier->value.stateValue = result; | 382 | identifier->value.stateValue = result; |
383 | compiler->script.scount++; | 383 | eina_hash_add(compiler->script.states, result->name, identifier); |
384 | compiler->script.states = realloc(compiler->script.states, compiler->script.scount * sizeof(LSL_State *)); | ||
385 | compiler->script.states[compiler->script.scount - 1] = result; | ||
386 | } | 384 | } |
387 | 385 | ||
388 | return identifier; | 386 | return identifier; |
@@ -446,17 +444,9 @@ LSL_Leaf *addVariable(LuaSL_compiler *compiler, LSL_Leaf *type, LSL_Leaf *identi | |||
446 | result->value.basicType = type->basicType; | 444 | result->value.basicType = type->basicType; |
447 | } | 445 | } |
448 | if (compiler->currentBlock) | 446 | if (compiler->currentBlock) |
449 | { | 447 | eina_hash_add(compiler->currentBlock->variables, result->name, identifier); |
450 | // compiler->currentBlock->vcount++; | ||
451 | // compiler->currentBlock->variables = realloc(compiler->currentBlock->variables, compiler->currentBlock->vcount * sizeof(LSL_Identifier *)); | ||
452 | // compiler->currentBlock->variables[compiler->currentBlock->vcount - 1] = result; | ||
453 | } | ||
454 | else | 448 | else |
455 | { | 449 | eina_hash_add(compiler->script.variables, result->name, identifier); |
456 | compiler->script.vcount++; | ||
457 | compiler->script.variables = realloc(compiler->script.variables, compiler->script.vcount * sizeof(LSL_Identifier *)); | ||
458 | compiler->script.variables[compiler->script.vcount - 1] = result; | ||
459 | } | ||
460 | } | 450 | } |
461 | 451 | ||
462 | return identifier; | 452 | return identifier; |
@@ -468,6 +458,7 @@ void beginBlock(LuaSL_compiler *compiler, LSL_Leaf *block) | |||
468 | 458 | ||
469 | if (blok) | 459 | if (blok) |
470 | { | 460 | { |
461 | blok->variables = eina_hash_string_superfast_new(burnLeaf); | ||
471 | block->value.blockValue = blok; | 462 | block->value.blockValue = blok; |
472 | blok->outerBlock = compiler->currentBlock; | 463 | blok->outerBlock = compiler->currentBlock; |
473 | compiler->currentBlock = blok; | 464 | compiler->currentBlock = blok; |
@@ -947,6 +938,9 @@ Eina_Bool compileLSL(gameGlobals *game, char *script) | |||
947 | 938 | ||
948 | memset(&compiler, 0, sizeof(LuaSL_compiler)); | 939 | memset(&compiler, 0, sizeof(LuaSL_compiler)); |
949 | compiler.game = game; | 940 | compiler.game = game; |
941 | compiler.script.functions = eina_hash_string_superfast_new(burnLeaf); | ||
942 | compiler.script.states = eina_hash_string_superfast_new(burnLeaf); | ||
943 | compiler.script.variables = eina_hash_string_superfast_new(burnLeaf); | ||
950 | compiler.ignorableText = eina_strbuf_new(); | 944 | compiler.ignorableText = eina_strbuf_new(); |
951 | 945 | ||
952 | strncpy(compiler.fileName, script, PATH_MAX - 1); | 946 | strncpy(compiler.fileName, script, PATH_MAX - 1); |
diff --git a/LuaSL/src/LuaSL_lemon_yaccer.y b/LuaSL/src/LuaSL_lemon_yaccer.y index e62776b..e163991 100644 --- a/LuaSL/src/LuaSL_lemon_yaccer.y +++ b/LuaSL/src/LuaSL_lemon_yaccer.y | |||
@@ -45,8 +45,8 @@ parameterList(A) ::= parameter(D). { A = collectParameters(NULL, NULL, D); | |||
45 | parameterList(A) ::= . { A = collectParameters(NULL, NULL, NULL); } | 45 | parameterList(A) ::= . { A = collectParameters(NULL, NULL, NULL); } |
46 | parameter(A) ::= type(B) LSL_IDENTIFIER(C). { A = addParameter(B, C); } | 46 | parameter(A) ::= type(B) LSL_IDENTIFIER(C). { A = addParameter(B, C); } |
47 | // Causes a conflict when it's an empty parameterList with calling the same type of function. | 47 | // Causes a conflict when it's an empty parameterList with calling the same type of function. |
48 | function(A) ::= LSL_IDENTIFIER(C) LSL_PARENTHESIS_OPEN(D) parameterList(E) LSL_PARENTHESIS_CLOSE(F) funcBlock(G). { A = addFunction(NULL, C, D, E, F, G); } | 48 | function(A) ::= LSL_IDENTIFIER(C) LSL_PARENTHESIS_OPEN(D) parameterList(E) LSL_PARENTHESIS_CLOSE(F) funcBlock(G). { A = addFunction(compiler, NULL, C, D, E, F, G); } |
49 | function(A) ::= type(B) LSL_IDENTIFIER(C) LSL_PARENTHESIS_OPEN(D) parameterList(E) LSL_PARENTHESIS_CLOSE(F) funcBlock(G). { A = addFunction(B, C, D, E, F, G); } | 49 | function(A) ::= type(B) LSL_IDENTIFIER(C) LSL_PARENTHESIS_OPEN(D) parameterList(E) LSL_PARENTHESIS_CLOSE(F) funcBlock(G). { A = addFunction(compiler, B, C, D, E, F, G); } |
50 | 50 | ||
51 | // Blocks. | 51 | // Blocks. |
52 | 52 | ||