aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorDavid Walter Seikel2012-01-07 01:18:11 +1000
committerDavid Walter Seikel2012-01-07 01:18:11 +1000
commit7cdcc9ee93757f8406094373d3faddaf62849e52 (patch)
tree9b66b2c8160f4c9e901b1eb07c3372fe62037c7c
parentFlex performance tweaks, and other options. (diff)
downloadSledjHamr-7cdcc9ee93757f8406094373d3faddaf62849e52.zip
SledjHamr-7cdcc9ee93757f8406094373d3faddaf62849e52.tar.gz
SledjHamr-7cdcc9ee93757f8406094373d3faddaf62849e52.tar.bz2
SledjHamr-7cdcc9ee93757f8406094373d3faddaf62849e52.tar.xz
Convert the parser from dealing with just expressions, to dealing with the entire AST.
-rw-r--r--LICENCES5
-rw-r--r--LuaSL/README6
-rw-r--r--LuaSL/src/LuaSL_LSL_tree.c306
-rw-r--r--LuaSL/src/LuaSL_LSL_tree.h163
-rw-r--r--LuaSL/src/LuaSL_yaccer.y2
5 files changed, 245 insertions, 237 deletions
diff --git a/LICENCES b/LICENCES
index 02e4c04..794ac5d 100644
--- a/LICENCES
+++ b/LICENCES
@@ -59,11 +59,16 @@ This is covered by "Creative Commons Attribution-ShareAlike 3.0 Unported
59License". The attribution portion is covered by the URL above, as per 59License". The attribution portion is covered by the URL above, as per
60the Wikipedia Terms of Use. 60the Wikipedia Terms of Use.
61 61
62There is no longer any parts of that code left I think.
63
62-------------------------------------------------------------------------------- 64--------------------------------------------------------------------------------
63 65
64The flex and bison source files for the LSL parser are from the SL 66The flex and bison source files for the LSL parser are from the SL
65viewer under GPL 2 and copyright at some unknown date (due to missing 67viewer under GPL 2 and copyright at some unknown date (due to missing
66copyright notice in those specific files) by Linden Research, Inc. 68copyright notice in those specific files) by Linden Research, Inc.
67 69
70It's likely this will go away, as I'm writing my own, and most of it was
71useless to me anyway.
72
68-------------------------------------------------------------------------------- 73--------------------------------------------------------------------------------
69 74
diff --git a/LuaSL/README b/LuaSL/README
index b8edefc..c02b180 100644
--- a/LuaSL/README
+++ b/LuaSL/README
@@ -78,6 +78,6 @@ useful extras. btyacc version 3 (the version coming from my version of
78Ubuntu) apparently no longer supports C, only C++. It's written in C 78Ubuntu) apparently no longer supports C, only C++. It's written in C
79though. 79though.
80 80
81Let's see if flex and btyacc will do the trick, and output C. 81Let's see if flex and btyacc will do the trick, and output C. Might be
82 82best to have the LSL to Lua converter as a seperate executable. Think
83Might be best to have the LSL to Lua converter as a seperate executable. 83I'll end up writing my own parser.
diff --git a/LuaSL/src/LuaSL_LSL_tree.c b/LuaSL/src/LuaSL_LSL_tree.c
index 88768e0..8462112 100644
--- a/LuaSL/src/LuaSL_LSL_tree.c
+++ b/LuaSL/src/LuaSL_LSL_tree.c
@@ -1,7 +1,3 @@
1/*
2 * Implementation of functions used to build the abstract syntax tree.
3 */
4
5 1
6#define LSL_Keywords_define 2#define LSL_Keywords_define
7#define LSL_Tokens_define 3#define LSL_Tokens_define
@@ -10,35 +6,38 @@
10#include <stdio.h> 6#include <stdio.h>
11 7
12 8
13/** 9static LSL_AST *newAST(LSL_Type type, LSL_AST *left, LSL_AST *right)
14 * @brief Allocates space for an AST leaf
15 * @return The expression or NULL if not enough memory
16 */
17
18/*
19static LSL_AST *newLeaf(LSL_Type type, LSL_AST *left, LSL_AST *right)
20{ 10{
21 LSL_AST *leaf = malloc(sizeof(LSL_AST)); 11 LSL_AST *ast = malloc(sizeof(LSL_AST));
12
13 if (ast == NULL) return NULL;
22 14
23 if (leaf == NULL) return NULL; 15 ast->type = type;
16 ast->left = left;
17 ast->right = right;
18 ast->line = -1;
19 ast->character = -1;
24 20
25 leaf->type = type; 21 return ast;
26 leaf->left = left; 22}
27 leaf->right = right; 23
28 leaf->line = -1; 24void burnAST(LSL_AST *ast)
29 leaf->character = -1; 25{
26 if (ast == NULL) return;
30 27
31 return leaf; 28 burnAST(ast->left);
29 burnAST(ast->right);
30 free(ast);
32} 31}
33*/
34 32
35void burnLeaf(LSL_AST *leaf) 33LSL_AST *addExpression(LSL_Expression *exp)
36{ 34{
37 if (leaf == NULL) return; 35 LSL_AST *ast = newAST(LSL_EXPRESSION, NULL, NULL);
38 36
39 burnLeaf(leaf->left); 37 if (ast)
40 burnLeaf(leaf->right); 38 ast->content.expressionValue = exp;
41 free(leaf); 39
40 return ast;
42} 41}
43 42
44static LSL_Expression *newLSLExpression(LSL_Type type, LSL_Expression *left, LSL_Expression *right) 43static LSL_Expression *newLSLExpression(LSL_Type type, LSL_Expression *left, LSL_Expression *right)
@@ -50,7 +49,6 @@ static LSL_Expression *newLSLExpression(LSL_Type type, LSL_Expression *left, LSL
50 exp->type = type; 49 exp->type = type;
51 exp->left = left; 50 exp->left = left;
52 exp->right = right; 51 exp->right = right;
53 exp->expression=0;
54 52
55 return exp; 53 return exp;
56} 54}
@@ -69,7 +67,7 @@ LSL_Expression *addInteger(int value)
69 LSL_Expression *exp = newLSLExpression(LSL_INTEGER, NULL, NULL); 67 LSL_Expression *exp = newLSLExpression(LSL_INTEGER, NULL, NULL);
70 68
71 if (exp) 69 if (exp)
72 exp->value.integerValue = value; 70 exp->content.integerValue = value;
73 71
74 return exp; 72 return exp;
75} 73}
@@ -79,41 +77,96 @@ LSL_Expression *addOperation(LSL_Operation type, LSL_Expression *left, LSL_Expre
79 LSL_Expression *exp = newLSLExpression(LSL_EXPRESSION, left, right); 77 LSL_Expression *exp = newLSLExpression(LSL_EXPRESSION, left, right);
80 78
81 if (exp) 79 if (exp)
82 exp->expression = type; 80 exp->content.operationValue = type;
83 81
84 return exp; 82 return exp;
85} 83}
86 84
87LSL_Expression *newTree(const char *expr) 85int evaluateExpression(LSL_Expression *exp, int old)
88{ 86{
89 LuaSL_yyparseParam param; 87 if (NULL == exp)
90 YY_BUFFER_STATE state; 88 return old;
91
92#ifdef LUASL_DEBUG 89#ifdef LUASL_DEBUG
93 yydebug= 5; 90 #ifdef LUASL_USE_ENUM
91 printf(" %s ", LSL_Tokens[exp->content.operationValue - LSL_COMMA].token);
92 #else
93 printf(" # ");
94 #endif
94#endif 95#endif
95 96
96 param.expression = NULL; 97 if (LSL_INTEGER == exp->type)
97 if (yylex_init(&(param.scanner))) 98 {
98 return NULL;
99
100#ifdef LUASL_DEBUG 99#ifdef LUASL_DEBUG
101 yyset_debug(1, param.scanner); 100 printf("%d", exp->content.integerValue);
102#endif 101#endif
102 return exp->content.integerValue;
103 }
103 104
104 state = yy_scan_string(expr, param.scanner); 105 switch (exp->content.operationValue)
105 if (yyparse(&param)) 106 {
106 return NULL; 107#ifdef LUASL_USE_ENUM
107 108 case LSL_COMMA :
108 yy_delete_buffer(state, param.scanner); 109 case LSL_INCREMENT_PRE :
109 yylex_destroy(param.scanner); 110 case LSL_INCREMENT_POST :
111 case LSL_DECREMENT_PRE :
112 case LSL_DECREMENT_POST :
113 case LSL_DOT :
114 case LSL_ASSIGNMENT_PLAIN :
115 case LSL_ASSIGNMENT_DIVIDE :
116 case LSL_ASSIGNMENT_MODULO :
117 case LSL_ASSIGNMENT_MULTIPLY :
118 case LSL_ASSIGNMENT_SUBTRACT :
119 case LSL_ASSIGNMENT_ADD :
120 case LSL_ASSIGNMENT_CONCATENATE :
121 case LSL_PARENTHESIS_OPEN :
122 case LSL_PARENTHESIS_CLOSE :
123 case LSL_BRACKET_OPEN :
124 case LSL_BRACKET_CLOSE :
125 case LSL_ANGLE_OPEN :
126 case LSL_ANGLE_CLOSE :
127 case LSL_TYPECAST :
128 break;
129#endif
130 case LSL_BIT_NOT : return ~ evaluateExpression(exp->right, old);
131 case LSL_BOOL_NOT : return ! evaluateExpression(exp->right, old);
132 case LSL_NEGATION : return 0 - evaluateExpression(exp->right, old);
133 case LSL_DIVIDE : return evaluateExpression(exp->left, old) / evaluateExpression(exp->right, old);
134#ifdef LUASL_USE_ENUM
135 case LSL_MODULO : return evaluateExpression(exp->left, old) % evaluateExpression(exp->right, old);
136#endif
137 case LSL_MULTIPLY : return evaluateExpression(exp->left, old) * evaluateExpression(exp->right, old);
138#ifdef LUASL_USE_ENUM
139 case LSL_DOT_PRODUCT : break;
140 case LSL_CROSS_PRODUCT : break;
141#endif
142 case LSL_SUBTRACT : return evaluateExpression(exp->left, old) - evaluateExpression(exp->right, old);
143 case LSL_ADD : return evaluateExpression(exp->left, old) + evaluateExpression(exp->right, old);
144#ifdef LUASL_USE_ENUM
145 case LSL_CONCATENATE : break;
146#endif
147 case LSL_LEFT_SHIFT : return evaluateExpression(exp->left, old) << evaluateExpression(exp->right, old);
148 case LSL_RIGHT_SHIFT : return evaluateExpression(exp->left, old) >> evaluateExpression(exp->right, old);
149 case LSL_LESS_THAN : return evaluateExpression(exp->left, old) < evaluateExpression(exp->right, old);
150 case LSL_GREATER_THAN : return evaluateExpression(exp->left, old) > evaluateExpression(exp->right, old);
151 case LSL_LESS_EQUAL : return evaluateExpression(exp->left, old) <= evaluateExpression(exp->right, old);
152 case LSL_GREATER_EQUAL : return evaluateExpression(exp->left, old) >= evaluateExpression(exp->right, old);
153 case LSL_EQUAL : return evaluateExpression(exp->left, old) == evaluateExpression(exp->right, old);
154 case LSL_NOT_EQUAL : return evaluateExpression(exp->left, old) != evaluateExpression(exp->right, old);
155 case LSL_BIT_AND : return evaluateExpression(exp->left, old) & evaluateExpression(exp->right, old);
156 case LSL_BIT_XOR : return evaluateExpression(exp->left, old) ^ evaluateExpression(exp->right, old);
157 case LSL_BIT_OR : return evaluateExpression(exp->left, old) | evaluateExpression(exp->right, old);
158 case LSL_BOOL_OR : return evaluateExpression(exp->left, old) || evaluateExpression(exp->right, old);
159 case LSL_BOOL_AND : return evaluateExpression(exp->left, old) && evaluateExpression(exp->right, old);
160 }
110 161
111 return param.expression; 162 return old;
112} 163}
113 164
114int evaluateExpression(LSL_Expression *exp, int old) 165int evaluateAST(LSL_AST *ast, int old)
115{ 166{
116 switch(exp->type) 167 if (NULL == ast)
168 return old;
169 switch(ast->type)
117 { 170 {
118#ifdef LUASL_USE_ENUM 171#ifdef LUASL_USE_ENUM
119 case LSL_COMMENT : 172 case LSL_COMMENT :
@@ -121,13 +174,13 @@ int evaluateExpression(LSL_Expression *exp, int old)
121 case LSL_NAME : 174 case LSL_NAME :
122 case LSL_IDENTIFIER : 175 case LSL_IDENTIFIER :
123 break; 176 break;
124 case LSL_FLOAT : return (int) exp->value.floatValue; 177 case LSL_FLOAT : return (int) ast->content.floatValue;
125#endif 178#endif
126 case LSL_INTEGER : 179 case LSL_INTEGER :
127#ifdef LUASL_DEBUG 180#ifdef LUASL_DEBUG
128 printf("%d", exp->value.integerValue); 181 printf("%d", ast->content.integerValue);
129#endif 182#endif
130 return exp->value.integerValue; 183 return ast->content.integerValue;
131#ifdef LUASL_USE_ENUM 184#ifdef LUASL_USE_ENUM
132 case LSL_STRING : 185 case LSL_STRING :
133 case LSL_KEY : 186 case LSL_KEY :
@@ -137,73 +190,7 @@ int evaluateExpression(LSL_Expression *exp, int old)
137 case LSL_LABEL : 190 case LSL_LABEL :
138 break; 191 break;
139#endif 192#endif
140 case LSL_EXPRESSION : 193 case LSL_EXPRESSION : return evaluateExpression(ast->content.expressionValue, old);
141 {
142#ifdef LUASL_DEBUG
143 #ifdef LUASL_USE_ENUM
144 printf(" %s ", LSL_Tokens[exp->expression - LSL_COMMA].token);
145 #else
146 printf(" # ");
147 #endif
148#endif
149 switch (exp->expression)
150 {
151#ifdef LUASL_USE_ENUM
152 case LSL_COMMA :
153 case LSL_INCREMENT_PRE :
154 case LSL_INCREMENT_POST :
155 case LSL_DECREMENT_PRE :
156 case LSL_DECREMENT_POST :
157 case LSL_DOT :
158 case LSL_ASSIGNMENT_PLAIN :
159 case LSL_ASSIGNMENT_DIVIDE :
160 case LSL_ASSIGNMENT_MODULO :
161 case LSL_ASSIGNMENT_MULTIPLY :
162 case LSL_ASSIGNMENT_SUBTRACT :
163 case LSL_ASSIGNMENT_ADD :
164 case LSL_ASSIGNMENT_CONCATENATE :
165 case LSL_PARENTHESIS_OPEN :
166 case LSL_PARENTHESIS_CLOSE :
167 case LSL_BRACKET_OPEN :
168 case LSL_BRACKET_CLOSE :
169 case LSL_ANGLE_OPEN :
170 case LSL_ANGLE_CLOSE :
171 case LSL_TYPECAST :
172 break;
173#endif
174 case LSL_BIT_NOT : return ~ evaluateExpression(exp->right, old);
175 case LSL_BOOL_NOT : return ! evaluateExpression(exp->right, old);
176 case LSL_NEGATION : return 0 - evaluateExpression(exp->right, old);
177 case LSL_DIVIDE : return evaluateExpression(exp->left, old) / evaluateExpression(exp->right, old);
178#ifdef LUASL_USE_ENUM
179 case LSL_MODULO : return evaluateExpression(exp->left, old) % evaluateExpression(exp->right, old);
180#endif
181 case LSL_MULTIPLY : return evaluateExpression(exp->left, old) * evaluateExpression(exp->right, old);
182#ifdef LUASL_USE_ENUM
183 case LSL_DOT_PRODUCT : break;
184 case LSL_CROSS_PRODUCT : break;
185#endif
186 case LSL_SUBTRACT : return evaluateExpression(exp->left, old) - evaluateExpression(exp->right, old);
187 case LSL_ADD : return evaluateExpression(exp->left, old) + evaluateExpression(exp->right, old);
188#ifdef LUASL_USE_ENUM
189 case LSL_CONCATENATE : break;
190#endif
191 case LSL_LEFT_SHIFT : return evaluateExpression(exp->left, old) << evaluateExpression(exp->right, old);
192 case LSL_RIGHT_SHIFT : return evaluateExpression(exp->left, old) >> evaluateExpression(exp->right, old);
193 case LSL_LESS_THAN : return evaluateExpression(exp->left, old) < evaluateExpression(exp->right, old);
194 case LSL_GREATER_THAN : return evaluateExpression(exp->left, old) > evaluateExpression(exp->right, old);
195 case LSL_LESS_EQUAL : return evaluateExpression(exp->left, old) <= evaluateExpression(exp->right, old);
196 case LSL_GREATER_EQUAL : return evaluateExpression(exp->left, old) >= evaluateExpression(exp->right, old);
197 case LSL_EQUAL : return evaluateExpression(exp->left, old) == evaluateExpression(exp->right, old);
198 case LSL_NOT_EQUAL : return evaluateExpression(exp->left, old) != evaluateExpression(exp->right, old);
199 case LSL_BIT_AND : return evaluateExpression(exp->left, old) & evaluateExpression(exp->right, old);
200 case LSL_BIT_XOR : return evaluateExpression(exp->left, old) ^ evaluateExpression(exp->right, old);
201 case LSL_BIT_OR : return evaluateExpression(exp->left, old) | evaluateExpression(exp->right, old);
202 case LSL_BOOL_OR : return evaluateExpression(exp->left, old) || evaluateExpression(exp->right, old);
203 case LSL_BOOL_AND : return evaluateExpression(exp->left, old) && evaluateExpression(exp->right, old);
204 }
205 break;
206 }
207#ifdef LUASL_USE_ENUM 194#ifdef LUASL_USE_ENUM
208 case LSL_DO : 195 case LSL_DO :
209 case LSL_FOR : 196 case LSL_FOR :
@@ -225,22 +212,42 @@ int evaluateExpression(LSL_Expression *exp, int old)
225 } 212 }
226 213
227 return old; 214 return old;
228
229} 215}
230 216
231void outputExpression(LSL_Expression *exp) 217void outputExpression(LSL_Expression *exp)
232{ 218{
233 switch(exp->type) 219 if (NULL == exp)
220 return;
221
222 if (LSL_INTEGER == exp->type)
223 {
224 printf("%d", exp->content.integerValue);
225 }
226 else
227 {
228 outputExpression(exp->left);
229#ifdef LUASL_USE_ENUM
230 printf(" %s ", LSL_Tokens[exp->content.operationValue - LSL_COMMA].token);
231#else
232 printf(" # ");
233#endif
234 outputExpression(exp->right);
235 }
236}
237
238void outputAST(LSL_AST *ast)
239{
240 if (NULL == ast)
241 return;
242 switch(ast->type)
234 { 243 {
235#ifdef LUASL_USE_ENUM 244#ifdef LUASL_USE_ENUM
236 case LSL_COMMENT : return; 245 case LSL_COMMENT : return;
237 case LSL_TYPE : return; 246 case LSL_TYPE : return;
238 case LSL_NAME : return; 247 case LSL_NAME : return;
239 case LSL_IDENTIFIER : return; 248 case LSL_IDENTIFIER : return;
240 case LSL_FLOAT : printf("%f", exp->value.floatValue); break; 249 case LSL_FLOAT : printf("%f", ast->content.floatValue); break;
241#endif 250 case LSL_INTEGER : printf("%d", ast->content.integerValue); break;
242 case LSL_INTEGER : printf("%d", exp->value.integerValue); break;
243#ifdef LUASL_USE_ENUM
244 case LSL_STRING : return; 251 case LSL_STRING : return;
245 case LSL_KEY : return; 252 case LSL_KEY : return;
246 case LSL_VECTOR : return; 253 case LSL_VECTOR : return;
@@ -248,15 +255,7 @@ void outputExpression(LSL_Expression *exp)
248 case LSL_LIST : return; 255 case LSL_LIST : return;
249 case LSL_LABEL : return; 256 case LSL_LABEL : return;
250#endif 257#endif
251 case LSL_EXPRESSION : 258 case LSL_EXPRESSION : outputExpression(ast->content.expressionValue); break;
252 outputExpression(exp->left);
253#ifdef LUASL_USE_ENUM
254 printf(" %s ", LSL_Tokens[exp->expression - LSL_COMMA].token);
255#else
256 printf(" # ");
257#endif
258 outputExpression(exp->right);
259 break;
260#ifdef LUASL_USE_ENUM 259#ifdef LUASL_USE_ENUM
261 case LSL_DO : return; 260 case LSL_DO : return;
262 case LSL_FOR : return; 261 case LSL_FOR : return;
@@ -277,10 +276,12 @@ void outputExpression(LSL_Expression *exp)
277 } 276 }
278} 277}
279 278
280void convertExpression2Lua(LSL_Expression *exp) 279void convertAST2Lua(LSL_AST *ast)
281{ 280{
282#ifdef LUASL_USE_ENUM 281#ifdef LUASL_USE_ENUM
283 switch(exp->type) 282 if (NULL == ast)
283 return;
284 switch(ast->type)
284 { 285 {
285 case LSL_COMMENT : return; 286 case LSL_COMMENT : return;
286 case LSL_TYPE : return; 287 case LSL_TYPE : return;
@@ -320,22 +321,49 @@ int yyerror(const char *msg)
320 return 0; 321 return 0;
321} 322}
322 323
324LSL_AST *newTree(const char *expr)
325{
326 LuaSL_yyparseParam param;
327 YY_BUFFER_STATE state;
328
329#ifdef LUASL_DEBUG
330 yydebug= 5;
331#endif
332
333 param.ast = NULL;
334 if (yylex_init(&(param.scanner)))
335 return NULL;
336
337#ifdef LUASL_DEBUG
338 yyset_debug(1, param.scanner);
339#endif
340
341 state = yy_scan_string(expr, param.scanner);
342 if (yyparse(&param))
343 return NULL;
344
345 yy_delete_buffer(state, param.scanner);
346 yylex_destroy(param.scanner);
347
348 return param.ast;
349}
350
323int main(void) 351int main(void)
324{ 352{
325 const char test[] = " 4 + 2 * 10 + 3 * ( 5 + 1 )"; 353 const char test[] = " 4 + 2 * 10 + 3 * ( 5 + 1 )";
326 LSL_Expression *exp; 354 LSL_AST *ast;
327 355
328 if ((exp = newTree(test))) 356 if ((ast = newTree(test)))
329 { 357 {
330 int result = evaluateExpression(exp, 0); 358 int result = evaluateAST(ast, 0);
331 359
332#ifdef LUASL_DEBUG 360#ifdef LUASL_DEBUG
333 printf("\n"); 361 printf("\n");
334#endif 362#endif
335 printf("Result of '%s' is %d\n", test, result); 363 printf("Result of '%s' is %d\n", test, result);
336 outputExpression(exp); 364 outputAST(ast);
337 printf("\n"); 365 printf("\n");
338 burnLSLExpression(exp); 366 burnAST(ast);
339 } 367 }
340 368
341 return 0; 369 return 0;
diff --git a/LuaSL/src/LuaSL_LSL_tree.h b/LuaSL/src/LuaSL_LSL_tree.h
index 271f4a8..a392474 100644
--- a/LuaSL/src/LuaSL_LSL_tree.h
+++ b/LuaSL/src/LuaSL_LSL_tree.h
@@ -1,6 +1,4 @@
1/* 1
2 * Definition of the structure used to build the abstract syntax tree.
3 */
4#ifndef __EXPRESSION_H__ 2#ifndef __EXPRESSION_H__
5#define __EXPRESSION_H__ 3#define __EXPRESSION_H__
6 4
@@ -215,110 +213,84 @@ char *LSL_Keywords[] =
215}; 213};
216#endif 214#endif
217 215
218typedef union
219{
220 float floatValue;
221 int integerValue;
222 char *stringValue;
223 char *keyValue;
224 float vectorValue[3];
225 float rotationValue[4];
226 union LSL_Leaf *listValue;
227} LSL_Value;
228
229typedef struct
230{
231 char *name;
232 LSL_Type type;
233 LSL_Value value;
234} LSL_Identifier;
235
236typedef struct LSL_Expression
237{
238 struct LSL_Expression *left;
239 struct LSL_Expression *right;
240 LSL_Value value;
241 LSL_Operation expression;
242 LSL_Type type;
243} LSL_Expression;
244
245typedef struct 216typedef struct
246{ 217{
247 LSL_Type type; 218 LSL_Type type;
248 LSL_Expression *expressions; 219 struct LSL_Expression *expressions;
249} LSL_Statement; 220} LSL_Statement;
250 221
251typedef struct 222typedef struct
252{ 223{
253 LSL_Statement *statements; 224 LSL_Statement *statements;
254} LSL_Block; 225} LSL_Block;
255 226
256typedef struct 227typedef struct
257{ 228{
258 char *name; 229 char *name;
259 LSL_Identifier *parameters; 230 struct LSL_Identifier *parameters;
260 LSL_Block block; 231 LSL_Block block;
261 LSL_Type type; 232 LSL_Type type;
262} LSL_Function; 233} LSL_Function;
263 234
264typedef struct 235typedef struct
265{ 236{
266 char *name; 237 char *name;
267 LSL_Function *handlers; 238 LSL_Function *handlers;
268} LSL_State; 239} LSL_State;
269 240
270typedef struct 241typedef struct
271{ 242{
272 char *name; 243 char *name;
273 LSL_Identifier *variables; 244 struct LSL_Identifier *variables;
274 LSL_Function *functions; 245 LSL_Function *functions;
275 LSL_State *states; 246 LSL_State *states;
276} LSL_Script; 247} LSL_Script;
277 248
278typedef union LSL_Leaf 249typedef union LSL_Leaf
279{ 250{
280 char *commentValue; 251 char *commentValue;
281 LSL_Type typeValue; 252 LSL_Type typeValue;
282 char *nameValue; 253 char *nameValue;
283 LSL_Identifier *identifierValue; 254 struct LSL_Identifier *identifierValue;
284 float floatValue; 255 float floatValue;
285 int integerValue; 256 int integerValue;
286 char *stringValue; 257 char *stringValue;
287 char *keyValue; 258 char *keyValue;
288 float vectorValue[3]; 259 float vectorValue[3];
289 float rotationValue[4]; 260 float rotationValue[4];
290 union LSL_Leaf *listValue; 261 union LSL_Leaf *listValue;
291 char *labelValue; 262 char *labelValue;
292// LSL_Operation expressionValue; 263 LSL_Operation operationValue;
293 LSL_Expression *expressionValue; 264 struct LSL_Expression *expressionValue;
294 LSL_Statement *doValue; 265 LSL_Statement *doValue;
295 LSL_Statement *forValue; 266 LSL_Statement *forValue;
296 LSL_Statement *ifValue; 267 LSL_Statement *ifValue;
297 LSL_Statement *elseValue; 268 LSL_Statement *elseValue;
298 LSL_Statement *elseIfValue; 269 LSL_Statement *elseIfValue;
299 char *jumpValue; 270 char *jumpValue;
300 char *stateChangeValue; 271 char *stateChangeValue;
301 LSL_Statement *statementValue; 272 LSL_Statement *statementValue;
302 LSL_Identifier *parameterValue; 273 struct LSL_Identifier *parameterValue;
303 LSL_Function *functionValue; 274 LSL_Function *functionValue;
304 LSL_State *stateValue; 275 LSL_State *stateValue;
305 LSL_Script *scriptValue; 276 LSL_Script *scriptValue;
306// class LLScriptType *type;
307// class LLScriptConstant *constant;
308// class LLScriptIdentifier *identifier;
309// class LLScriptSimpleAssignable *assignable;
310// class LLScriptGlobalVariable *global;
311// class LLScriptEvent *event;
312// class LLScriptEventHandler *handler;
313// class LLScriptExpression *expression;
314// class LLScriptStatement *statement;
315// class LLScriptGlobalFunctions *global_funcs;
316// class LLScriptFunctionDec *global_decl;
317// class LLScriptState *state;
318// class LLScritpGlobalStorage *global_store;
319// class LLScriptScript *script;
320} LSL_Leaf; 277} LSL_Leaf;
321 278
279typedef struct
280{
281 char *name;
282 LSL_Type type;
283 LSL_Leaf content;
284} LSL_Identifier;
285
286typedef struct LSL_Expression
287{
288 struct LSL_Expression *left;
289 struct LSL_Expression *right;
290 LSL_Type type;
291 LSL_Leaf content;
292} LSL_Expression;
293
322typedef struct LSL_AST 294typedef struct LSL_AST
323{ 295{
324 struct LSL_AST *left; 296 struct LSL_AST *left;
@@ -342,19 +314,9 @@ typedef struct LSL_AST
342typedef struct 314typedef struct
343{ 315{
344 yyscan_t scanner; 316 yyscan_t scanner;
345 LSL_Expression *expression; 317 LSL_AST *ast;
346} LuaSL_yyparseParam; 318} LuaSL_yyparseParam;
347 319
348
349void burnLeaf(LSL_AST *leaf);
350void burnLSLExpression(LSL_Expression *exp);
351LSL_Expression *addInteger(int value);
352LSL_Expression *addOperation(LSL_Operation type, LSL_Expression *left, LSL_Expression *right);
353LSL_Expression *newTree(const char *expr);
354int evaluateExpression(LSL_Expression *exp, int old);
355void outputExpression(LSL_Expression *exp);
356void convertExpression2Lua(LSL_Expression *exp);
357
358// the parameter name (of the reentrant 'yyparse' function) 320// the parameter name (of the reentrant 'yyparse' function)
359// data is a pointer to a 'SParserParam' structure 321// data is a pointer to a 'SParserParam' structure
360#define YYPARSE_PARAM data 322#define YYPARSE_PARAM data
@@ -362,6 +324,19 @@ void convertExpression2Lua(LSL_Expression *exp);
362// the argument for the 'yylex' function 324// the argument for the 'yylex' function
363#define YYLEX_PARAM ((LuaSL_yyparseParam*)data)->scanner 325#define YYLEX_PARAM ((LuaSL_yyparseParam*)data)->scanner
364 326
327
328void burnLSLExpression(LSL_Expression *exp);
329void burnAST(LSL_AST *ast);
330LSL_AST *addExpression(LSL_Expression *exp);
331LSL_Expression *addInteger(int value);
332LSL_Expression *addOperation(LSL_Operation type, LSL_Expression *left, LSL_Expression *right);
333int evaluateExpression(LSL_Expression *exp, int old);
334int evaluateAST(LSL_AST *ast, int old);
335void outputExpression(LSL_Expression *exp);
336void outputAST(LSL_AST *ast);
337void convertAST2Lua(LSL_AST *ast);
338LSL_AST *newTree(const char *expr);
339
365int yyerror(const char *msg); 340int yyerror(const char *msg);
366int yyparse(void *param); 341int yyparse(void *param);
367 342
diff --git a/LuaSL/src/LuaSL_yaccer.y b/LuaSL/src/LuaSL_yaccer.y
index fd5a461..e208cce 100644
--- a/LuaSL/src/LuaSL_yaccer.y
+++ b/LuaSL/src/LuaSL_yaccer.y
@@ -28,7 +28,7 @@
28%% 28%%
29 29
30input : 30input :
31 expr { ((LuaSL_yyparseParam*)data)->expression = $1; } 31 expr { ((LuaSL_yyparseParam*)data)->ast = addExpression($1); }
32; 32;
33 33
34expr : 34expr :