From 2783337014b5ee04ef6e074771048088203aaebd Mon Sep 17 00:00:00 2001 From: David Walter Seikel Date: Sun, 8 Jan 2012 01:52:18 +1000 Subject: Parenthesis and statement parsing. --- LuaSL/src/LuaSL_LSL_tree.c | 64 +++++++++++++++++++++++++++++++++++++++++++--- LuaSL/src/LuaSL_LSL_tree.h | 7 +++-- LuaSL/src/LuaSL_lexer.l | 1 + LuaSL/src/LuaSL_yaccer.y | 10 +++++++- LuaSL/test.lsl | 2 +- 5 files changed, 76 insertions(+), 8 deletions(-) (limited to 'LuaSL') 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 @@ #include static void evaluateIntegerToken(LSL_Leaf *content, LSL_Value *left, LSL_Value *right); +static void evaluateNoToken(LSL_Leaf *content, LSL_Value *left, LSL_Value *right); static void evaluateOperationToken(LSL_Leaf *content, LSL_Value *left, LSL_Value *right); +static void evaluateStatementToken(LSL_Leaf *content, LSL_Value *left, LSL_Value *right); static void outputIntegerToken(LSL_Leaf *content); static void outputOperationToken(LSL_Leaf *content); +static void outputStatementToken(LSL_Leaf *content); LSL_Token LSL_Tokens[] = { @@ -28,8 +31,8 @@ LSL_Token LSL_Tokens[] = // {LSL_ASSIGNMENT_SUBTRACT, "-=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, outputOperationToken, NULL, evaluateOperationToken}, // {LSL_ASSIGNMENT_ADD, "+=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, outputOperationToken, NULL, evaluateOperationToken}, // {LSL_ASSIGNMENT_CONCATENATE, "+=", LSL_RIGHT2LEFT | LSL_ASSIGNMENT, outputOperationToken, NULL, evaluateOperationToken}, - {LSL_PARENTHESIS_OPEN, "(", LSL_INNER2OUTER, outputOperationToken, NULL, evaluateOperationToken}, - {LSL_PARENTHESIS_CLOSE, ")", LSL_INNER2OUTER, outputOperationToken, NULL, evaluateOperationToken}, + {LSL_PARENTHESIS_OPEN, "(", LSL_INNER2OUTER, NULL, NULL, NULL}, + {LSL_PARENTHESIS_CLOSE, ")", LSL_INNER2OUTER, NULL, NULL, evaluateNoToken}, // {LSL_BRACKET_OPEN, "[", LSL_INNER2OUTER | LSL_CREATION, outputOperationToken, NULL, evaluateOperationToken}, // {LSL_BRACKET_CLOSE, "]", LSL_INNER2OUTER | LSL_CREATION, outputOperationToken, NULL, evaluateOperationToken}, // {LSL_ANGLE_OPEN, "<", LSL_LEFT2RIGHT | LSL_CREATION, outputOperationToken, NULL, evaluateOperationToken}, @@ -66,6 +69,7 @@ LSL_Token LSL_Tokens[] = // Then the rest of the syntax tokens. +// {LSL_SPACE, " ", LSL_NONE, NULL, NULL, NULL}, // {LSL_COMMENT_LINE, "//", LSL_NONE, NULL, NULL, NULL}, // {LSL_COMMENT, "/*", LSL_NONE, NULL, NULL, NULL}, // {LSL_TYPE, "type", LSL_NONE, NULL, NULL, NULL}, @@ -89,7 +93,7 @@ LSL_Token LSL_Tokens[] = // {LSL_STATE_CHANGE, "state", LSL_NONE, NULL, NULL, NULL}, // {LSL_WHILE, "while", LSL_NONE, NULL, NULL, NULL}, // {LSL_RETURN, "return", LSL_NONE, NULL, NULL, NULL}, -// {LSL_STATEMENT, ";", LSL_NONE, NULL, NULL, NULL}, + {LSL_STATEMENT, ";", LSL_NONE, outputStatementToken, NULL, evaluateStatementToken}, // {LSL_BLOCK_OPEN, "{", LSL_NONE, NULL, NULL, NULL}, // {LSL_BLOCK_CLOSE, "}", LSL_NONE, NULL, NULL, NULL}, // {LSL_PARAMETER, "parameter", LSL_NONE, NULL, NULL, NULL}, @@ -156,6 +160,37 @@ LSL_AST *addOperation(LSL_Operation type, LSL_AST *left, LSL_AST *right) return ast; } +LSL_AST *addParenthesis(LSL_AST *expr) +{ + LSL_AST *ast = newAST(LSL_PARENTHESIS_OPEN, NULL, expr); + + if (ast) + ast = newAST(LSL_PARENTHESIS_CLOSE, ast, NULL); + + return ast; +} + +LSL_Statement *createStatement(LSL_Type type, LSL_AST *expr) +{ + LSL_Statement *stat = malloc(sizeof(LSL_Statement)); + + if (stat == NULL) return NULL; + + stat->type = type; + stat->expression = expr; + + return stat; +} + +LSL_AST *addStatement(LSL_Statement *statement, LSL_AST *root) +{ + LSL_AST *ast = newAST(LSL_STATEMENT, root, NULL); + + ast->content.statementValue = statement; + + return ast; +} + static void evaluateAST(LSL_AST *ast, LSL_Value *left, LSL_Value *right) { if (ast) @@ -192,7 +227,9 @@ static void evaluateAST(LSL_AST *ast, LSL_Value *left, LSL_Value *right) } else { +#ifdef LUASL_DEBUG printf(" eval <%s %d %d %d %d> ", ast->token->token, left->content.integerValue, right->content.integerValue, lresult.content.integerValue, rresult.content.integerValue); +#endif memcpy(left, &rresult, sizeof(LSL_Value)); } } @@ -210,6 +247,10 @@ static void evaluateIntegerToken(LSL_Leaf *content, LSL_Value *left, LSL_Value * } } +static void evaluateNoToken(LSL_Leaf *content, LSL_Value *left, LSL_Value *right) +{ +} + static void evaluateOperationToken(LSL_Leaf *content, LSL_Value *left, LSL_Value *right) { if ((content) && (content->operationValue)) @@ -278,6 +319,12 @@ static void evaluateOperationToken(LSL_Leaf *content, LSL_Value *left, LSL_Value } } +static void evaluateStatementToken(LSL_Leaf *content, LSL_Value *left, LSL_Value *right) +{ + if (content) + evaluateAST(content->statementValue->expression, left, right); +} + static void outputAST(LSL_AST *ast) { if (ast) @@ -286,7 +333,7 @@ static void outputAST(LSL_AST *ast) if (ast->token->output) ast->token->output(&(ast->content)); else - printf(" <%s> ", ast->token->token); + printf(" %s ", ast->token->token); outputAST(ast->right); } } @@ -303,6 +350,13 @@ static void outputOperationToken(LSL_Leaf *content) printf(" %s ", tokens[content->operationValue - lowestToken]->token); } +static void outputStatementToken(LSL_Leaf *content) +{ + if (content) + outputAST(content->statementValue->expression); + printf(";"); +} + static void convertAST2Lua(LSL_AST *ast) { if (ast) @@ -312,6 +366,8 @@ static void convertAST2Lua(LSL_AST *ast) ast->token->convert(&(ast->content)); else if (ast->token->output) ast->token->output(&(ast->content)); + else + printf(" %s ", ast->token->token); convertAST2Lua(ast->right); } } 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 @@ #define __EXPRESSION_H__ //#define LUASL_USE_ENUM -//#define LUASL_DEBUG +#define LUASL_DEBUG #ifndef LUASL_USE_ENUM #include "LuaSL_yaccer.tab.h" @@ -134,7 +134,7 @@ typedef int LSL_Type; typedef struct { LSL_Type type; - struct LSL_AST *expressions; + struct LSL_AST *expression; } LSL_Statement; typedef struct @@ -258,6 +258,9 @@ typedef struct LSL_AST *addExpression(LSL_AST *exp); LSL_AST *addInteger(int value); LSL_AST *addOperation(LSL_Operation type, LSL_AST *left, LSL_AST *right); +LSL_AST *addParenthesis(LSL_AST *expr); +LSL_Statement *createStatement(LSL_Type type, LSL_AST *expr); +LSL_AST *addStatement(LSL_Statement *statement, LSL_AST *left); int yyerror(const char *msg); 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}? {FLOAT} %{ ECHO; /* yylval->floatValue = atof(yytext); return LSL_FLOAT; */ %} /* Expression tokens */ +";" { ECHO; return LSL_STATEMENT; } "&&" { ECHO; return LSL_BOOL_AND; } "||" { ECHO; return LSL_BOOL_OR; } "|" { 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 @@ %token LSL_INTEGER +%nonassoc LSL_STATEMENT %left LSL_BOOL_AND %left LSL_BOOL_OR %left LSL_BIT_AND LSL_BIT_XOR LSL_BIT_OR @@ -25,10 +26,17 @@ %type expr +%type statement + %% input : expr { ((LuaSL_yyparseParam*)data)->ast = addOperation(LSL_EXPRESSION, $1, $1); } + | statement { ((LuaSL_yyparseParam*)data)->ast = addStatement($1, ((LuaSL_yyparseParam*)data)->ast); } +; + +statement : + expr LSL_STATEMENT { $$ = createStatement(LSL_EXPRESSION, $1); } ; expr : @@ -54,7 +62,7 @@ expr : | LSL_BIT_NOT expr { $$ = addOperation( LSL_BIT_NOT, NULL, $2 ); } | LSL_BOOL_NOT expr { $$ = addOperation( LSL_BOOL_NOT, NULL, $2 ); } | LSL_SUBTRACT expr { $$ = addOperation( LSL_NEGATION, NULL, $2 ); } %prec LSL_NEGATION - | LSL_PARENTHESIS_OPEN expr LSL_PARENTHESIS_CLOSE { $$ = $2; } + | LSL_PARENTHESIS_OPEN expr LSL_PARENTHESIS_CLOSE { $$ = addParenthesis($2); } ; %% 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 @@ -4 + 2 * 10 + 3 * (5 + 1) +4 + 2 * 10 + 3 * (5 + 1); -- cgit v1.1