aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/LuaSL
diff options
context:
space:
mode:
authorDavid Walter Seikel2012-01-08 01:52:18 +1000
committerDavid Walter Seikel2012-01-08 01:52:18 +1000
commit2783337014b5ee04ef6e074771048088203aaebd (patch)
treec8da8a99bc7263815445c069ceffd6584d9faadf /LuaSL
parentParse an actual file. (diff)
downloadSledjHamr-2783337014b5ee04ef6e074771048088203aaebd.zip
SledjHamr-2783337014b5ee04ef6e074771048088203aaebd.tar.gz
SledjHamr-2783337014b5ee04ef6e074771048088203aaebd.tar.bz2
SledjHamr-2783337014b5ee04ef6e074771048088203aaebd.tar.xz
Parenthesis and statement parsing.
Diffstat (limited to 'LuaSL')
-rw-r--r--LuaSL/src/LuaSL_LSL_tree.c64
-rw-r--r--LuaSL/src/LuaSL_LSL_tree.h7
-rw-r--r--LuaSL/src/LuaSL_lexer.l1
-rw-r--r--LuaSL/src/LuaSL_yaccer.y10
-rw-r--r--LuaSL/test.lsl2
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
6static void evaluateIntegerToken(LSL_Leaf *content, LSL_Value *left, LSL_Value *right); 6static void evaluateIntegerToken(LSL_Leaf *content, LSL_Value *left, LSL_Value *right);
7static void evaluateNoToken(LSL_Leaf *content, LSL_Value *left, LSL_Value *right);
7static void evaluateOperationToken(LSL_Leaf *content, LSL_Value *left, LSL_Value *right); 8static void evaluateOperationToken(LSL_Leaf *content, LSL_Value *left, LSL_Value *right);
9static void evaluateStatementToken(LSL_Leaf *content, LSL_Value *left, LSL_Value *right);
8static void outputIntegerToken(LSL_Leaf *content); 10static void outputIntegerToken(LSL_Leaf *content);
9static void outputOperationToken(LSL_Leaf *content); 11static void outputOperationToken(LSL_Leaf *content);
12static void outputStatementToken(LSL_Leaf *content);
10 13
11LSL_Token LSL_Tokens[] = 14LSL_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
163LSL_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
173LSL_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
185LSL_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
159static void evaluateAST(LSL_AST *ast, LSL_Value *left, LSL_Value *right) 194static 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
250static void evaluateNoToken(LSL_Leaf *content, LSL_Value *left, LSL_Value *right)
251{
252}
253
213static void evaluateOperationToken(LSL_Leaf *content, LSL_Value *left, LSL_Value *right) 254static 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
322static void evaluateStatementToken(LSL_Leaf *content, LSL_Value *left, LSL_Value *right)
323{
324 if (content)
325 evaluateAST(content->statementValue->expression, left, right);
326}
327
281static void outputAST(LSL_AST *ast) 328static 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
353static void outputStatementToken(LSL_Leaf *content)
354{
355 if (content)
356 outputAST(content->statementValue->expression);
357 printf(";");
358}
359
306static void convertAST2Lua(LSL_AST *ast) 360static 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;
134typedef struct 134typedef 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
140typedef struct 140typedef struct
@@ -258,6 +258,9 @@ typedef struct
258LSL_AST *addExpression(LSL_AST *exp); 258LSL_AST *addExpression(LSL_AST *exp);
259LSL_AST *addInteger(int value); 259LSL_AST *addInteger(int value);
260LSL_AST *addOperation(LSL_Operation type, LSL_AST *left, LSL_AST *right); 260LSL_AST *addOperation(LSL_Operation type, LSL_AST *left, LSL_AST *right);
261LSL_AST *addParenthesis(LSL_AST *expr);
262LSL_Statement *createStatement(LSL_Type type, LSL_AST *expr);
263LSL_AST *addStatement(LSL_Statement *statement, LSL_AST *left);
261 264
262int yyerror(const char *msg); 265int yyerror(const char *msg);
263int yyparse(void *param); 266int 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
30input : 33input :
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
38statement :
39 expr LSL_STATEMENT { $$ = createStatement(LSL_EXPRESSION, $1); }
32; 40;
33 41
34expr : 42expr :
@@ -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 @@
14 + 2 * 10 + 3 * (5 + 1) 14 + 2 * 10 + 3 * (5 + 1);
2 2