diff options
Diffstat (limited to 'LuaSL')
-rw-r--r-- | LuaSL/src/LuaSL_LSL_tree.c | 64 | ||||
-rw-r--r-- | LuaSL/src/LuaSL_LSL_tree.h | 7 | ||||
-rw-r--r-- | LuaSL/src/LuaSL_lexer.l | 1 | ||||
-rw-r--r-- | LuaSL/src/LuaSL_yaccer.y | 10 | ||||
-rw-r--r-- | LuaSL/test.lsl | 2 |
5 files changed, 76 insertions, 8 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 | } |
diff --git a/LuaSL/src/LuaSL_LSL_tree.h b/LuaSL/src/LuaSL_LSL_tree.h index e01273b..597db54 100644 --- a/LuaSL/src/LuaSL_LSL_tree.h +++ b/LuaSL/src/LuaSL_LSL_tree.h | |||
@@ -3,7 +3,7 @@ | |||
3 | #define __EXPRESSION_H__ | 3 | #define __EXPRESSION_H__ |
4 | 4 | ||
5 | //#define LUASL_USE_ENUM | 5 | //#define LUASL_USE_ENUM |
6 | //#define LUASL_DEBUG | 6 | #define LUASL_DEBUG |
7 | 7 | ||
8 | #ifndef LUASL_USE_ENUM | 8 | #ifndef LUASL_USE_ENUM |
9 | #include "LuaSL_yaccer.tab.h" | 9 | #include "LuaSL_yaccer.tab.h" |
@@ -134,7 +134,7 @@ typedef int LSL_Type; | |||
134 | typedef struct | 134 | typedef struct |
135 | { | 135 | { |
136 | LSL_Type type; | 136 | LSL_Type type; |
137 | struct LSL_AST *expressions; | 137 | struct LSL_AST *expression; |
138 | } LSL_Statement; | 138 | } LSL_Statement; |
139 | 139 | ||
140 | typedef struct | 140 | typedef struct |
@@ -258,6 +258,9 @@ typedef struct | |||
258 | LSL_AST *addExpression(LSL_AST *exp); | 258 | LSL_AST *addExpression(LSL_AST *exp); |
259 | LSL_AST *addInteger(int value); | 259 | LSL_AST *addInteger(int value); |
260 | LSL_AST *addOperation(LSL_Operation type, LSL_AST *left, LSL_AST *right); | 260 | LSL_AST *addOperation(LSL_Operation type, LSL_AST *left, LSL_AST *right); |
261 | LSL_AST *addParenthesis(LSL_AST *expr); | ||
262 | LSL_Statement *createStatement(LSL_Type type, LSL_AST *expr); | ||
263 | LSL_AST *addStatement(LSL_Statement *statement, LSL_AST *left); | ||
261 | 264 | ||
262 | int yyerror(const char *msg); | 265 | int yyerror(const char *msg); |
263 | int yyparse(void *param); | 266 | int yyparse(void *param); |
diff --git a/LuaSL/src/LuaSL_lexer.l b/LuaSL/src/LuaSL_lexer.l index d52ea4b..91e4264 100644 --- a/LuaSL/src/LuaSL_lexer.l +++ b/LuaSL/src/LuaSL_lexer.l | |||
@@ -39,6 +39,7 @@ FLOAT {INTEGER}("."{INTEGER})?{EXPONANT}? | |||
39 | {FLOAT} %{ ECHO; /* yylval->floatValue = atof(yytext); return LSL_FLOAT; */ %} | 39 | {FLOAT} %{ ECHO; /* yylval->floatValue = atof(yytext); return LSL_FLOAT; */ %} |
40 | 40 | ||
41 | /* Expression tokens */ | 41 | /* Expression tokens */ |
42 | ";" { ECHO; return LSL_STATEMENT; } | ||
42 | "&&" { ECHO; return LSL_BOOL_AND; } | 43 | "&&" { ECHO; return LSL_BOOL_AND; } |
43 | "||" { ECHO; return LSL_BOOL_OR; } | 44 | "||" { ECHO; return LSL_BOOL_OR; } |
44 | "|" { ECHO; return LSL_BIT_OR; } | 45 | "|" { ECHO; return LSL_BIT_OR; } |
diff --git a/LuaSL/src/LuaSL_yaccer.y b/LuaSL/src/LuaSL_yaccer.y index a3bf1a3..75cfd78 100644 --- a/LuaSL/src/LuaSL_yaccer.y +++ b/LuaSL/src/LuaSL_yaccer.y | |||
@@ -11,6 +11,7 @@ | |||
11 | 11 | ||
12 | %token <integerValue> LSL_INTEGER | 12 | %token <integerValue> LSL_INTEGER |
13 | 13 | ||
14 | %nonassoc LSL_STATEMENT | ||
14 | %left LSL_BOOL_AND | 15 | %left LSL_BOOL_AND |
15 | %left LSL_BOOL_OR | 16 | %left LSL_BOOL_OR |
16 | %left LSL_BIT_AND LSL_BIT_XOR LSL_BIT_OR | 17 | %left LSL_BIT_AND LSL_BIT_XOR LSL_BIT_OR |
@@ -25,10 +26,17 @@ | |||
25 | 26 | ||
26 | %type <expressionValue> expr | 27 | %type <expressionValue> expr |
27 | 28 | ||
29 | %type <statementValue> statement | ||
30 | |||
28 | %% | 31 | %% |
29 | 32 | ||
30 | input : | 33 | input : |
31 | expr { ((LuaSL_yyparseParam*)data)->ast = addOperation(LSL_EXPRESSION, $1, $1); } | 34 | expr { ((LuaSL_yyparseParam*)data)->ast = addOperation(LSL_EXPRESSION, $1, $1); } |
35 | | statement { ((LuaSL_yyparseParam*)data)->ast = addStatement($1, ((LuaSL_yyparseParam*)data)->ast); } | ||
36 | ; | ||
37 | |||
38 | statement : | ||
39 | expr LSL_STATEMENT { $$ = createStatement(LSL_EXPRESSION, $1); } | ||
32 | ; | 40 | ; |
33 | 41 | ||
34 | expr : | 42 | expr : |
@@ -54,7 +62,7 @@ expr : | |||
54 | | LSL_BIT_NOT expr { $$ = addOperation( LSL_BIT_NOT, NULL, $2 ); } | 62 | | LSL_BIT_NOT expr { $$ = addOperation( LSL_BIT_NOT, NULL, $2 ); } |
55 | | LSL_BOOL_NOT expr { $$ = addOperation( LSL_BOOL_NOT, NULL, $2 ); } | 63 | | LSL_BOOL_NOT expr { $$ = addOperation( LSL_BOOL_NOT, NULL, $2 ); } |
56 | | LSL_SUBTRACT expr { $$ = addOperation( LSL_NEGATION, NULL, $2 ); } %prec LSL_NEGATION | 64 | | LSL_SUBTRACT expr { $$ = addOperation( LSL_NEGATION, NULL, $2 ); } %prec LSL_NEGATION |
57 | | LSL_PARENTHESIS_OPEN expr LSL_PARENTHESIS_CLOSE { $$ = $2; } | 65 | | LSL_PARENTHESIS_OPEN expr LSL_PARENTHESIS_CLOSE { $$ = addParenthesis($2); } |
58 | ; | 66 | ; |
59 | 67 | ||
60 | %% | 68 | %% |
diff --git a/LuaSL/test.lsl b/LuaSL/test.lsl index f2491f1..ddfa533 100644 --- a/LuaSL/test.lsl +++ b/LuaSL/test.lsl | |||
@@ -1,2 +1,2 @@ | |||
1 | 4 + 2 * 10 + 3 * (5 + 1) | 1 | 4 + 2 * 10 + 3 * (5 + 1); |
2 | 2 | ||