diff options
Diffstat (limited to 'LuaSL/src/LuaSL_LSL_tree.c')
-rw-r--r-- | LuaSL/src/LuaSL_LSL_tree.c | 140 |
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 | ||
6 | static void evaluateIntegerToken(LSL_Leaf *content, LSL_Value *left, LSL_Value *right); | 6 | static void evaluateIntegerToken(LSL_Leaf *content, LSL_Leaf *left, LSL_Leaf *right); |
7 | static void evaluateNoToken(LSL_Leaf *content, LSL_Value *left, LSL_Value *right); | 7 | static void evaluateNoToken(LSL_Leaf *content, LSL_Leaf *left, LSL_Leaf *right); |
8 | static void evaluateOperationToken(LSL_Leaf *content, LSL_Value *left, LSL_Value *right); | 8 | static void evaluateOperationToken(LSL_Leaf *content, LSL_Leaf *left, LSL_Leaf *right); |
9 | static void evaluateStatementToken(LSL_Leaf *content, LSL_Value *left, LSL_Value *right); | 9 | static void evaluateStatementToken(LSL_Leaf *content, LSL_Leaf *left, LSL_Leaf *right); |
10 | static void outputIntegerToken(LSL_Leaf *content); | 10 | static void outputIntegerToken(LSL_Leaf *content); |
11 | static void outputOperationToken(LSL_Leaf *content); | 11 | static void outputOperationToken(LSL_Leaf *content); |
12 | static void outputStatementToken(LSL_Leaf *content); | 12 | static void outputStatementToken(LSL_Leaf *content); |
@@ -14,8 +14,8 @@ static void outputSpaceToken(LSL_Leaf *content); | |||
14 | 14 | ||
15 | LSL_Token LSL_Tokens[] = | 15 | LSL_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 | ||
243 | static void evaluateAST(LSL_AST *ast, LSL_Value *left, LSL_Value *right) | 240 | static 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 | ||
287 | static void evaluateIntegerToken(LSL_Leaf *content, LSL_Value *left, LSL_Value *right) | 284 | static 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 | ||
299 | static void evaluateNoToken(LSL_Leaf *content, LSL_Value *left, LSL_Value *right) | 296 | static void evaluateNoToken(LSL_Leaf *content, LSL_Leaf *left, LSL_Leaf *right) |
300 | { | 297 | { |
298 | // Do nothing, that's the point. | ||
301 | } | 299 | } |
302 | 300 | ||
303 | static void evaluateOperationToken(LSL_Leaf *content, LSL_Value *left, LSL_Value *right) | 301 | static 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 | ||
366 | static void evaluateStatementToken(LSL_Leaf *content, LSL_Value *left, LSL_Value *right) | 364 | static 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 | ||
372 | static void outputAST(LSL_AST *ast) | 370 | static 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) | |||
391 | static void outputOperationToken(LSL_Leaf *content) | 389 | static 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 | ||
397 | static void outputStatementToken(LSL_Leaf *content) | 395 | static 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); |