aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/LuaSL/src/LuaSL_LSL_tree.c
diff options
context:
space:
mode:
authorDavid Walter Seikel2012-01-16 00:54:18 +1000
committerDavid Walter Seikel2012-01-16 00:54:18 +1000
commitcb95506e6aa887d1f810759f626e3934b6a87201 (patch)
tree6fe770229f3e261c7ad6e9fdf6c8bea0becbc126 /LuaSL/src/LuaSL_LSL_tree.c
parentReport line and column in syntax errors, and stack overflows. (diff)
downloadSledjHamr-cb95506e6aa887d1f810759f626e3934b6a87201.zip
SledjHamr-cb95506e6aa887d1f810759f626e3934b6a87201.tar.gz
SledjHamr-cb95506e6aa887d1f810759f626e3934b6a87201.tar.bz2
SledjHamr-cb95506e6aa887d1f810759f626e3934b6a87201.tar.xz
Fill out the rest of theparser symbols, and partiallyimplement typecasting.
Diffstat (limited to 'LuaSL/src/LuaSL_LSL_tree.c')
-rw-r--r--LuaSL/src/LuaSL_LSL_tree.c81
1 files changed, 52 insertions, 29 deletions
diff --git a/LuaSL/src/LuaSL_LSL_tree.c b/LuaSL/src/LuaSL_LSL_tree.c
index c5a9405..dc0a4c7 100644
--- a/LuaSL/src/LuaSL_LSL_tree.c
+++ b/LuaSL/src/LuaSL_LSL_tree.c
@@ -41,26 +41,26 @@ LSL_Token LSL_Tokens[] =
41 {LSL_LESS_THAN, ST_COMPARISON, "<", LSL_RIGHT2LEFT, NULL, NULL, evaluateOperationToken}, 41 {LSL_LESS_THAN, ST_COMPARISON, "<", LSL_RIGHT2LEFT, NULL, NULL, evaluateOperationToken},
42 {LSL_RIGHT_SHIFT, ST_BITWISE, ">>", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken}, 42 {LSL_RIGHT_SHIFT, ST_BITWISE, ">>", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken},
43 {LSL_LEFT_SHIFT, ST_BITWISE, "<<", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken}, 43 {LSL_LEFT_SHIFT, ST_BITWISE, "<<", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken},
44// {LSL_CONCATENATE, ST_ADD, "+", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken}, 44 {LSL_CONCATENATE, ST_ADD, "+", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken},
45 {LSL_ADD, ST_ADD, "+", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken}, 45 {LSL_ADD, ST_ADD, "+", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken},
46 {LSL_SUBTRACT, ST_SUBTRACT, "-", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken}, 46 {LSL_SUBTRACT, ST_SUBTRACT, "-", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken},
47// {LSL_CROSS_PRODUCT, ST_NONE, "%", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken}, 47 {LSL_CROSS_PRODUCT, ST_NONE, "%", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken},
48// {LSL_DOT_PRODUCT, ST_NONE, "*", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken}, 48 {LSL_DOT_PRODUCT, ST_NONE, "*", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken},
49 {LSL_MULTIPLY, ST_MULTIPLY, "*", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken}, 49 {LSL_MULTIPLY, ST_MULTIPLY, "*", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken},
50 {LSL_MODULO, ST_MODULO, "%", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken}, 50 {LSL_MODULO, ST_MODULO, "%", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken},
51 {LSL_DIVIDE, ST_MULTIPLY, "/", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken}, 51 {LSL_DIVIDE, ST_MULTIPLY, "/", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken},
52 {LSL_NEGATION, ST_NEGATE, "-", LSL_RIGHT2LEFT | LSL_UNARY, NULL, NULL, evaluateOperationToken}, 52 {LSL_NEGATION, ST_NEGATE, "-", LSL_RIGHT2LEFT | LSL_UNARY, NULL, NULL, evaluateOperationToken},
53 {LSL_BOOL_NOT, ST_BOOL_NOT, "!", LSL_RIGHT2LEFT | LSL_UNARY, NULL, NULL, evaluateOperationToken}, 53 {LSL_BOOL_NOT, ST_BOOL_NOT, "!", LSL_RIGHT2LEFT | LSL_UNARY, NULL, NULL, evaluateOperationToken},
54 {LSL_BIT_NOT, ST_BIT_NOT, "~", LSL_RIGHT2LEFT | LSL_UNARY, NULL, NULL, evaluateOperationToken}, 54 {LSL_BIT_NOT, ST_BIT_NOT, "~", LSL_RIGHT2LEFT | LSL_UNARY, NULL, NULL, evaluateOperationToken},
55// {LSL_TYPECAST_CLOSE, ST_NONE, ")", LSL_RIGHT2LEFT | LSL_UNARY, NULL, NULL, evaluateOperationToken}, 55 {LSL_TYPECAST_CLOSE, ST_NONE, ")", LSL_RIGHT2LEFT | LSL_UNARY, NULL, NULL, evaluateNoToken},
56// {LSL_TYPECAST_OPEN, ST_NONE, "(", LSL_RIGHT2LEFT | LSL_UNARY, NULL, NULL, evaluateOperationToken}, 56 {LSL_TYPECAST_OPEN, ST_NONE, "(", LSL_RIGHT2LEFT | LSL_UNARY, NULL, NULL, evaluateOperationToken},
57 {LSL_ANGLE_CLOSE, ST_NONE, ">", LSL_LEFT2RIGHT | LSL_CREATION, NULL, NULL, evaluateOperationToken}, 57 {LSL_ANGLE_CLOSE, ST_NONE, ">", LSL_LEFT2RIGHT | LSL_CREATION, NULL, NULL, evaluateNoToken},
58 {LSL_ANGLE_OPEN, ST_NONE, "<", LSL_LEFT2RIGHT | LSL_CREATION, NULL, NULL, evaluateOperationToken}, 58 {LSL_ANGLE_OPEN, ST_NONE, "<", LSL_LEFT2RIGHT | LSL_CREATION, NULL, NULL, evaluateOperationToken},
59 {LSL_BRACKET_CLOSE, ST_NONE, "]", LSL_INNER2OUTER | LSL_CREATION, NULL, NULL, evaluateOperationToken}, 59 {LSL_BRACKET_CLOSE, ST_NONE, "]", LSL_INNER2OUTER | LSL_CREATION, NULL, NULL, evaluateNoToken},
60 {LSL_BRACKET_OPEN, ST_NONE, "[", LSL_INNER2OUTER | LSL_CREATION, NULL, NULL, evaluateOperationToken}, 60 {LSL_BRACKET_OPEN, ST_NONE, "[", LSL_INNER2OUTER | LSL_CREATION, NULL, NULL, evaluateOperationToken},
61 {LSL_PARENTHESIS_CLOSE, ST_NONE, ")", LSL_INNER2OUTER, NULL, NULL, evaluateNoToken}, 61 {LSL_PARENTHESIS_CLOSE, ST_NONE, ")", LSL_INNER2OUTER, NULL, NULL, evaluateNoToken},
62 {LSL_PARENTHESIS_OPEN, ST_NONE, "(", LSL_INNER2OUTER, outputParenthesisToken, NULL, eveluateParenthesisToken}, 62 {LSL_PARENTHESIS_OPEN, ST_NONE, "(", LSL_INNER2OUTER, outputParenthesisToken, NULL, eveluateParenthesisToken},
63// {LSL_ASSIGNMENT_CONCATENATE, ST_CONCATENATION "+=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, NULL, NULL, evaluateOperationToken}, 63 {LSL_ASSIGNMENT_CONCATENATE,ST_CONCATENATION, "+=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, NULL, NULL, evaluateOperationToken},
64 {LSL_ASSIGNMENT_ADD, ST_CONCATENATION, "+=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, NULL, NULL, evaluateOperationToken}, 64 {LSL_ASSIGNMENT_ADD, ST_CONCATENATION, "+=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, NULL, NULL, evaluateOperationToken},
65 {LSL_ASSIGNMENT_SUBTRACT, ST_ASSIGNMENT, "-=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, NULL, NULL, evaluateOperationToken}, 65 {LSL_ASSIGNMENT_SUBTRACT, ST_ASSIGNMENT, "-=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, NULL, NULL, evaluateOperationToken},
66 {LSL_ASSIGNMENT_MULTIPLY, ST_ASSIGNMENT, "*=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, NULL, NULL, evaluateOperationToken}, 66 {LSL_ASSIGNMENT_MULTIPLY, ST_ASSIGNMENT, "*=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, NULL, NULL, evaluateOperationToken},
@@ -68,9 +68,9 @@ LSL_Token LSL_Tokens[] =
68 {LSL_ASSIGNMENT_DIVIDE, ST_ASSIGNMENT, "/=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, NULL, NULL, evaluateOperationToken}, 68 {LSL_ASSIGNMENT_DIVIDE, ST_ASSIGNMENT, "/=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, NULL, NULL, evaluateOperationToken},
69 {LSL_ASSIGNMENT_PLAIN, ST_CONCATENATION, "=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, NULL, NULL, evaluateOperationToken}, 69 {LSL_ASSIGNMENT_PLAIN, ST_CONCATENATION, "=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, NULL, NULL, evaluateOperationToken},
70 {LSL_DOT, ST_NONE, ".", LSL_RIGHT2LEFT, NULL, NULL, evaluateOperationToken}, 70 {LSL_DOT, ST_NONE, ".", LSL_RIGHT2LEFT, NULL, NULL, evaluateOperationToken},
71// {LSL_DECREMENT_POST, ST_NONE, "--", LSL_RIGHT2LEFT | LSL_UNARY, NULL, NULL, evaluateOperationToken}, 71 {LSL_DECREMENT_POST, ST_NONE, "--", LSL_RIGHT2LEFT | LSL_UNARY, NULL, NULL, evaluateOperationToken},
72 {LSL_DECREMENT_PRE, ST_NONE, "--", LSL_RIGHT2LEFT | LSL_UNARY, NULL, NULL, evaluateOperationToken}, 72 {LSL_DECREMENT_PRE, ST_NONE, "--", LSL_RIGHT2LEFT | LSL_UNARY, NULL, NULL, evaluateOperationToken},
73// {LSL_INCREMENT_POST, ST_NONE, "++", LSL_RIGHT2LEFT | LSL_UNARY, NULL, NULL, evaluateOperationToken}, 73 {LSL_INCREMENT_POST, ST_NONE, "++", LSL_RIGHT2LEFT | LSL_UNARY, NULL, NULL, evaluateOperationToken},
74 {LSL_INCREMENT_PRE, ST_NONE, "++", LSL_RIGHT2LEFT | LSL_UNARY, NULL, NULL, evaluateOperationToken}, 74 {LSL_INCREMENT_PRE, ST_NONE, "++", LSL_RIGHT2LEFT | LSL_UNARY, NULL, NULL, evaluateOperationToken},
75 {LSL_COMMA, ST_NONE, ",", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken}, 75 {LSL_COMMA, ST_NONE, ",", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken},
76 76
@@ -79,11 +79,11 @@ LSL_Token LSL_Tokens[] =
79 // Types. 79 // Types.
80 {LSL_FLOAT, ST_NONE, "float", LSL_NONE, outputFloatToken, NULL, evaluateFloatToken}, 80 {LSL_FLOAT, ST_NONE, "float", LSL_NONE, outputFloatToken, NULL, evaluateFloatToken},
81 {LSL_INTEGER, ST_NONE, "integer", LSL_NONE, outputIntegerToken, NULL, evaluateIntegerToken}, 81 {LSL_INTEGER, ST_NONE, "integer", LSL_NONE, outputIntegerToken, NULL, evaluateIntegerToken},
82// {LSL_KEY, ST_NONE, "key", LSL_NONE, NULL, NULL, NULL}, 82 {LSL_KEY, ST_NONE, "key", LSL_NONE, NULL, NULL, NULL},
83// {LSL_LIST, ST_NONE, "list", LSL_NONE, NULL, NULL, NULL}, 83 {LSL_LIST, ST_NONE, "list", LSL_NONE, NULL, NULL, NULL},
84// {LSL_ROTATION, ST_NONE, "rotation", LSL_NONE, NULL, NULL, NULL}, 84 {LSL_ROTATION, ST_NONE, "rotation", LSL_NONE, NULL, NULL, NULL},
85// {LSL_STRING, ST_NONE, "string", LSL_NONE, NULL, NULL, NULL}, 85 {LSL_STRING, ST_NONE, "string", LSL_NONE, NULL, NULL, NULL},
86// {LSL_VECTOR, ST_NONE, "vector", LSL_NONE, NULL, NULL, NULL}, 86 {LSL_VECTOR, ST_NONE, "vector", LSL_NONE, NULL, NULL, NULL},
87 87
88 // Types names. 88 // Types names.
89 {LSL_TYPE_FLOAT, ST_NONE, "float", LSL_NONE, NULL, NULL, NULL}, 89 {LSL_TYPE_FLOAT, ST_NONE, "float", LSL_NONE, NULL, NULL, NULL},
@@ -101,7 +101,7 @@ LSL_Token LSL_Tokens[] =
101 101
102 {LSL_DO, ST_NONE, "do", LSL_NONE, NULL, NULL, NULL}, 102 {LSL_DO, ST_NONE, "do", LSL_NONE, NULL, NULL, NULL},
103 {LSL_FOR, ST_NONE, "for", LSL_NONE, NULL, NULL, NULL}, 103 {LSL_FOR, ST_NONE, "for", LSL_NONE, NULL, NULL, NULL},
104// {LSL_ELSE_IF, ST_NONE, "else if", LSL_NONE, NULL, NULL, NULL}, 104 {LSL_ELSE_IF, ST_NONE, "else if", LSL_NONE, NULL, NULL, NULL},
105 {LSL_ELSE, ST_NONE, "else", LSL_NONE, NULL, NULL, NULL}, 105 {LSL_ELSE, ST_NONE, "else", LSL_NONE, NULL, NULL, NULL},
106 {LSL_IF, ST_NONE, "if", LSL_NONE, NULL, NULL, NULL}, 106 {LSL_IF, ST_NONE, "if", LSL_NONE, NULL, NULL, NULL},
107 {LSL_JUMP, ST_NONE, "jump", LSL_NONE, NULL, NULL, NULL}, 107 {LSL_JUMP, ST_NONE, "jump", LSL_NONE, NULL, NULL, NULL},
@@ -112,9 +112,9 @@ LSL_Token LSL_Tokens[] =
112 112
113 {LSL_BLOCK_CLOSE, ST_NONE, "}", LSL_NONE, NULL, NULL, NULL}, 113 {LSL_BLOCK_CLOSE, ST_NONE, "}", LSL_NONE, NULL, NULL, NULL},
114 {LSL_BLOCK_OPEN, ST_NONE, "{", LSL_NONE, NULL, NULL, NULL}, 114 {LSL_BLOCK_OPEN, ST_NONE, "{", LSL_NONE, NULL, NULL, NULL},
115// {LSL_PARAMETER, ST_NONE, "parameter", LSL_NONE, NULL, NULL, NULL}, 115 {LSL_PARAMETER, ST_NONE, "parameter", LSL_NONE, NULL, NULL, NULL},
116// {LSL_FUNCTION, ST_NONE, "function", LSL_NONE, NULL, NULL, NULL}, 116 {LSL_FUNCTION, ST_NONE, "function", LSL_NONE, NULL, NULL, NULL},
117// {LSL_STATE, ST_NONE, "state", LSL_NONE, NULL, NULL, NULL}, 117 {LSL_STATE, ST_NONE, "state", LSL_NONE, NULL, NULL, NULL},
118 {LSL_SCRIPT, ST_NONE, "", LSL_NONE, NULL, NULL, NULL}, 118 {LSL_SCRIPT, ST_NONE, "", LSL_NONE, NULL, NULL, NULL},
119 119
120 {LSL_UNKNOWN, ST_NONE, "unknown", LSL_NONE, NULL, NULL, NULL}, 120 {LSL_UNKNOWN, ST_NONE, "unknown", LSL_NONE, NULL, NULL, NULL},
@@ -260,7 +260,7 @@ LSL_Leaf *addOperation(LSL_Leaf *left, LSL_Leaf *lval, LSL_Leaf *right)
260 if (LSL_MULTIPLY == lval->token->type) 260 if (LSL_MULTIPLY == lval->token->type)
261 { 261 {
262 lval->basicType = OT_float; 262 lval->basicType = OT_float;
263// lval->token = tokens[LSL_DOT_PRODUCT - lowestToken]; 263 lval->token = tokens[LSL_DOT_PRODUCT - lowestToken];
264 } 264 }
265 else 265 else
266 lval->basicType = OT_vector; 266 lval->basicType = OT_vector;
@@ -311,6 +311,29 @@ LSL_Leaf *addStatement(LSL_Leaf *lval, LSL_Type type, LSL_Leaf *expr)
311 return lval; 311 return lval;
312} 312}
313 313
314LSL_Leaf *addTypecast(LSL_Leaf *lval, LSL_Leaf *type, LSL_Leaf *rval)
315{
316 LSL_Parenthesis *parens = malloc(sizeof(LSL_Parenthesis));
317
318 if (parens)
319 {
320 parens->left = lval;
321 parens->expression = type;
322 parens->right = rval;
323 if (lval)
324 {
325 lval->value.parenthesis = parens;
326 lval->basicType = type->basicType;
327 lval->token = tokens[LSL_TYPECAST_OPEN - lowestToken];
328 }
329 if (rval)
330 {
331 rval->token = tokens[LSL_TYPECAST_CLOSE - lowestToken];
332 }
333 }
334 return lval;
335}
336
314static LSL_Leaf *evaluateLeaf(LSL_Leaf *leaf, LSL_Leaf *left, LSL_Leaf *right) 337static LSL_Leaf *evaluateLeaf(LSL_Leaf *leaf, LSL_Leaf *left, LSL_Leaf *right)
315{ 338{
316 LSL_Leaf *result = NULL; 339 LSL_Leaf *result = NULL;
@@ -479,9 +502,9 @@ static LSL_Leaf *evaluateOperationToken(LSL_Leaf *content, LSL_Leaf *left, LSL_L
479 { 502 {
480 case LSL_COMMA : 503 case LSL_COMMA :
481 case LSL_INCREMENT_PRE : 504 case LSL_INCREMENT_PRE :
482// case LSL_INCREMENT_POST : 505 case LSL_INCREMENT_POST :
483 case LSL_DECREMENT_PRE : 506 case LSL_DECREMENT_PRE :
484// case LSL_DECREMENT_POST : 507 case LSL_DECREMENT_POST :
485 case LSL_ASSIGNMENT_PLAIN : 508 case LSL_ASSIGNMENT_PLAIN :
486 case LSL_ASSIGNMENT_DIVIDE : 509 case LSL_ASSIGNMENT_DIVIDE :
487 case LSL_ASSIGNMENT_MULTIPLY : 510 case LSL_ASSIGNMENT_MULTIPLY :
@@ -491,9 +514,9 @@ static LSL_Leaf *evaluateOperationToken(LSL_Leaf *content, LSL_Leaf *left, LSL_L
491 case LSL_BRACKET_CLOSE : 514 case LSL_BRACKET_CLOSE :
492 case LSL_ANGLE_OPEN : 515 case LSL_ANGLE_OPEN :
493 case LSL_ANGLE_CLOSE : 516 case LSL_ANGLE_CLOSE :
494// case LSL_TYPECAST_OPEN : 517 case LSL_TYPECAST_OPEN :
495// case LSL_TYPECAST_CLOSE : 518 case LSL_TYPECAST_CLOSE :
496// case LSL_DOT_PRODUCT : 519 case LSL_DOT_PRODUCT :
497 break; 520 break;
498 case LSL_NEGATION : result->value.floatValue = 0 - fright; break; 521 case LSL_NEGATION : result->value.floatValue = 0 - fright; break;
499 case LSL_DIVIDE : result->value.floatValue = fleft / fright; break; 522 case LSL_DIVIDE : result->value.floatValue = fleft / fright; break;
@@ -519,9 +542,9 @@ static LSL_Leaf *evaluateOperationToken(LSL_Leaf *content, LSL_Leaf *left, LSL_L
519 { 542 {
520 case LSL_COMMA : 543 case LSL_COMMA :
521 case LSL_INCREMENT_PRE : 544 case LSL_INCREMENT_PRE :
522// case LSL_INCREMENT_POST : 545 case LSL_INCREMENT_POST :
523 case LSL_DECREMENT_PRE : 546 case LSL_DECREMENT_PRE :
524// case LSL_DECREMENT_POST : 547 case LSL_DECREMENT_POST :
525 case LSL_DOT : 548 case LSL_DOT :
526 case LSL_ASSIGNMENT_PLAIN : 549 case LSL_ASSIGNMENT_PLAIN :
527 case LSL_ASSIGNMENT_DIVIDE : 550 case LSL_ASSIGNMENT_DIVIDE :
@@ -533,8 +556,8 @@ static LSL_Leaf *evaluateOperationToken(LSL_Leaf *content, LSL_Leaf *left, LSL_L
533 case LSL_BRACKET_CLOSE : 556 case LSL_BRACKET_CLOSE :
534 case LSL_ANGLE_OPEN : 557 case LSL_ANGLE_OPEN :
535 case LSL_ANGLE_CLOSE : 558 case LSL_ANGLE_CLOSE :
536// case LSL_TYPECAST_OPEN : 559 case LSL_TYPECAST_OPEN :
537// case LSL_TYPECAST_CLOSE : 560 case LSL_TYPECAST_CLOSE :
538 break; 561 break;
539 case LSL_BIT_NOT : result->value.integerValue = ~ right->value.integerValue; break; 562 case LSL_BIT_NOT : result->value.integerValue = ~ right->value.integerValue; break;
540 case LSL_BOOL_NOT : result->value.integerValue = ! right->value.integerValue; break; 563 case LSL_BOOL_NOT : result->value.integerValue = ! right->value.integerValue; break;