aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/LuaSL/src/LuaSL_LSL_tree.c
diff options
context:
space:
mode:
authorDavid Walter Seikel2012-01-10 02:47:49 +1000
committerDavid Walter Seikel2012-01-10 02:47:49 +1000
commit21ae463bfa5ff2398734605fb04fb8d585ee879f (patch)
treea04724543034085aaa0c2ae4f561313e2d2ca436 /LuaSL/src/LuaSL_LSL_tree.c
parentAlmost got white space and comments working. Still a bug left somewhere, I t... (diff)
downloadSledjHamr-21ae463bfa5ff2398734605fb04fb8d585ee879f.zip
SledjHamr-21ae463bfa5ff2398734605fb04fb8d585ee879f.tar.gz
SledjHamr-21ae463bfa5ff2398734605fb04fb8d585ee879f.tar.bz2
SledjHamr-21ae463bfa5ff2398734605fb04fb8d585ee879f.tar.xz
Move more things into the LSL_Leaf structure, and some clean up related to that.
Diffstat (limited to 'LuaSL/src/LuaSL_LSL_tree.c')
-rw-r--r--LuaSL/src/LuaSL_LSL_tree.c140
1 files changed, 69 insertions, 71 deletions
diff --git a/LuaSL/src/LuaSL_LSL_tree.c b/LuaSL/src/LuaSL_LSL_tree.c
index ff7da8b..016dbc9 100644
--- a/LuaSL/src/LuaSL_LSL_tree.c
+++ b/LuaSL/src/LuaSL_LSL_tree.c
@@ -3,10 +3,10 @@
3#include <stdlib.h> 3#include <stdlib.h>
4#include <stdio.h> 4#include <stdio.h>
5 5
6static void evaluateIntegerToken(LSL_Leaf *content, LSL_Value *left, LSL_Value *right); 6static void evaluateIntegerToken(LSL_Leaf *content, LSL_Leaf *left, LSL_Leaf *right);
7static void evaluateNoToken(LSL_Leaf *content, LSL_Value *left, LSL_Value *right); 7static void evaluateNoToken(LSL_Leaf *content, LSL_Leaf *left, LSL_Leaf *right);
8static void evaluateOperationToken(LSL_Leaf *content, LSL_Value *left, LSL_Value *right); 8static void evaluateOperationToken(LSL_Leaf *content, LSL_Leaf *left, LSL_Leaf *right);
9static void evaluateStatementToken(LSL_Leaf *content, LSL_Value *left, LSL_Value *right); 9static void evaluateStatementToken(LSL_Leaf *content, LSL_Leaf *left, LSL_Leaf *right);
10static void outputIntegerToken(LSL_Leaf *content); 10static void outputIntegerToken(LSL_Leaf *content);
11static void outputOperationToken(LSL_Leaf *content); 11static void outputOperationToken(LSL_Leaf *content);
12static void outputStatementToken(LSL_Leaf *content); 12static void outputStatementToken(LSL_Leaf *content);
@@ -14,8 +14,8 @@ static void outputSpaceToken(LSL_Leaf *content);
14 14
15LSL_Token LSL_Tokens[] = 15LSL_Token LSL_Tokens[] =
16{ 16{
17// {LSL_COMMENT, "/*", LSL_NONE, NULL, NULL, NULL}, 17 {LSL_COMMENT, "/*", LSL_NONE, NULL, NULL, NULL},
18// {LSL_COMMENT_LINE, "//", LSL_NONE, NULL, NULL, NULL}, 18 {LSL_COMMENT_LINE, "//", LSL_NONE, NULL, NULL, NULL},
19 {LSL_SPACE, " ", LSL_NONE, outputSpaceToken, NULL, NULL}, 19 {LSL_SPACE, " ", LSL_NONE, outputSpaceToken, NULL, NULL},
20 20
21 // Operators, in order of precedence, low to high 21 // Operators, in order of precedence, low to high
@@ -95,7 +95,7 @@ LSL_Token LSL_Tokens[] =
95 95
96 // Then the rest of the syntax tokens. 96 // Then the rest of the syntax tokens.
97 97
98// {LSL_IDENTIFIER, "identifier", LSL_NONE, NULL, NULL, NULL}, 98 {LSL_IDENTIFIER, "identifier", LSL_NONE, NULL, NULL, NULL},
99 99
100 {LSL_LABEL, "@", LSL_NONE, NULL, NULL, NULL}, 100 {LSL_LABEL, "@", LSL_NONE, NULL, NULL, NULL},
101 101
@@ -117,7 +117,7 @@ LSL_Token LSL_Tokens[] =
117// {LSL_STATE, "state", LSL_NONE, NULL, NULL, NULL}, 117// {LSL_STATE, "state", LSL_NONE, NULL, NULL, NULL},
118// {LSL_SCRIPT, "script", LSL_NONE, NULL, NULL, NULL}, 118// {LSL_SCRIPT, "script", LSL_NONE, NULL, NULL, NULL},
119 119
120// {LSL_UNKNOWN, "unknown", LSL_NONE, NULL, NULL, NULL}, 120 {LSL_UNKNOWN, "unknown", LSL_NONE, NULL, NULL, NULL},
121 121
122 // A sentinal. 122 // A sentinal.
123 123
@@ -136,9 +136,7 @@ static LSL_AST *newAST(LSL_Type type, LSL_AST *left, LSL_AST *right)
136 136
137 ast->left = left; 137 ast->left = left;
138 ast->right = right; 138 ast->right = right;
139 ast->line = -1; 139 ast->content.token = tokens[type - lowestToken];
140 ast->character = -1;
141 ast->token = tokens[type - lowestToken];
142 140
143 return ast; 141 return ast;
144} 142}
@@ -224,8 +222,7 @@ LSL_Statement *createStatement(LSL_Type type, LSL_AST *expr)
224 222
225 if (stat == NULL) return NULL; 223 if (stat == NULL) return NULL;
226 224
227 stat->type = type; 225 stat->expressions = expr;
228 stat->expression = expr;
229 226
230 return stat; 227 return stat;
231} 228}
@@ -240,21 +237,21 @@ LSL_AST *addStatement(LSL_Statement *statement, LSL_AST *root)
240 return checkAndAddIgnorable(ast); 237 return checkAndAddIgnorable(ast);
241} 238}
242 239
243static void evaluateAST(LSL_AST *ast, LSL_Value *left, LSL_Value *right) 240static void evaluateAST(LSL_AST *ast, LSL_Leaf *left, LSL_Leaf *right)
244{ 241{
245 if (ast) 242 if (ast)
246 { 243 {
247 LSL_Value lresult; 244 LSL_Leaf lresult;
248 LSL_Value rresult; 245 LSL_Leaf rresult;
249 246
250 memcpy(&lresult, left, sizeof(LSL_Value)); 247 memcpy(&lresult, left, sizeof(LSL_Leaf));
251 memcpy(&rresult, right, sizeof(LSL_Value)); 248 memcpy(&rresult, right, sizeof(LSL_Leaf));
252 249
253 if (LSL_RIGHT2LEFT & ast->token->flags) 250 if (LSL_RIGHT2LEFT & ast->content.token->flags)
254 { 251 {
255 memcpy(&rresult, left, sizeof(LSL_Value)); 252 memcpy(&rresult, left, sizeof(LSL_Leaf));
256 evaluateAST(ast->right, &rresult, right); 253 evaluateAST(ast->right, &rresult, right);
257 if (!(LSL_UNARY & ast->token->flags)) 254 if (!(LSL_UNARY & ast->content.token->flags))
258 { 255 {
259 evaluateAST(ast->left, &lresult, right); 256 evaluateAST(ast->left, &lresult, right);
260 } 257 }
@@ -262,50 +259,51 @@ static void evaluateAST(LSL_AST *ast, LSL_Value *left, LSL_Value *right)
262 else // Assume left to right. 259 else // Assume left to right.
263 { 260 {
264 evaluateAST(ast->left, &lresult, right); 261 evaluateAST(ast->left, &lresult, right);
265 if (!(LSL_UNARY & ast->token->flags)) 262 if (!(LSL_UNARY & ast->content.token->flags))
266 { 263 {
267 memcpy(&rresult, left, sizeof(LSL_Value)); 264 memcpy(&rresult, left, sizeof(LSL_Leaf));
268 evaluateAST(ast->right, &rresult, right); 265 evaluateAST(ast->right, &rresult, right);
269 } 266 }
270 } 267 }
271 268
272 if (ast->token->evaluate) 269 if (ast->content.token->evaluate)
273 { 270 {
274 ast->token->evaluate(&(ast->content), &lresult, &rresult); 271 ast->content.token->evaluate(&(ast->content), &lresult, &rresult);
275 memcpy(left, &lresult, sizeof(LSL_Value)); 272 memcpy(left, &lresult, sizeof(LSL_Leaf));
276 } 273 }
277 else 274 else
278 { 275 {
279#ifdef LUASL_DEBUG 276#ifdef LUASL_DEBUG
280 printf(" eval <%s %d %d %d %d> ", ast->token->token, left->content.value.integerValue, right->content.value.integerValue, lresult.content.value.integerValue, rresult.content.value.integerValue); 277 printf(" eval <%s %d %d %d %d> ", ast->content.token->token, left->value.integerValue, right->value.integerValue, lresult.value.integerValue, rresult.value.integerValue);
281#endif 278#endif
282 memcpy(left, &rresult, sizeof(LSL_Value)); 279 memcpy(left, &rresult, sizeof(LSL_Leaf));
283 } 280 }
284 } 281 }
285} 282}
286 283
287static void evaluateIntegerToken(LSL_Leaf *content, LSL_Value *left, LSL_Value *right) 284static void evaluateIntegerToken(LSL_Leaf *content, LSL_Leaf *left, LSL_Leaf *right)
288{ 285{
289 if (content) 286 if (content)
290 { 287 {
291#ifdef LUASL_DEBUG 288#ifdef LUASL_DEBUG
292 printf(" <%d> ", content->value.integerValue); 289 printf(" <%d> ", content->value.integerValue);
293#endif 290#endif
294 left->content.value.integerValue = content->value.integerValue; 291 left->value.integerValue = content->value.integerValue;
295 left->type = LSL_INTEGER; 292 left->type = LSL_INTEGER;
296 } 293 }
297} 294}
298 295
299static void evaluateNoToken(LSL_Leaf *content, LSL_Value *left, LSL_Value *right) 296static void evaluateNoToken(LSL_Leaf *content, LSL_Leaf *left, LSL_Leaf *right)
300{ 297{
298 // Do nothing, that's the point.
301} 299}
302 300
303static void evaluateOperationToken(LSL_Leaf *content, LSL_Value *left, LSL_Value *right) 301static void evaluateOperationToken(LSL_Leaf *content, LSL_Leaf *left, LSL_Leaf *right)
304{ 302{
305 if ((content) && (content->value.operationValue)) 303 if ((content) && (content->value.operationValue))
306 { 304 {
307#ifdef LUASL_DEBUG 305#ifdef LUASL_DEBUG
308 printf(" [%s] ", tokens[content->value.operationValue - lowestToken]->token); 306 printf(" [%s] ", content->token->token);
309#endif 307#endif
310 308
311 switch (content->value.operationValue) 309 switch (content->value.operationValue)
@@ -332,41 +330,41 @@ static void evaluateOperationToken(LSL_Leaf *content, LSL_Value *left, LSL_Value
332// case LSL_TYPECAST_OPEN : 330// case LSL_TYPECAST_OPEN :
333// case LSL_TYPECAST_CLOSE : 331// case LSL_TYPECAST_CLOSE :
334 break; 332 break;
335 case LSL_BIT_NOT : left->content.value.integerValue = ~ right->content.value.integerValue; break; 333 case LSL_BIT_NOT : left->value.integerValue = ~ right->value.integerValue; break;
336 case LSL_BOOL_NOT : left->content.value.integerValue = ! right->content.value.integerValue; break; 334 case LSL_BOOL_NOT : left->value.integerValue = ! right->value.integerValue; break;
337 case LSL_NEGATION : left->content.value.integerValue = 0 - right->content.value.integerValue; break; 335 case LSL_NEGATION : left->value.integerValue = 0 - right->value.integerValue; break;
338 case LSL_DIVIDE : left->content.value.integerValue = left->content.value.integerValue / right->content.value.integerValue; break; 336 case LSL_DIVIDE : left->value.integerValue = left->value.integerValue / right->value.integerValue; break;
339 case LSL_MODULO : left->content.value.integerValue = left->content.value.integerValue % right->content.value.integerValue; break; 337 case LSL_MODULO : left->value.integerValue = left->value.integerValue % right->value.integerValue; break;
340 case LSL_MULTIPLY : left->content.value.integerValue = left->content.value.integerValue * right->content.value.integerValue; break; 338 case LSL_MULTIPLY : left->value.integerValue = left->value.integerValue * right->value.integerValue; break;
341// case LSL_DOT_PRODUCT : break; 339// case LSL_DOT_PRODUCT : break;
342// case LSL_CROSS_PRODUCT : break; 340// case LSL_CROSS_PRODUCT : break;
343 case LSL_SUBTRACT : left->content.value.integerValue = left->content.value.integerValue - right->content.value.integerValue; break; 341 case LSL_SUBTRACT : left->value.integerValue = left->value.integerValue - right->value.integerValue; break;
344 case LSL_ADD : left->content.value.integerValue = left->content.value.integerValue + right->content.value.integerValue; break; 342 case LSL_ADD : left->value.integerValue = left->value.integerValue + right->value.integerValue; break;
345// case LSL_CONCATENATE : break; 343// case LSL_CONCATENATE : break;
346 case LSL_LEFT_SHIFT : left->content.value.integerValue = left->content.value.integerValue << right->content.value.integerValue; break; 344 case LSL_LEFT_SHIFT : left->value.integerValue = left->value.integerValue << right->value.integerValue; break;
347 case LSL_RIGHT_SHIFT : left->content.value.integerValue = left->content.value.integerValue >> right->content.value.integerValue; break; 345 case LSL_RIGHT_SHIFT : left->value.integerValue = left->value.integerValue >> right->value.integerValue; break;
348 case LSL_LESS_THAN : left->content.value.integerValue = left->content.value.integerValue < right->content.value.integerValue; break; 346 case LSL_LESS_THAN : left->value.integerValue = left->value.integerValue < right->value.integerValue; break;
349 case LSL_GREATER_THAN : left->content.value.integerValue = left->content.value.integerValue > right->content.value.integerValue; break; 347 case LSL_GREATER_THAN : left->value.integerValue = left->value.integerValue > right->value.integerValue; break;
350 case LSL_LESS_EQUAL : left->content.value.integerValue = left->content.value.integerValue <= right->content.value.integerValue; break; 348 case LSL_LESS_EQUAL : left->value.integerValue = left->value.integerValue <= right->value.integerValue; break;
351 case LSL_GREATER_EQUAL : left->content.value.integerValue = left->content.value.integerValue >= right->content.value.integerValue; break; 349 case LSL_GREATER_EQUAL : left->value.integerValue = left->value.integerValue >= right->value.integerValue; break;
352 case LSL_EQUAL : left->content.value.integerValue = left->content.value.integerValue == right->content.value.integerValue; break; 350 case LSL_EQUAL : left->value.integerValue = left->value.integerValue == right->value.integerValue; break;
353 case LSL_NOT_EQUAL : left->content.value.integerValue = left->content.value.integerValue != right->content.value.integerValue; break; 351 case LSL_NOT_EQUAL : left->value.integerValue = left->value.integerValue != right->value.integerValue; break;
354 case LSL_BIT_AND : left->content.value.integerValue = left->content.value.integerValue & right->content.value.integerValue; break; 352 case LSL_BIT_AND : left->value.integerValue = left->value.integerValue & right->value.integerValue; break;
355 case LSL_BIT_XOR : left->content.value.integerValue = left->content.value.integerValue ^ right->content.value.integerValue; break; 353 case LSL_BIT_XOR : left->value.integerValue = left->value.integerValue ^ right->value.integerValue; break;
356 case LSL_BIT_OR : left->content.value.integerValue = left->content.value.integerValue | right->content.value.integerValue; break; 354 case LSL_BIT_OR : left->value.integerValue = left->value.integerValue | right->value.integerValue; break;
357 case LSL_BOOL_OR : left->content.value.integerValue = left->content.value.integerValue || right->content.value.integerValue; break; 355 case LSL_BOOL_OR : left->value.integerValue = left->value.integerValue || right->value.integerValue; break;
358 case LSL_BOOL_AND : left->content.value.integerValue = left->content.value.integerValue && right->content.value.integerValue; break; 356 case LSL_BOOL_AND : left->value.integerValue = left->value.integerValue && right->value.integerValue; break;
359 } 357 }
360#ifdef LUASL_DEBUG 358#ifdef LUASL_DEBUG
361 printf(" (=%d) ", left->content.value.integerValue); 359 printf(" (=%d) ", left->value.integerValue);
362#endif 360#endif
363 } 361 }
364} 362}
365 363
366static void evaluateStatementToken(LSL_Leaf *content, LSL_Value *left, LSL_Value *right) 364static void evaluateStatementToken(LSL_Leaf *content, LSL_Leaf *left, LSL_Leaf *right)
367{ 365{
368 if (content) 366 if (content)
369 evaluateAST(content->value.statementValue->expression, left, right); 367 evaluateAST(content->value.statementValue->expressions, left, right);
370} 368}
371 369
372static void outputAST(LSL_AST *ast) 370static void outputAST(LSL_AST *ast)
@@ -374,10 +372,10 @@ static void outputAST(LSL_AST *ast)
374 if (ast) 372 if (ast)
375 { 373 {
376 outputAST(ast->left); 374 outputAST(ast->left);
377 if (ast->token->output) 375 if (ast->content.token->output)
378 ast->token->output(&(ast->content)); 376 ast->content.token->output(&(ast->content));
379 else 377 else
380 printf("%s", ast->token->token); 378 printf("%s", ast->content.token->token);
381 outputAST(ast->right); 379 outputAST(ast->right);
382 } 380 }
383} 381}
@@ -391,13 +389,13 @@ static void outputIntegerToken(LSL_Leaf *content)
391static void outputOperationToken(LSL_Leaf *content) 389static void outputOperationToken(LSL_Leaf *content)
392{ 390{
393 if (content) 391 if (content)
394 printf("%s", tokens[content->value.operationValue - lowestToken]->token); 392 printf("%s", content->token->token);
395} 393}
396 394
397static void outputStatementToken(LSL_Leaf *content) 395static void outputStatementToken(LSL_Leaf *content)
398{ 396{
399 if (content) 397 if (content)
400 outputAST(content->value.statementValue->expression); 398 outputAST(content->value.statementValue->expressions);
401 printf(";"); 399 printf(";");
402} 400}
403 401
@@ -412,12 +410,12 @@ static void convertAST2Lua(LSL_AST *ast)
412 if (ast) 410 if (ast)
413 { 411 {
414 convertAST2Lua(ast->left); 412 convertAST2Lua(ast->left);
415 if (ast->token->convert) 413 if (ast->content.token->convert)
416 ast->token->convert(&(ast->content)); 414 ast->content.token->convert(&(ast->content));
417 else if (ast->token->output) 415 else if (ast->content.token->output)
418 ast->token->output(&(ast->content)); 416 ast->content.token->output(&(ast->content));
419 else 417 else
420 printf("%s", ast->token->token); 418 printf("%s", ast->content.token->token);
421 convertAST2Lua(ast->right); 419 convertAST2Lua(ast->right);
422 } 420 }
423} 421}
@@ -539,11 +537,11 @@ int main(int argc, char **argv)
539 537
540 if (ast) 538 if (ast)
541 { 539 {
542 LSL_Value left, right; 540 LSL_Leaf left, right;
543 541
544 left.content.value.integerValue = 0; 542 left.value.integerValue = 0;
545 left.type = LSL_INTEGER; 543 left.type = LSL_INTEGER;
546 right.content.value.integerValue = 0; 544 right.value.integerValue = 0;
547 right.type = LSL_INTEGER; 545 right.type = LSL_INTEGER;
548 evaluateAST(ast, &left, &right); 546 evaluateAST(ast, &left, &right);
549 547
@@ -553,7 +551,7 @@ int main(int argc, char **argv)
553 printf("Result of -\n"); 551 printf("Result of -\n");
554 outputAST(ast); 552 outputAST(ast);
555 printf("\n"); 553 printf("\n");
556 printf("is %d %d. And converted to Lua it is -\n", left.content.value.integerValue, right.content.value.integerValue); 554 printf("is %d %d. And converted to Lua it is -\n", left.value.integerValue, right.value.integerValue);
557 convertAST2Lua(ast); 555 convertAST2Lua(ast);
558 printf("\n"); 556 printf("\n");
559 burnAST(ast); 557 burnAST(ast);