diff options
Diffstat (limited to '')
-rw-r--r-- | LuaSL/src/LuaSL_LSL_tree.c | 64 |
1 files changed, 60 insertions, 4 deletions
diff --git a/LuaSL/src/LuaSL_LSL_tree.c b/LuaSL/src/LuaSL_LSL_tree.c index c7fc1bb..c3f2a49 100644 --- a/LuaSL/src/LuaSL_LSL_tree.c +++ b/LuaSL/src/LuaSL_LSL_tree.c | |||
@@ -4,9 +4,12 @@ | |||
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_Value *left, LSL_Value *right); |
7 | static void evaluateNoToken(LSL_Leaf *content, LSL_Value *left, LSL_Value *right); | ||
7 | static void evaluateOperationToken(LSL_Leaf *content, LSL_Value *left, LSL_Value *right); | 8 | static void evaluateOperationToken(LSL_Leaf *content, LSL_Value *left, LSL_Value *right); |
9 | static void evaluateStatementToken(LSL_Leaf *content, LSL_Value *left, LSL_Value *right); | ||
8 | static void outputIntegerToken(LSL_Leaf *content); | 10 | static void outputIntegerToken(LSL_Leaf *content); |
9 | static void outputOperationToken(LSL_Leaf *content); | 11 | static void outputOperationToken(LSL_Leaf *content); |
12 | static void outputStatementToken(LSL_Leaf *content); | ||
10 | 13 | ||
11 | LSL_Token LSL_Tokens[] = | 14 | LSL_Token LSL_Tokens[] = |
12 | { | 15 | { |
@@ -28,8 +31,8 @@ LSL_Token LSL_Tokens[] = | |||
28 | // {LSL_ASSIGNMENT_SUBTRACT, "-=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, outputOperationToken, NULL, evaluateOperationToken}, | 31 | // {LSL_ASSIGNMENT_SUBTRACT, "-=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, outputOperationToken, NULL, evaluateOperationToken}, |
29 | // {LSL_ASSIGNMENT_ADD, "+=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, outputOperationToken, NULL, evaluateOperationToken}, | 32 | // {LSL_ASSIGNMENT_ADD, "+=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, outputOperationToken, NULL, evaluateOperationToken}, |
30 | // {LSL_ASSIGNMENT_CONCATENATE, "+=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, outputOperationToken, NULL, evaluateOperationToken}, | 33 | // {LSL_ASSIGNMENT_CONCATENATE, "+=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, outputOperationToken, NULL, evaluateOperationToken}, |
31 | {LSL_PARENTHESIS_OPEN, "(", LSL_INNER2OUTER, outputOperationToken, NULL, evaluateOperationToken}, | 34 | {LSL_PARENTHESIS_OPEN, "(", LSL_INNER2OUTER, NULL, NULL, NULL}, |
32 | {LSL_PARENTHESIS_CLOSE, ")", LSL_INNER2OUTER, outputOperationToken, NULL, evaluateOperationToken}, | 35 | {LSL_PARENTHESIS_CLOSE, ")", LSL_INNER2OUTER, NULL, NULL, evaluateNoToken}, |
33 | // {LSL_BRACKET_OPEN, "[", LSL_INNER2OUTER | LSL_CREATION, outputOperationToken, NULL, evaluateOperationToken}, | 36 | // {LSL_BRACKET_OPEN, "[", LSL_INNER2OUTER | LSL_CREATION, outputOperationToken, NULL, evaluateOperationToken}, |
34 | // {LSL_BRACKET_CLOSE, "]", LSL_INNER2OUTER | LSL_CREATION, outputOperationToken, NULL, evaluateOperationToken}, | 37 | // {LSL_BRACKET_CLOSE, "]", LSL_INNER2OUTER | LSL_CREATION, outputOperationToken, NULL, evaluateOperationToken}, |
35 | // {LSL_ANGLE_OPEN, "<", LSL_LEFT2RIGHT | LSL_CREATION, outputOperationToken, NULL, evaluateOperationToken}, | 38 | // {LSL_ANGLE_OPEN, "<", LSL_LEFT2RIGHT | LSL_CREATION, outputOperationToken, NULL, evaluateOperationToken}, |
@@ -66,6 +69,7 @@ LSL_Token LSL_Tokens[] = | |||
66 | 69 | ||
67 | // Then the rest of the syntax tokens. | 70 | // Then the rest of the syntax tokens. |
68 | 71 | ||
72 | // {LSL_SPACE, " ", LSL_NONE, NULL, NULL, NULL}, | ||
69 | // {LSL_COMMENT_LINE, "//", LSL_NONE, NULL, NULL, NULL}, | 73 | // {LSL_COMMENT_LINE, "//", LSL_NONE, NULL, NULL, NULL}, |
70 | // {LSL_COMMENT, "/*", LSL_NONE, NULL, NULL, NULL}, | 74 | // {LSL_COMMENT, "/*", LSL_NONE, NULL, NULL, NULL}, |
71 | // {LSL_TYPE, "type", LSL_NONE, NULL, NULL, NULL}, | 75 | // {LSL_TYPE, "type", LSL_NONE, NULL, NULL, NULL}, |
@@ -89,7 +93,7 @@ LSL_Token LSL_Tokens[] = | |||
89 | // {LSL_STATE_CHANGE, "state", LSL_NONE, NULL, NULL, NULL}, | 93 | // {LSL_STATE_CHANGE, "state", LSL_NONE, NULL, NULL, NULL}, |
90 | // {LSL_WHILE, "while", LSL_NONE, NULL, NULL, NULL}, | 94 | // {LSL_WHILE, "while", LSL_NONE, NULL, NULL, NULL}, |
91 | // {LSL_RETURN, "return", LSL_NONE, NULL, NULL, NULL}, | 95 | // {LSL_RETURN, "return", LSL_NONE, NULL, NULL, NULL}, |
92 | // {LSL_STATEMENT, ";", LSL_NONE, NULL, NULL, NULL}, | 96 | {LSL_STATEMENT, ";", LSL_NONE, outputStatementToken, NULL, evaluateStatementToken}, |
93 | // {LSL_BLOCK_OPEN, "{", LSL_NONE, NULL, NULL, NULL}, | 97 | // {LSL_BLOCK_OPEN, "{", LSL_NONE, NULL, NULL, NULL}, |
94 | // {LSL_BLOCK_CLOSE, "}", LSL_NONE, NULL, NULL, NULL}, | 98 | // {LSL_BLOCK_CLOSE, "}", LSL_NONE, NULL, NULL, NULL}, |
95 | // {LSL_PARAMETER, "parameter", LSL_NONE, NULL, NULL, NULL}, | 99 | // {LSL_PARAMETER, "parameter", LSL_NONE, NULL, NULL, NULL}, |
@@ -156,6 +160,37 @@ LSL_AST *addOperation(LSL_Operation type, LSL_AST *left, LSL_AST *right) | |||
156 | return ast; | 160 | return ast; |
157 | } | 161 | } |
158 | 162 | ||
163 | LSL_AST *addParenthesis(LSL_AST *expr) | ||
164 | { | ||
165 | LSL_AST *ast = newAST(LSL_PARENTHESIS_OPEN, NULL, expr); | ||
166 | |||
167 | if (ast) | ||
168 | ast = newAST(LSL_PARENTHESIS_CLOSE, ast, NULL); | ||
169 | |||
170 | return ast; | ||
171 | } | ||
172 | |||
173 | LSL_Statement *createStatement(LSL_Type type, LSL_AST *expr) | ||
174 | { | ||
175 | LSL_Statement *stat = malloc(sizeof(LSL_Statement)); | ||
176 | |||
177 | if (stat == NULL) return NULL; | ||
178 | |||
179 | stat->type = type; | ||
180 | stat->expression = expr; | ||
181 | |||
182 | return stat; | ||
183 | } | ||
184 | |||
185 | LSL_AST *addStatement(LSL_Statement *statement, LSL_AST *root) | ||
186 | { | ||
187 | LSL_AST *ast = newAST(LSL_STATEMENT, root, NULL); | ||
188 | |||
189 | ast->content.statementValue = statement; | ||
190 | |||
191 | return ast; | ||
192 | } | ||
193 | |||
159 | static void evaluateAST(LSL_AST *ast, LSL_Value *left, LSL_Value *right) | 194 | static void evaluateAST(LSL_AST *ast, LSL_Value *left, LSL_Value *right) |
160 | { | 195 | { |
161 | if (ast) | 196 | if (ast) |
@@ -192,7 +227,9 @@ static void evaluateAST(LSL_AST *ast, LSL_Value *left, LSL_Value *right) | |||
192 | } | 227 | } |
193 | else | 228 | else |
194 | { | 229 | { |
230 | #ifdef LUASL_DEBUG | ||
195 | printf(" eval <%s %d %d %d %d> ", ast->token->token, left->content.integerValue, right->content.integerValue, lresult.content.integerValue, rresult.content.integerValue); | 231 | printf(" eval <%s %d %d %d %d> ", ast->token->token, left->content.integerValue, right->content.integerValue, lresult.content.integerValue, rresult.content.integerValue); |
232 | #endif | ||
196 | memcpy(left, &rresult, sizeof(LSL_Value)); | 233 | memcpy(left, &rresult, sizeof(LSL_Value)); |
197 | } | 234 | } |
198 | } | 235 | } |
@@ -210,6 +247,10 @@ static void evaluateIntegerToken(LSL_Leaf *content, LSL_Value *left, LSL_Value * | |||
210 | } | 247 | } |
211 | } | 248 | } |
212 | 249 | ||
250 | static void evaluateNoToken(LSL_Leaf *content, LSL_Value *left, LSL_Value *right) | ||
251 | { | ||
252 | } | ||
253 | |||
213 | static void evaluateOperationToken(LSL_Leaf *content, LSL_Value *left, LSL_Value *right) | 254 | static void evaluateOperationToken(LSL_Leaf *content, LSL_Value *left, LSL_Value *right) |
214 | { | 255 | { |
215 | if ((content) && (content->operationValue)) | 256 | if ((content) && (content->operationValue)) |
@@ -278,6 +319,12 @@ static void evaluateOperationToken(LSL_Leaf *content, LSL_Value *left, LSL_Value | |||
278 | } | 319 | } |
279 | } | 320 | } |
280 | 321 | ||
322 | static void evaluateStatementToken(LSL_Leaf *content, LSL_Value *left, LSL_Value *right) | ||
323 | { | ||
324 | if (content) | ||
325 | evaluateAST(content->statementValue->expression, left, right); | ||
326 | } | ||
327 | |||
281 | static void outputAST(LSL_AST *ast) | 328 | static void outputAST(LSL_AST *ast) |
282 | { | 329 | { |
283 | if (ast) | 330 | if (ast) |
@@ -286,7 +333,7 @@ static void outputAST(LSL_AST *ast) | |||
286 | if (ast->token->output) | 333 | if (ast->token->output) |
287 | ast->token->output(&(ast->content)); | 334 | ast->token->output(&(ast->content)); |
288 | else | 335 | else |
289 | printf(" <%s> ", ast->token->token); | 336 | printf(" %s ", ast->token->token); |
290 | outputAST(ast->right); | 337 | outputAST(ast->right); |
291 | } | 338 | } |
292 | } | 339 | } |
@@ -303,6 +350,13 @@ static void outputOperationToken(LSL_Leaf *content) | |||
303 | printf(" %s ", tokens[content->operationValue - lowestToken]->token); | 350 | printf(" %s ", tokens[content->operationValue - lowestToken]->token); |
304 | } | 351 | } |
305 | 352 | ||
353 | static void outputStatementToken(LSL_Leaf *content) | ||
354 | { | ||
355 | if (content) | ||
356 | outputAST(content->statementValue->expression); | ||
357 | printf(";"); | ||
358 | } | ||
359 | |||
306 | static void convertAST2Lua(LSL_AST *ast) | 360 | static void convertAST2Lua(LSL_AST *ast) |
307 | { | 361 | { |
308 | if (ast) | 362 | if (ast) |
@@ -312,6 +366,8 @@ static void convertAST2Lua(LSL_AST *ast) | |||
312 | ast->token->convert(&(ast->content)); | 366 | ast->token->convert(&(ast->content)); |
313 | else if (ast->token->output) | 367 | else if (ast->token->output) |
314 | ast->token->output(&(ast->content)); | 368 | ast->token->output(&(ast->content)); |
369 | else | ||
370 | printf(" %s ", ast->token->token); | ||
315 | convertAST2Lua(ast->right); | 371 | convertAST2Lua(ast->right); |
316 | } | 372 | } |
317 | } | 373 | } |