diff options
author | David Walter Seikel | 2012-01-12 03:14:17 +1000 |
---|---|---|
committer | David Walter Seikel | 2012-01-12 03:14:17 +1000 |
commit | fc5d487de27aa7aa17502008c848d06758223888 (patch) | |
tree | 8f3007f53f49c146ae6c30a100decd3b3a0af1dd /LuaSL/src/LuaSL_LSL_tree.c | |
parent | Leaf cloner. (diff) | |
download | SledjHamr-fc5d487de27aa7aa17502008c848d06758223888.zip SledjHamr-fc5d487de27aa7aa17502008c848d06758223888.tar.gz SledjHamr-fc5d487de27aa7aa17502008c848d06758223888.tar.bz2 SledjHamr-fc5d487de27aa7aa17502008c848d06758223888.tar.xz |
Switch to the lemon parser.
Diffstat (limited to '')
-rw-r--r-- | LuaSL/src/LuaSL_LSL_tree.c | 246 |
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 @@ | |||
6 | static void evaluateIntegerToken(LSL_Leaf *content, LSL_Leaf *left, LSL_Leaf *right); | 6 | static void evaluateIntegerToken(LSL_Leaf *content, LSL_Leaf *left, LSL_Leaf *right); |
7 | static void evaluateNoToken(LSL_Leaf *content, LSL_Leaf *left, LSL_Leaf *right); | 7 | static void evaluateNoToken(LSL_Leaf *content, LSL_Leaf *left, LSL_Leaf *right); |
8 | static void evaluateOperationToken(LSL_Leaf *content, LSL_Leaf *left, LSL_Leaf *right); | 8 | static void evaluateOperationToken(LSL_Leaf *content, LSL_Leaf *left, LSL_Leaf *right); |
9 | static void eveluateParenthesisToken(LSL_Leaf *content, LSL_Leaf *left, LSL_Leaf *right); | ||
9 | static void evaluateStatementToken(LSL_Leaf *content, LSL_Leaf *left, LSL_Leaf *right); | 10 | static void evaluateStatementToken(LSL_Leaf *content, LSL_Leaf *left, LSL_Leaf *right); |
10 | static void outputIntegerToken(LSL_Leaf *content); | 11 | static void outputIntegerToken(LSL_Leaf *content); |
11 | static void outputOperationToken(LSL_Leaf *content); | 12 | static void outputParenthesisToken(LSL_Leaf *content); |
12 | static void outputStatementToken(LSL_Leaf *content); | 13 | static void outputStatementToken(LSL_Leaf *content); |
13 | static void outputSpaceToken(LSL_Leaf *content); | 14 | static 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 | ||
131 | static LSL_Leaf *newLeaf(LSL_Type type, LSL_Leaf *left, LSL_Leaf *right) | 132 | static 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 | ||
145 | static void burnLeaf(LSL_Leaf *leaf) | 146 | void 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 | ||
157 | static 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 | |||
167 | LSL_Leaf *addInteger(LSL_Leaf *lval, int value) | ||
168 | { | ||
169 | return cloneLeaf(lval); | ||
170 | } | ||
171 | |||
172 | LSL_Leaf *addOperation(LSL_Leaf *lval, LSL_Type type, LSL_Leaf *left, LSL_Leaf *right) | 158 | LSL_Leaf *addOperation(LSL_Leaf *lval, LSL_Type type, LSL_Leaf *left, LSL_Leaf *right) |
173 | { | 159 | { |
174 | LSL_Leaf *leaf = newLeaf(type, left, right); | 160 | printf("******************************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 | ||
193 | LSL_Leaf *addParenthesis(LSL_Leaf *lval, LSL_Leaf *expr) | 179 | LSL_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 | ||
206 | LSL_Statement *createStatement(LSL_Type type, LSL_Leaf *expr) | 194 | LSL_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)); |
197 | printf("******************************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 | |||
216 | LSL_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 | ||
228 | static void evaluateLeaf(LSL_Leaf *leaf, LSL_Leaf *left, LSL_Leaf *right) | 210 | static 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 | ||
334 | static 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 | |||
352 | static void evaluateStatementToken(LSL_Leaf *content, LSL_Leaf *left, LSL_Leaf *right) | 341 | static 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 | ||
358 | static void outputLeaf(LSL_Leaf *leaf) | 352 | static 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 | ||
379 | static void outputOperationToken(LSL_Leaf *content) | 373 | static 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 | ||
385 | static void outputStatementToken(LSL_Leaf *content) | 383 | static 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 | ||
392 | static void outputSpaceToken(LSL_Leaf *content) | 394 | static 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 | { |
485 | strcpy(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(¶m)) | ||
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 | { | ||
541 | printf("******************************PARSING - %d %s\n", yv, param.lval->token->token); | ||
542 | Parse(pParser, yv, param.lval, ¶m); | ||
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, ¶m); | ||
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 | { |