diff options
Diffstat (limited to '')
-rw-r--r-- | LuaSL/src/LuaSL_LSL_tree.c | 132 |
1 files changed, 75 insertions, 57 deletions
diff --git a/LuaSL/src/LuaSL_LSL_tree.c b/LuaSL/src/LuaSL_LSL_tree.c index 76dd433..ff7da8b 100644 --- a/LuaSL/src/LuaSL_LSL_tree.c +++ b/LuaSL/src/LuaSL_LSL_tree.c | |||
@@ -149,20 +149,42 @@ static void burnAST(LSL_AST *ast) | |||
149 | 149 | ||
150 | burnAST(ast->left); | 150 | burnAST(ast->left); |
151 | burnAST(ast->right); | 151 | burnAST(ast->right); |
152 | free(ast->content.ignorableText); | ||
152 | free(ast); | 153 | free(ast); |
153 | } | 154 | } |
154 | 155 | ||
155 | LSL_AST *addInteger(int value) | 156 | static LSL_AST *checkAndAddIgnorable(LSL_AST *root) |
157 | { | ||
158 | if (root) | ||
159 | { | ||
160 | if (root->content.ignorableText) | ||
161 | { | ||
162 | LSL_AST *ast = newAST(LSL_SPACE, NULL, root); | ||
163 | |||
164 | if (ast) | ||
165 | { | ||
166 | ast->content.value.spaceValue = root->content.ignorableText; | ||
167 | return ast; | ||
168 | } | ||
169 | } | ||
170 | } | ||
171 | return root; | ||
172 | } | ||
173 | |||
174 | LSL_AST *addInteger(LSL_Leaf *lval, int value) | ||
156 | { | 175 | { |
157 | LSL_AST *ast = newAST(LSL_INTEGER, NULL, NULL); | 176 | LSL_AST *ast = newAST(LSL_INTEGER, NULL, NULL); |
158 | 177 | ||
159 | if (ast) | 178 | if (ast) |
160 | ast->content.integerValue = value; | 179 | { |
180 | ast->content.value.integerValue = value; | ||
181 | ast->content.ignorableText = lval->ignorableText; | ||
182 | } | ||
161 | 183 | ||
162 | return ast; | 184 | return checkAndAddIgnorable(ast); |
163 | } | 185 | } |
164 | 186 | ||
165 | LSL_AST *addOperation(LSL_Type type, LSL_AST *left, LSL_AST *right) | 187 | LSL_AST *addOperation(LSL_Leaf *lval, LSL_Type type, LSL_AST *left, LSL_AST *right) |
166 | { | 188 | { |
167 | LSL_AST *ast = newAST(type, left, right); | 189 | LSL_AST *ast = newAST(type, left, right); |
168 | 190 | ||
@@ -170,24 +192,30 @@ LSL_AST *addOperation(LSL_Type type, LSL_AST *left, LSL_AST *right) | |||
170 | { | 192 | { |
171 | if (LSL_EXPRESSION == type) | 193 | if (LSL_EXPRESSION == type) |
172 | { | 194 | { |
173 | ast->content.expressionValue = right; | 195 | ast->content.value.expressionValue = right; |
174 | ast->left = NULL; | 196 | ast->left = NULL; |
175 | } | 197 | } |
176 | else | 198 | else |
177 | ast->content.operationValue = type; | 199 | { |
200 | ast->content.value.operationValue = type; | ||
201 | ast->content.ignorableText = lval->ignorableText; | ||
202 | } | ||
178 | } | 203 | } |
179 | 204 | ||
180 | return ast; | 205 | return checkAndAddIgnorable(ast); |
181 | } | 206 | } |
182 | 207 | ||
183 | LSL_AST *addParenthesis(LSL_AST *expr) | 208 | LSL_AST *addParenthesis(LSL_Leaf *lval, LSL_AST *expr) |
184 | { | 209 | { |
185 | LSL_AST *ast = newAST(LSL_PARENTHESIS_OPEN, NULL, expr); | 210 | LSL_AST *ast = newAST(LSL_PARENTHESIS_OPEN, NULL, expr); |
186 | 211 | ||
187 | if (ast) | 212 | if (ast) |
213 | { | ||
188 | ast = newAST(LSL_PARENTHESIS_CLOSE, ast, NULL); | 214 | ast = newAST(LSL_PARENTHESIS_CLOSE, ast, NULL); |
215 | ast->content.ignorableText = lval->ignorableText; | ||
216 | } | ||
189 | 217 | ||
190 | return ast; | 218 | return checkAndAddIgnorable(ast); |
191 | } | 219 | } |
192 | 220 | ||
193 | LSL_Statement *createStatement(LSL_Type type, LSL_AST *expr) | 221 | LSL_Statement *createStatement(LSL_Type type, LSL_AST *expr) |
@@ -202,24 +230,14 @@ LSL_Statement *createStatement(LSL_Type type, LSL_AST *expr) | |||
202 | return stat; | 230 | return stat; |
203 | } | 231 | } |
204 | 232 | ||
205 | LSL_AST *addSpace(char *text, LSL_AST *root) | ||
206 | { | ||
207 | LSL_AST *ast = newAST(LSL_SPACE, root, NULL); | ||
208 | |||
209 | if (ast) | ||
210 | ast->content.spaceValue = text; | ||
211 | |||
212 | return ast; | ||
213 | } | ||
214 | |||
215 | LSL_AST *addStatement(LSL_Statement *statement, LSL_AST *root) | 233 | LSL_AST *addStatement(LSL_Statement *statement, LSL_AST *root) |
216 | { | 234 | { |
217 | LSL_AST *ast = newAST(LSL_STATEMENT, root, NULL); | 235 | LSL_AST *ast = newAST(LSL_STATEMENT, root, NULL); |
218 | 236 | ||
219 | if (ast) | 237 | if (ast) |
220 | ast->content.statementValue = statement; | 238 | ast->content.value.statementValue = statement; |
221 | 239 | ||
222 | return ast; | 240 | return checkAndAddIgnorable(ast); |
223 | } | 241 | } |
224 | 242 | ||
225 | static void evaluateAST(LSL_AST *ast, LSL_Value *left, LSL_Value *right) | 243 | static void evaluateAST(LSL_AST *ast, LSL_Value *left, LSL_Value *right) |
@@ -259,7 +277,7 @@ static void evaluateAST(LSL_AST *ast, LSL_Value *left, LSL_Value *right) | |||
259 | else | 277 | else |
260 | { | 278 | { |
261 | #ifdef LUASL_DEBUG | 279 | #ifdef LUASL_DEBUG |
262 | printf(" eval <%s %d %d %d %d> ", ast->token->token, left->content.integerValue, right->content.integerValue, lresult.content.integerValue, rresult.content.integerValue); | 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); |
263 | #endif | 281 | #endif |
264 | memcpy(left, &rresult, sizeof(LSL_Value)); | 282 | memcpy(left, &rresult, sizeof(LSL_Value)); |
265 | } | 283 | } |
@@ -271,9 +289,9 @@ static void evaluateIntegerToken(LSL_Leaf *content, LSL_Value *left, LSL_Value * | |||
271 | if (content) | 289 | if (content) |
272 | { | 290 | { |
273 | #ifdef LUASL_DEBUG | 291 | #ifdef LUASL_DEBUG |
274 | printf(" <%d> ", content->integerValue); | 292 | printf(" <%d> ", content->value.integerValue); |
275 | #endif | 293 | #endif |
276 | left->content.integerValue = content->integerValue; | 294 | left->content.value.integerValue = content->value.integerValue; |
277 | left->type = LSL_INTEGER; | 295 | left->type = LSL_INTEGER; |
278 | } | 296 | } |
279 | } | 297 | } |
@@ -284,13 +302,13 @@ static void evaluateNoToken(LSL_Leaf *content, LSL_Value *left, LSL_Value *right | |||
284 | 302 | ||
285 | static void evaluateOperationToken(LSL_Leaf *content, LSL_Value *left, LSL_Value *right) | 303 | static void evaluateOperationToken(LSL_Leaf *content, LSL_Value *left, LSL_Value *right) |
286 | { | 304 | { |
287 | if ((content) && (content->operationValue)) | 305 | if ((content) && (content->value.operationValue)) |
288 | { | 306 | { |
289 | #ifdef LUASL_DEBUG | 307 | #ifdef LUASL_DEBUG |
290 | printf(" [%s] ", tokens[content->operationValue - lowestToken]->token); | 308 | printf(" [%s] ", tokens[content->value.operationValue - lowestToken]->token); |
291 | #endif | 309 | #endif |
292 | 310 | ||
293 | switch (content->operationValue) | 311 | switch (content->value.operationValue) |
294 | { | 312 | { |
295 | case LSL_COMMA : | 313 | case LSL_COMMA : |
296 | case LSL_INCREMENT_PRE : | 314 | case LSL_INCREMENT_PRE : |
@@ -314,33 +332,33 @@ static void evaluateOperationToken(LSL_Leaf *content, LSL_Value *left, LSL_Value | |||
314 | // case LSL_TYPECAST_OPEN : | 332 | // case LSL_TYPECAST_OPEN : |
315 | // case LSL_TYPECAST_CLOSE : | 333 | // case LSL_TYPECAST_CLOSE : |
316 | break; | 334 | break; |
317 | case LSL_BIT_NOT : left->content.integerValue = ~ right->content.integerValue; break; | 335 | case LSL_BIT_NOT : left->content.value.integerValue = ~ right->content.value.integerValue; break; |
318 | case LSL_BOOL_NOT : left->content.integerValue = ! right->content.integerValue; break; | 336 | case LSL_BOOL_NOT : left->content.value.integerValue = ! right->content.value.integerValue; break; |
319 | case LSL_NEGATION : left->content.integerValue = 0 - right->content.integerValue; break; | 337 | case LSL_NEGATION : left->content.value.integerValue = 0 - right->content.value.integerValue; break; |
320 | case LSL_DIVIDE : left->content.integerValue = left->content.integerValue / right->content.integerValue; break; | 338 | case LSL_DIVIDE : left->content.value.integerValue = left->content.value.integerValue / right->content.value.integerValue; break; |
321 | case LSL_MODULO : left->content.integerValue = left->content.integerValue % right->content.integerValue; break; | 339 | case LSL_MODULO : left->content.value.integerValue = left->content.value.integerValue % right->content.value.integerValue; break; |
322 | case LSL_MULTIPLY : left->content.integerValue = left->content.integerValue * right->content.integerValue; break; | 340 | case LSL_MULTIPLY : left->content.value.integerValue = left->content.value.integerValue * right->content.value.integerValue; break; |
323 | // case LSL_DOT_PRODUCT : break; | 341 | // case LSL_DOT_PRODUCT : break; |
324 | // case LSL_CROSS_PRODUCT : break; | 342 | // case LSL_CROSS_PRODUCT : break; |
325 | case LSL_SUBTRACT : left->content.integerValue = left->content.integerValue - right->content.integerValue; break; | 343 | case LSL_SUBTRACT : left->content.value.integerValue = left->content.value.integerValue - right->content.value.integerValue; break; |
326 | case LSL_ADD : left->content.integerValue = left->content.integerValue + right->content.integerValue; break; | 344 | case LSL_ADD : left->content.value.integerValue = left->content.value.integerValue + right->content.value.integerValue; break; |
327 | // case LSL_CONCATENATE : break; | 345 | // case LSL_CONCATENATE : break; |
328 | case LSL_LEFT_SHIFT : left->content.integerValue = left->content.integerValue << right->content.integerValue; break; | 346 | case LSL_LEFT_SHIFT : left->content.value.integerValue = left->content.value.integerValue << right->content.value.integerValue; break; |
329 | case LSL_RIGHT_SHIFT : left->content.integerValue = left->content.integerValue >> right->content.integerValue; break; | 347 | case LSL_RIGHT_SHIFT : left->content.value.integerValue = left->content.value.integerValue >> right->content.value.integerValue; break; |
330 | case LSL_LESS_THAN : left->content.integerValue = left->content.integerValue < right->content.integerValue; break; | 348 | case LSL_LESS_THAN : left->content.value.integerValue = left->content.value.integerValue < right->content.value.integerValue; break; |
331 | case LSL_GREATER_THAN : left->content.integerValue = left->content.integerValue > right->content.integerValue; break; | 349 | case LSL_GREATER_THAN : left->content.value.integerValue = left->content.value.integerValue > right->content.value.integerValue; break; |
332 | case LSL_LESS_EQUAL : left->content.integerValue = left->content.integerValue <= right->content.integerValue; break; | 350 | case LSL_LESS_EQUAL : left->content.value.integerValue = left->content.value.integerValue <= right->content.value.integerValue; break; |
333 | case LSL_GREATER_EQUAL : left->content.integerValue = left->content.integerValue >= right->content.integerValue; break; | 351 | case LSL_GREATER_EQUAL : left->content.value.integerValue = left->content.value.integerValue >= right->content.value.integerValue; break; |
334 | case LSL_EQUAL : left->content.integerValue = left->content.integerValue == right->content.integerValue; break; | 352 | case LSL_EQUAL : left->content.value.integerValue = left->content.value.integerValue == right->content.value.integerValue; break; |
335 | case LSL_NOT_EQUAL : left->content.integerValue = left->content.integerValue != right->content.integerValue; break; | 353 | case LSL_NOT_EQUAL : left->content.value.integerValue = left->content.value.integerValue != right->content.value.integerValue; break; |
336 | case LSL_BIT_AND : left->content.integerValue = left->content.integerValue & right->content.integerValue; break; | 354 | case LSL_BIT_AND : left->content.value.integerValue = left->content.value.integerValue & right->content.value.integerValue; break; |
337 | case LSL_BIT_XOR : left->content.integerValue = left->content.integerValue ^ right->content.integerValue; break; | 355 | case LSL_BIT_XOR : left->content.value.integerValue = left->content.value.integerValue ^ right->content.value.integerValue; break; |
338 | case LSL_BIT_OR : left->content.integerValue = left->content.integerValue | right->content.integerValue; break; | 356 | case LSL_BIT_OR : left->content.value.integerValue = left->content.value.integerValue | right->content.value.integerValue; break; |
339 | case LSL_BOOL_OR : left->content.integerValue = left->content.integerValue || right->content.integerValue; break; | 357 | case LSL_BOOL_OR : left->content.value.integerValue = left->content.value.integerValue || right->content.value.integerValue; break; |
340 | case LSL_BOOL_AND : left->content.integerValue = left->content.integerValue && right->content.integerValue; break; | 358 | case LSL_BOOL_AND : left->content.value.integerValue = left->content.value.integerValue && right->content.value.integerValue; break; |
341 | } | 359 | } |
342 | #ifdef LUASL_DEBUG | 360 | #ifdef LUASL_DEBUG |
343 | printf(" (=%d) ", left->content.integerValue); | 361 | printf(" (=%d) ", left->content.value.integerValue); |
344 | #endif | 362 | #endif |
345 | } | 363 | } |
346 | } | 364 | } |
@@ -348,7 +366,7 @@ static void evaluateOperationToken(LSL_Leaf *content, LSL_Value *left, LSL_Value | |||
348 | static void evaluateStatementToken(LSL_Leaf *content, LSL_Value *left, LSL_Value *right) | 366 | static void evaluateStatementToken(LSL_Leaf *content, LSL_Value *left, LSL_Value *right) |
349 | { | 367 | { |
350 | if (content) | 368 | if (content) |
351 | evaluateAST(content->statementValue->expression, left, right); | 369 | evaluateAST(content->value.statementValue->expression, left, right); |
352 | } | 370 | } |
353 | 371 | ||
354 | static void outputAST(LSL_AST *ast) | 372 | static void outputAST(LSL_AST *ast) |
@@ -367,26 +385,26 @@ static void outputAST(LSL_AST *ast) | |||
367 | static void outputIntegerToken(LSL_Leaf *content) | 385 | static void outputIntegerToken(LSL_Leaf *content) |
368 | { | 386 | { |
369 | if (content) | 387 | if (content) |
370 | printf("%d", content->integerValue); | 388 | printf("%d", content->value.integerValue); |
371 | } | 389 | } |
372 | 390 | ||
373 | static void outputOperationToken(LSL_Leaf *content) | 391 | static void outputOperationToken(LSL_Leaf *content) |
374 | { | 392 | { |
375 | if (content) | 393 | if (content) |
376 | printf("%s", tokens[content->operationValue - lowestToken]->token); | 394 | printf("%s", tokens[content->value.operationValue - lowestToken]->token); |
377 | } | 395 | } |
378 | 396 | ||
379 | static void outputStatementToken(LSL_Leaf *content) | 397 | static void outputStatementToken(LSL_Leaf *content) |
380 | { | 398 | { |
381 | if (content) | 399 | if (content) |
382 | outputAST(content->statementValue->expression); | 400 | outputAST(content->value.statementValue->expression); |
383 | printf(";"); | 401 | printf(";"); |
384 | } | 402 | } |
385 | 403 | ||
386 | static void outputSpaceToken(LSL_Leaf *content) | 404 | static void outputSpaceToken(LSL_Leaf *content) |
387 | { | 405 | { |
388 | if (content) | 406 | if (content) |
389 | printf("%s", content->spaceValue); | 407 | printf("%s", content->value.spaceValue); |
390 | } | 408 | } |
391 | 409 | ||
392 | static void convertAST2Lua(LSL_AST *ast) | 410 | static void convertAST2Lua(LSL_AST *ast) |
@@ -523,9 +541,9 @@ int main(int argc, char **argv) | |||
523 | { | 541 | { |
524 | LSL_Value left, right; | 542 | LSL_Value left, right; |
525 | 543 | ||
526 | left.content.integerValue = 0; | 544 | left.content.value.integerValue = 0; |
527 | left.type = LSL_INTEGER; | 545 | left.type = LSL_INTEGER; |
528 | right.content.integerValue = 0; | 546 | right.content.value.integerValue = 0; |
529 | right.type = LSL_INTEGER; | 547 | right.type = LSL_INTEGER; |
530 | evaluateAST(ast, &left, &right); | 548 | evaluateAST(ast, &left, &right); |
531 | 549 | ||
@@ -535,7 +553,7 @@ int main(int argc, char **argv) | |||
535 | printf("Result of -\n"); | 553 | printf("Result of -\n"); |
536 | outputAST(ast); | 554 | outputAST(ast); |
537 | printf("\n"); | 555 | printf("\n"); |
538 | printf("is %d %d. And converted to Lua it is -\n", left.content.integerValue, right.content.integerValue); | 556 | printf("is %d %d. And converted to Lua it is -\n", left.content.value.integerValue, right.content.value.integerValue); |
539 | convertAST2Lua(ast); | 557 | convertAST2Lua(ast); |
540 | printf("\n"); | 558 | printf("\n"); |
541 | burnAST(ast); | 559 | burnAST(ast); |