aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/LuaSL/src/LuaSL_LSL_tree.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--LuaSL/src/LuaSL_LSL_tree.c246
1 files changed, 136 insertions, 110 deletions
diff --git a/LuaSL/src/LuaSL_LSL_tree.c b/LuaSL/src/LuaSL_LSL_tree.c
index 3728054..a0c07f0 100644
--- a/LuaSL/src/LuaSL_LSL_tree.c
+++ b/LuaSL/src/LuaSL_LSL_tree.c
@@ -6,9 +6,10 @@
6static void evaluateIntegerToken(LSL_Leaf *content, LSL_Leaf *left, LSL_Leaf *right); 6static void evaluateIntegerToken(LSL_Leaf *content, LSL_Leaf *left, LSL_Leaf *right);
7static void evaluateNoToken(LSL_Leaf *content, LSL_Leaf *left, LSL_Leaf *right); 7static void evaluateNoToken(LSL_Leaf *content, LSL_Leaf *left, LSL_Leaf *right);
8static void evaluateOperationToken(LSL_Leaf *content, LSL_Leaf *left, LSL_Leaf *right); 8static void evaluateOperationToken(LSL_Leaf *content, LSL_Leaf *left, LSL_Leaf *right);
9static void eveluateParenthesisToken(LSL_Leaf *content, LSL_Leaf *left, LSL_Leaf *right);
9static void evaluateStatementToken(LSL_Leaf *content, LSL_Leaf *left, LSL_Leaf *right); 10static void evaluateStatementToken(LSL_Leaf *content, LSL_Leaf *left, LSL_Leaf *right);
10static void outputIntegerToken(LSL_Leaf *content); 11static void outputIntegerToken(LSL_Leaf *content);
11static void outputOperationToken(LSL_Leaf *content); 12static void outputParenthesisToken(LSL_Leaf *content);
12static void outputStatementToken(LSL_Leaf *content); 13static void outputStatementToken(LSL_Leaf *content);
13static void outputSpaceToken(LSL_Leaf *content); 14static void outputSpaceToken(LSL_Leaf *content);
14 15
@@ -22,54 +23,54 @@ LSL_Token LSL_Tokens[] =
22 // Left to right, unless oterwise stated. 23 // Left to right, unless oterwise stated.
23 // According to http://wiki.secondlife.com/wiki/Category:LSL_Operators 24 // According to http://wiki.secondlife.com/wiki/Category:LSL_Operators
24 25
25 {LSL_BOOL_AND, "&&", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, 26 {LSL_BOOL_AND, "&&", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken},
26// QUIRK - Seems to be some disagreement about BOOL_AND/BOOL_OR precedence. Either they are equal, or OR is higher. 27// QUIRK - Seems to be some disagreement about BOOL_AND/BOOL_OR precedence. Either they are equal, or OR is higher.
27// QUIRK - No boolean short circuiting. 28// QUIRK - No boolean short circuiting.
28 {LSL_BOOL_OR, "||", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, 29 {LSL_BOOL_OR, "||", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken},
29 {LSL_BIT_OR, "|", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, 30 {LSL_BIT_OR, "|", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken},
30 {LSL_BIT_XOR, "^", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, 31 {LSL_BIT_XOR, "^", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken},
31 {LSL_BIT_AND, "&", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, 32 {LSL_BIT_AND, "&", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken},
32// QUIRK - Conditionals are executed right to left. Or left to right, depending on who you ask. lol 33// QUIRK - Conditionals are executed right to left. Or left to right, depending on who you ask. lol
33 {LSL_NOT_EQUAL, "!=", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, 34 {LSL_NOT_EQUAL, "!=", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken},
34 {LSL_EQUAL, "==", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, 35 {LSL_EQUAL, "==", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken},
35 {LSL_GREATER_EQUAL, ">=", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, 36 {LSL_GREATER_EQUAL, ">=", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken},
36 {LSL_LESS_EQUAL, "<=", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, 37 {LSL_LESS_EQUAL, "<=", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken},
37 {LSL_GREATER_THAN, ">", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, 38 {LSL_GREATER_THAN, ">", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken},
38 {LSL_LESS_THAN, "<", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, 39 {LSL_LESS_THAN, "<", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken},
39 {LSL_RIGHT_SHIFT, ">>", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, 40 {LSL_RIGHT_SHIFT, ">>", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken},
40 {LSL_LEFT_SHIFT, "<<", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, 41 {LSL_LEFT_SHIFT, "<<", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken},
41// {LSL_CONCATENATE, "+", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, 42// {LSL_CONCATENATE, "+", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken},
42 {LSL_ADD, "+", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, 43 {LSL_ADD, "+", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken},
43 {LSL_SUBTRACT, "-", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, 44 {LSL_SUBTRACT, "-", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken},
44// {LSL_CROSS_PRODUCT, "%", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, 45// {LSL_CROSS_PRODUCT, "%", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken},
45// {LSL_DOT_PRODUCT, "*", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, 46// {LSL_DOT_PRODUCT, "*", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken},
46 {LSL_MULTIPLY, "*", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, 47 {LSL_MULTIPLY, "*", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken},
47 {LSL_MODULO, "%", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, 48 {LSL_MODULO, "%", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken},
48 {LSL_DIVIDE, "/", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, 49 {LSL_DIVIDE, "/", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken},
49 {LSL_NEGATION, "-", LSL_RIGHT2LEFT | LSL_UNARY, outputOperationToken, NULL, evaluateOperationToken}, 50 {LSL_NEGATION, "-", LSL_RIGHT2LEFT | LSL_UNARY, NULL, NULL, evaluateOperationToken},
50 {LSL_BOOL_NOT, "!", LSL_RIGHT2LEFT | LSL_UNARY, outputOperationToken, NULL, evaluateOperationToken}, 51 {LSL_BOOL_NOT, "!", LSL_RIGHT2LEFT | LSL_UNARY, NULL, NULL, evaluateOperationToken},
51 {LSL_BIT_NOT, "~", LSL_RIGHT2LEFT | LSL_UNARY, outputOperationToken, NULL, evaluateOperationToken}, 52 {LSL_BIT_NOT, "~", LSL_RIGHT2LEFT | LSL_UNARY, NULL, NULL, evaluateOperationToken},
52// {LSL_TYPECAST_CLOSE, ")", LSL_RIGHT2LEFT | LSL_UNARY, outputOperationToken, NULL, evaluateOperationToken}, 53// {LSL_TYPECAST_CLOSE, ")", LSL_RIGHT2LEFT | LSL_UNARY, NULL, NULL, evaluateOperationToken},
53// {LSL_TYPECAST_OPEN, "(", LSL_RIGHT2LEFT | LSL_UNARY, outputOperationToken, NULL, evaluateOperationToken}, 54// {LSL_TYPECAST_OPEN, "(", LSL_RIGHT2LEFT | LSL_UNARY, NULL, NULL, evaluateOperationToken},
54 {LSL_ANGLE_CLOSE, ">", LSL_LEFT2RIGHT | LSL_CREATION, outputOperationToken, NULL, evaluateOperationToken}, 55 {LSL_ANGLE_CLOSE, ">", LSL_LEFT2RIGHT | LSL_CREATION, NULL, NULL, evaluateOperationToken},
55 {LSL_ANGLE_OPEN, "<", LSL_LEFT2RIGHT | LSL_CREATION, outputOperationToken, NULL, evaluateOperationToken}, 56 {LSL_ANGLE_OPEN, "<", LSL_LEFT2RIGHT | LSL_CREATION, NULL, NULL, evaluateOperationToken},
56 {LSL_BRACKET_CLOSE, "]", LSL_INNER2OUTER | LSL_CREATION, outputOperationToken, NULL, evaluateOperationToken}, 57 {LSL_BRACKET_CLOSE, "]", LSL_INNER2OUTER | LSL_CREATION, NULL, NULL, evaluateOperationToken},
57 {LSL_BRACKET_OPEN, "[", LSL_INNER2OUTER | LSL_CREATION, outputOperationToken, NULL, evaluateOperationToken}, 58 {LSL_BRACKET_OPEN, "[", LSL_INNER2OUTER | LSL_CREATION, NULL, NULL, evaluateOperationToken},
58 {LSL_PARENTHESIS_CLOSE, ")", LSL_INNER2OUTER, NULL, NULL, evaluateNoToken}, 59 {LSL_PARENTHESIS_CLOSE, ")", LSL_INNER2OUTER, NULL, NULL, evaluateNoToken},
59 {LSL_PARENTHESIS_OPEN, "(", LSL_INNER2OUTER, NULL, NULL, NULL}, 60 {LSL_PARENTHESIS_OPEN, "(", LSL_INNER2OUTER, outputParenthesisToken, NULL, eveluateParenthesisToken},
60// {LSL_ASSIGNMENT_CONCATENATE, "+=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, outputOperationToken, NULL, evaluateOperationToken}, 61// {LSL_ASSIGNMENT_CONCATENATE, "+=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, NULL, NULL, evaluateOperationToken},
61 {LSL_ASSIGNMENT_ADD, "+=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, outputOperationToken, NULL, evaluateOperationToken}, 62 {LSL_ASSIGNMENT_ADD, "+=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, NULL, NULL, evaluateOperationToken},
62 {LSL_ASSIGNMENT_SUBTRACT, "-=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, outputOperationToken, NULL, evaluateOperationToken}, 63 {LSL_ASSIGNMENT_SUBTRACT, "-=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, NULL, NULL, evaluateOperationToken},
63 {LSL_ASSIGNMENT_MULTIPLY, "*=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, outputOperationToken, NULL, evaluateOperationToken}, 64 {LSL_ASSIGNMENT_MULTIPLY, "*=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, NULL, NULL, evaluateOperationToken},
64 {LSL_ASSIGNMENT_MODULO, "%=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, outputOperationToken, NULL, evaluateOperationToken}, 65 {LSL_ASSIGNMENT_MODULO, "%=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, NULL, NULL, evaluateOperationToken},
65 {LSL_ASSIGNMENT_DIVIDE, "/=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, outputOperationToken, NULL, evaluateOperationToken}, 66 {LSL_ASSIGNMENT_DIVIDE, "/=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, NULL, NULL, evaluateOperationToken},
66 {LSL_ASSIGNMENT_PLAIN, "=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, outputOperationToken, NULL, evaluateOperationToken}, 67 {LSL_ASSIGNMENT_PLAIN, "=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, NULL, NULL, evaluateOperationToken},
67 {LSL_DOT, ".", LSL_RIGHT2LEFT, outputOperationToken, NULL, evaluateOperationToken}, 68 {LSL_DOT, ".", LSL_RIGHT2LEFT, NULL, NULL, evaluateOperationToken},
68// {LSL_DECREMENT_POST, "--", LSL_RIGHT2LEFT | LSL_UNARY, outputOperationToken, NULL, evaluateOperationToken}, 69// {LSL_DECREMENT_POST, "--", LSL_RIGHT2LEFT | LSL_UNARY, NULL, NULL, evaluateOperationToken},
69 {LSL_DECREMENT_PRE, "--", LSL_RIGHT2LEFT | LSL_UNARY, outputOperationToken, NULL, evaluateOperationToken}, 70 {LSL_DECREMENT_PRE, "--", LSL_RIGHT2LEFT | LSL_UNARY, NULL, NULL, evaluateOperationToken},
70// {LSL_INCREMENT_POST, "++", LSL_RIGHT2LEFT | LSL_UNARY, outputOperationToken, NULL, evaluateOperationToken}, 71// {LSL_INCREMENT_POST, "++", LSL_RIGHT2LEFT | LSL_UNARY, NULL, NULL, evaluateOperationToken},
71 {LSL_INCREMENT_PRE, "++", LSL_RIGHT2LEFT | LSL_UNARY, outputOperationToken, NULL, evaluateOperationToken}, 72 {LSL_INCREMENT_PRE, "++", LSL_RIGHT2LEFT | LSL_UNARY, NULL, NULL, evaluateOperationToken},
72 {LSL_COMMA, ",", LSL_LEFT2RIGHT, outputOperationToken, NULL, evaluateOperationToken}, 73 {LSL_COMMA, ",", LSL_LEFT2RIGHT, NULL, NULL, evaluateOperationToken},
73 74
74 {LSL_EXPRESSION, "expression", LSL_NONE, NULL, NULL, NULL}, 75 {LSL_EXPRESSION, "expression", LSL_NONE, NULL, NULL, NULL},
75 76
@@ -108,14 +109,14 @@ LSL_Token LSL_Tokens[] =
108 {LSL_RETURN, "return", LSL_NONE, NULL, NULL, NULL}, 109 {LSL_RETURN, "return", LSL_NONE, NULL, NULL, NULL},
109 {LSL_STATE_CHANGE, "state", LSL_NONE, NULL, NULL, NULL}, 110 {LSL_STATE_CHANGE, "state", LSL_NONE, NULL, NULL, NULL},
110 {LSL_WHILE, "while", LSL_NONE, NULL, NULL, NULL}, 111 {LSL_WHILE, "while", LSL_NONE, NULL, NULL, NULL},
111 {LSL_STATEMENT, ";", LSL_NONE, outputStatementToken, NULL, evaluateStatementToken}, 112 {LSL_STATEMENT, ";", LSL_NOIGNORE, outputStatementToken, NULL, evaluateStatementToken},
112 113
113 {LSL_BLOCK_CLOSE, "}", LSL_NONE, NULL, NULL, NULL}, 114 {LSL_BLOCK_CLOSE, "}", LSL_NONE, NULL, NULL, NULL},
114 {LSL_BLOCK_OPEN, "{", LSL_NONE, NULL, NULL, NULL}, 115 {LSL_BLOCK_OPEN, "{", LSL_NONE, NULL, NULL, NULL},
115// {LSL_PARAMETER, "parameter", LSL_NONE, NULL, NULL, NULL}, 116// {LSL_PARAMETER, "parameter", LSL_NONE, NULL, NULL, NULL},
116// {LSL_FUNCTION, "function", LSL_NONE, NULL, NULL, NULL}, 117// {LSL_FUNCTION, "function", LSL_NONE, NULL, NULL, NULL},
117// {LSL_STATE, "state", LSL_NONE, NULL, NULL, NULL}, 118// {LSL_STATE, "state", LSL_NONE, NULL, NULL, NULL},
118// {LSL_SCRIPT, "script", LSL_NONE, NULL, NULL, NULL}, 119 {LSL_SCRIPT, "", LSL_NONE, NULL, NULL, NULL},
119 120
120 {LSL_UNKNOWN, "unknown", LSL_NONE, NULL, NULL, NULL}, 121 {LSL_UNKNOWN, "unknown", LSL_NONE, NULL, NULL, NULL},
121 122
@@ -130,7 +131,7 @@ int lowestToken = 999999;
130 131
131static LSL_Leaf *newLeaf(LSL_Type type, LSL_Leaf *left, LSL_Leaf *right) 132static LSL_Leaf *newLeaf(LSL_Type type, LSL_Leaf *left, LSL_Leaf *right)
132{ 133{
133 LSL_Leaf *leaf = malloc(sizeof(LSL_Leaf)); 134 LSL_Leaf *leaf = calloc(1, sizeof(LSL_Leaf));
134 135
135 if (leaf) 136 if (leaf)
136 { 137 {
@@ -142,7 +143,7 @@ static LSL_Leaf *newLeaf(LSL_Type type, LSL_Leaf *left, LSL_Leaf *right)
142 return leaf; 143 return leaf;
143} 144}
144 145
145static void burnLeaf(LSL_Leaf *leaf) 146void burnLeaf(LSL_Leaf *leaf)
146{ 147{
147 if (leaf) 148 if (leaf)
148 { 149 {
@@ -154,75 +155,56 @@ static void burnLeaf(LSL_Leaf *leaf)
154 } 155 }
155} 156}
156 157
157static LSL_Leaf *cloneLeaf(LSL_Leaf *source)
158{
159 LSL_Leaf *leaf = newLeaf(LSL_UNKNOWN, NULL, NULL);
160
161 if (leaf)
162 memcpy(leaf, source, sizeof(LSL_Leaf));
163
164 return leaf;
165}
166
167LSL_Leaf *addInteger(LSL_Leaf *lval, int value)
168{
169 return cloneLeaf(lval);
170}
171
172LSL_Leaf *addOperation(LSL_Leaf *lval, LSL_Type type, LSL_Leaf *left, LSL_Leaf *right) 158LSL_Leaf *addOperation(LSL_Leaf *lval, LSL_Type type, LSL_Leaf *left, LSL_Leaf *right)
173{ 159{
174 LSL_Leaf *leaf = newLeaf(type, left, right); 160printf("******************************addOperation(%s, %d, , )\n", lval->token->token, type);
175 161 if (lval)
176 if (leaf)
177 { 162 {
163 lval->left = left;
164 lval->right = right;
178 if (LSL_EXPRESSION == type) 165 if (LSL_EXPRESSION == type)
179 { 166 {
180 leaf->value.expressionValue = right; 167 lval->value.expressionValue = right;
181 leaf->left = NULL; 168 lval->left = NULL;
182 } 169 }
183 else 170 else
184 { 171 {
185 leaf->value.operationValue = type; 172 lval->value.operationValue = type;
186 leaf->ignorableText = lval->ignorableText;
187 } 173 }
188 } 174 }
189 175
190 return leaf; 176 return lval;
191} 177}
192 178
193LSL_Leaf *addParenthesis(LSL_Leaf *lval, LSL_Leaf *expr) 179LSL_Leaf *addParenthesis(LSL_Leaf *lval, LSL_Leaf *expr, LSL_Leaf *rval)
194{ 180{
195 LSL_Leaf *leaf = newLeaf(LSL_PARENTHESIS_OPEN, NULL, expr); 181 LSL_Parenthesis *parens = malloc(sizeof(LSL_Parenthesis));
196 182
197 if (leaf) 183 if (parens)
198 { 184 {
199 leaf->ignorableText = lval->ignorableText; 185 parens->left = lval;
200 leaf = newLeaf(LSL_PARENTHESIS_CLOSE, leaf, NULL); 186 parens->expression = expr;
187 parens->right = rval;
188 if (lval)
189 lval->value.parenthesis = parens;
201 } 190 }
202 191 return lval;
203 return leaf;
204} 192}
205 193
206LSL_Statement *createStatement(LSL_Type type, LSL_Leaf *expr) 194LSL_Leaf *addStatement(LSL_Leaf *lval, LSL_Type type, LSL_Leaf *expr)
207{ 195{
208 LSL_Statement *stat = malloc(sizeof(LSL_Statement)); 196 LSL_Statement *stat = malloc(sizeof(LSL_Statement));
197printf("******************************addStatement(%s, %d, , )\n", lval->token->token, type);
209 198
210 if (stat) 199 if (stat)
211 stat->expressions = expr;
212
213 return stat;
214}
215
216LSL_Leaf *addStatement(LSL_Statement *statement, LSL_Leaf *root)
217{
218 LSL_Leaf *leaf = newLeaf(LSL_STATEMENT, root, NULL);
219
220 if (leaf)
221 { 200 {
222 leaf->value.statementValue = statement; 201 stat->type = type;
202 stat->expressions = expr;
203 if (lval)
204 lval->value.statementValue = stat;
223 } 205 }
224 206
225 return leaf; 207 return lval;
226} 208}
227 209
228static void evaluateLeaf(LSL_Leaf *leaf, LSL_Leaf *left, LSL_Leaf *right) 210static void evaluateLeaf(LSL_Leaf *leaf, LSL_Leaf *left, LSL_Leaf *right)
@@ -349,10 +331,22 @@ static void evaluateOperationToken(LSL_Leaf *content, LSL_Leaf *left, LSL_Leaf *
349 } 331 }
350} 332}
351 333
334static void eveluateParenthesisToken(LSL_Leaf *content, LSL_Leaf *left, LSL_Leaf *right)
335{
336 if (content)
337 evaluateLeaf(content->value.parenthesis->expression, left, right);
338}
339
340
352static void evaluateStatementToken(LSL_Leaf *content, LSL_Leaf *left, LSL_Leaf *right) 341static void evaluateStatementToken(LSL_Leaf *content, LSL_Leaf *left, LSL_Leaf *right)
353{ 342{
354 if (content) 343 if (content)
344 {
355 evaluateLeaf(content->value.statementValue->expressions, left, right); 345 evaluateLeaf(content->value.statementValue->expressions, left, right);
346 printf("\nResult is %d.\n", left->value.integerValue);
347 left->value.integerValue = 0;
348 right->value.integerValue = 0;
349 }
356} 350}
357 351
358static void outputLeaf(LSL_Leaf *leaf) 352static void outputLeaf(LSL_Leaf *leaf)
@@ -360,7 +354,7 @@ static void outputLeaf(LSL_Leaf *leaf)
360 if (leaf) 354 if (leaf)
361 { 355 {
362 outputLeaf(leaf->left); 356 outputLeaf(leaf->left);
363 if (leaf->ignorableText) 357 if ((!(LSL_NOIGNORE & leaf->token->flags)) && (leaf->ignorableText))
364 printf("%s", leaf->ignorableText); 358 printf("%s", leaf->ignorableText);
365 if (leaf->token->output) 359 if (leaf->token->output)
366 leaf->token->output(leaf); 360 leaf->token->output(leaf);
@@ -376,17 +370,25 @@ static void outputIntegerToken(LSL_Leaf *content)
376 printf("%d", content->value.integerValue); 370 printf("%d", content->value.integerValue);
377} 371}
378 372
379static void outputOperationToken(LSL_Leaf *content) 373static void outputParenthesisToken(LSL_Leaf *content)
380{ 374{
381 if (content) 375 if (content)
376 {
382 printf("%s", content->token->token); 377 printf("%s", content->token->token);
378 outputLeaf(content->value.parenthesis->expression);
379 outputLeaf(content->value.parenthesis->right);
380 }
383} 381}
384 382
385static void outputStatementToken(LSL_Leaf *content) 383static void outputStatementToken(LSL_Leaf *content)
386{ 384{
387 if (content) 385 if (content)
386 {
388 outputLeaf(content->value.statementValue->expressions); 387 outputLeaf(content->value.statementValue->expressions);
389 printf(";"); 388 if (content->ignorableText)
389 printf("%s", content->ignorableText);
390 printf("%s", content->token->token);
391 }
390} 392}
391 393
392static void outputSpaceToken(LSL_Leaf *content) 394static void outputSpaceToken(LSL_Leaf *content)
@@ -400,6 +402,8 @@ static void convertLeaf2Lua(LSL_Leaf *leaf)
400 if (leaf) 402 if (leaf)
401 { 403 {
402 convertLeaf2Lua(leaf->left); 404 convertLeaf2Lua(leaf->left);
405 if ((!(LSL_NOIGNORE & leaf->token->flags)) && (leaf->ignorableText))
406 printf("%s", leaf->ignorableText);
403 if (leaf->token->convert) 407 if (leaf->token->convert)
404 leaf->token->convert(leaf); 408 leaf->token->convert(leaf);
405 else if (leaf->token->output) 409 else if (leaf->token->output)
@@ -426,8 +430,7 @@ int main(int argc, char **argv)
426 { 430 {
427 char buffer[4096]; 431 char buffer[4096];
428 LuaSL_yyparseParam param; 432 LuaSL_yyparseParam param;
429 int count; 433 int file;
430 FILE *file;
431 boolean badArgs = FALSE; 434 boolean badArgs = FALSE;
432 435
433 // Sort the token table. 436 // Sort the token table.
@@ -474,11 +477,13 @@ int main(int argc, char **argv)
474 printf("Usage: %s [-f filename]\n", programName); 477 printf("Usage: %s [-f filename]\n", programName);
475 printf(" -f: Script file to run.\n"); 478 printf(" -f: Script file to run.\n");
476 printf("Or pass filenames in stdin.\n"); 479 printf("Or pass filenames in stdin.\n");
477 return 1; 480// return 1;
478 } 481 }
479 482
480 if ('\0' == buffer[0]) 483 if ('\0' == buffer[0])
481 { 484 {
485strcpy(buffer, "test.lsl");
486/*
482 count = read(STDIN_FILENO, buffer, sizeof(buffer)); 487 count = read(STDIN_FILENO, buffer, sizeof(buffer));
483 if (0 > count) 488 if (0 > count)
484 { 489 {
@@ -495,33 +500,55 @@ int main(int argc, char **argv)
495 buffer[count] = '\0'; 500 buffer[count] = '\0';
496 printf("Filename %s in stdin.\n", buffer); 501 printf("Filename %s in stdin.\n", buffer);
497 } 502 }
503*/
498 } 504 }
499 else 505 else
500 printf("Filename %s in argument.\n", buffer); 506 printf("Filename %s in argument.\n", buffer);
501 507
502 file = fopen(buffer, "r"); 508 file = open(buffer, 0);
503 if (NULL == file) 509 if (-1 == file)
504 { 510 {
505 printf("Error opening file %s.\n", buffer); 511 printf("Error opening file %s.\n", buffer);
506 return 1; 512 return 1;
507 } 513 }
508
509#ifdef LUASL_DEBUG 514#ifdef LUASL_DEBUG
510 yydebug= 5; 515// yydebug= 5;
511#endif 516#endif
512 517
513 param.ast = NULL; 518 param.ast = NULL;
519 param.lval = calloc(1, sizeof(LSL_Leaf));
514 if (yylex_init(&(param.scanner))) 520 if (yylex_init(&(param.scanner)))
515 return 1; 521 return 1;
516 522
517#ifdef LUASL_DEBUG 523#ifdef LUASL_DEBUG
518 yyset_debug(1, param.scanner); 524 yyset_debug(1, param.scanner);
519#endif 525#endif
520 yyset_in(file, param.scanner); 526// yyset_in(file, param.scanner);
521 527
522 if (!yyparse(&param))
523 { 528 {
529 void *pParser = ParseAlloc(malloc);
530 int yv;
531
532 ParseTrace(stdout, "LSL_lemon ");
533
534 while ((i = read(file, buffer, 4095)) > 0)
535 {
536 buffer[i] = '\0';
537 yy_scan_string(buffer, param.scanner);
538 // on EOF yylex will return 0
539 while((yv = yylex(param.lval, param.scanner)) != 0)
540 {
541printf("******************************PARSING - %d %s\n", yv, param.lval->token->token);
542 Parse(pParser, yv, param.lval, &param);
543 if (LSL_SCRIPT == yv)
544 break;
545 param.lval = calloc(1, sizeof(LSL_Leaf));
546 }
547 }
548
524 yylex_destroy(param.scanner); 549 yylex_destroy(param.scanner);
550 Parse (pParser, 0, param.lval, &param);
551 ParseFree(pParser, free);
525 552
526 if (param.ast) 553 if (param.ast)
527 { 554 {
@@ -531,20 +558,19 @@ int main(int argc, char **argv)
531 left.token = tokens[LSL_INTEGER - lowestToken]; 558 left.token = tokens[LSL_INTEGER - lowestToken];
532 right.value.integerValue = 0; 559 right.value.integerValue = 0;
533 right.token = tokens[LSL_INTEGER - lowestToken]; 560 right.token = tokens[LSL_INTEGER - lowestToken];
534 evaluateLeaf(param.ast, &left, &right);
535 561
536#ifdef LUASL_DEBUG
537 printf("\n");
538#endif
539 printf("Result of -\n");
540 outputLeaf(param.ast); 562 outputLeaf(param.ast);
541 printf("\n"); 563 printf("\n");
542 printf("is %d %d. And converted to Lua it is -\n", left.value.integerValue, right.value.integerValue); 564 evaluateLeaf(param.ast, &left, &right);
565
566 printf("\nAnd converted to Lua it is -\n");
543 convertLeaf2Lua(param.ast); 567 convertLeaf2Lua(param.ast);
544 printf("\n"); 568 printf("\n");
545 burnLeaf(param.ast); 569 burnLeaf(param.ast);
546 } 570 }
571
547 } 572 }
573
548 } 574 }
549 else 575 else
550 { 576 {