From f1a48f173922785a4f18ad789f1d0cd7080bb3d1 Mon Sep 17 00:00:00 2001 From: David Walter Seikel Date: Fri, 6 Jan 2012 18:50:14 +1000 Subject: Added most of the expression parser. --- LuaSL/src/LuaSL_LSL_tree.c | 31 ++++++++++++++-------------- LuaSL/src/LuaSL_lexer.l | 36 ++++++++++++++++++++++++++++----- LuaSL/src/LuaSL_yaccer.y | 50 ++++++++++++++++++++++++++++++++++------------ 3 files changed, 84 insertions(+), 33 deletions(-) (limited to 'LuaSL') diff --git a/LuaSL/src/LuaSL_LSL_tree.c b/LuaSL/src/LuaSL_LSL_tree.c index a69b0d3..88768e0 100644 --- a/LuaSL/src/LuaSL_LSL_tree.c +++ b/LuaSL/src/LuaSL_LSL_tree.c @@ -139,6 +139,13 @@ int evaluateExpression(LSL_Expression *exp, int old) #endif case LSL_EXPRESSION : { +#ifdef LUASL_DEBUG + #ifdef LUASL_USE_ENUM + printf(" %s ", LSL_Tokens[exp->expression - LSL_COMMA].token); + #else + printf(" # "); + #endif +#endif switch (exp->expression) { #ifdef LUASL_USE_ENUM @@ -162,30 +169,25 @@ int evaluateExpression(LSL_Expression *exp, int old) case LSL_ANGLE_OPEN : case LSL_ANGLE_CLOSE : case LSL_TYPECAST : - case LSL_BIT_NOT : - case LSL_BOOL_NOT : - case LSL_NEGATION : break; +#endif + case LSL_BIT_NOT : return ~ evaluateExpression(exp->right, old); + case LSL_BOOL_NOT : return ! evaluateExpression(exp->right, old); + case LSL_NEGATION : return 0 - evaluateExpression(exp->right, old); case LSL_DIVIDE : return evaluateExpression(exp->left, old) / evaluateExpression(exp->right, old); +#ifdef LUASL_USE_ENUM case LSL_MODULO : return evaluateExpression(exp->left, old) % evaluateExpression(exp->right, old); #endif - case LSL_MULTIPLY : -#ifdef LUASL_DEBUG - printf(" * "); -#endif - return evaluateExpression(exp->left, old) * evaluateExpression(exp->right, old); + case LSL_MULTIPLY : return evaluateExpression(exp->left, old) * evaluateExpression(exp->right, old); #ifdef LUASL_USE_ENUM case LSL_DOT_PRODUCT : break; case LSL_CROSS_PRODUCT : break; - case LSL_SUBTRACT : return evaluateExpression(exp->left, old) - evaluateExpression(exp->right, old); -#endif - case LSL_ADD : -#ifdef LUASL_DEBUG - printf(" + "); #endif - return evaluateExpression(exp->left, old) + evaluateExpression(exp->right, old); + case LSL_SUBTRACT : return evaluateExpression(exp->left, old) - evaluateExpression(exp->right, old); + case LSL_ADD : return evaluateExpression(exp->left, old) + evaluateExpression(exp->right, old); #ifdef LUASL_USE_ENUM case LSL_CONCATENATE : break; +#endif case LSL_LEFT_SHIFT : return evaluateExpression(exp->left, old) << evaluateExpression(exp->right, old); case LSL_RIGHT_SHIFT : return evaluateExpression(exp->left, old) >> evaluateExpression(exp->right, old); case LSL_LESS_THAN : return evaluateExpression(exp->left, old) < evaluateExpression(exp->right, old); @@ -199,7 +201,6 @@ int evaluateExpression(LSL_Expression *exp, int old) case LSL_BIT_OR : return evaluateExpression(exp->left, old) | evaluateExpression(exp->right, old); case LSL_BOOL_OR : return evaluateExpression(exp->left, old) || evaluateExpression(exp->right, old); case LSL_BOOL_AND : return evaluateExpression(exp->left, old) && evaluateExpression(exp->right, old); -#endif } break; } diff --git a/LuaSL/src/LuaSL_lexer.l b/LuaSL/src/LuaSL_lexer.l index c496d1d..11c20a0 100644 --- a/LuaSL/src/LuaSL_lexer.l +++ b/LuaSL/src/LuaSL_lexer.l @@ -17,19 +17,45 @@ %option bison-bridge SPACE [ \r\n\t]* -NAME [a-zA-Z_][a-zA-Z0-9_]* -NUMBER [0-9]+ +LETTER [A-Za-z] +DECIMAL [0-9] +HEX [0-9A-Fa-f] + +NAME {LETTER}(_|{LETTER}|{DECIMAL})* +INTEGER {DECIMAL}+ +EXPONANT [eE][+-]?{INTEGER} +FLOAT {INTEGER}("."{INTEGER})?{EXPONANT}? %% {SPACE} { ECHO; /* Skip blanks. */ } {NAME} { ECHO; /* yylval->nameValue=strdup(yytext); return LSL_NAME; */ } -{NUMBER} { ECHO; yylval->integerValue = atoi(yytext); return LSL_INTEGER; } +{INTEGER} { ECHO; yylval->integerValue = atoi(yytext); return LSL_INTEGER; } +{FLOAT} { ECHO; /* yylval->floatValue = atof(yytext); return LSL_FLOAT; */ } +"&&" { ECHO; return LSL_BOOL_AND; } +"||" { ECHO; return LSL_BOOL_OR; } +"|" { ECHO; return LSL_BIT_OR; } +"^" { ECHO; return LSL_BIT_XOR; } +"&" { ECHO; return LSL_BIT_AND; } +"!=" { ECHO; return LSL_NOT_EQUAL; } +"==" { ECHO; return LSL_EQUAL; } +">=" { ECHO; return LSL_GREATER_EQUAL; } +"<=" { ECHO; return LSL_LESS_EQUAL; } +">" { ECHO; return LSL_GREATER_THAN; } +"<" { ECHO; return LSL_LESS_THAN; } +">>" { ECHO; return LSL_RIGHT_SHIFT; } +"<<" { ECHO; return LSL_LEFT_SHIFT; } +"+" { ECHO; return LSL_ADD; } +"-" { ECHO; return LSL_SUBTRACT; } +"*" { ECHO; return LSL_MULTIPLY; } +"%" { ECHO; return LSL_MODULO; } +"/" { ECHO; return LSL_DIVIDE; } +"!" { ECHO; return LSL_BOOL_NOT; } +"~" { ECHO; return LSL_BIT_NOT; } "(" { ECHO; return LSL_PARENTHESIS_OPEN; } ")" { ECHO; return LSL_PARENTHESIS_CLOSE; } -"*" { ECHO; return LSL_MULTIPLY; } -"+" { ECHO; return LSL_ADD; } + . { ECHO; printf(" unexpected character.\n"); } %% diff --git a/LuaSL/src/LuaSL_yaccer.y b/LuaSL/src/LuaSL_yaccer.y index 5d01f46..fd5a461 100644 --- a/LuaSL/src/LuaSL_yaccer.y +++ b/LuaSL/src/LuaSL_yaccer.y @@ -9,28 +9,52 @@ %define api.pure -%left '+' LSL_ADD -%left '*' LSL_MULTIPLY +%token LSL_INTEGER -%token LSL_ADD -%token LSL_MULTIPLY -%token LSL_PARENTHESIS_OPEN LSL_PARENTHESIS_CLOSE +%left LSL_BOOL_AND +%left LSL_BOOL_OR +%left LSL_BIT_AND LSL_BIT_XOR LSL_BIT_OR +%left LSL_EQUAL LSL_NOT_EQUAL +%left LSL_LESS_THAN LSL_GREATER_THAN LSL_LESS_EQUAL LSL_GREATER_EQUAL +%left LSL_LEFT_SHIFT LSL_RIGHT_SHIFT +%left LSL_SUBTRACT LSL_ADD +%left LSL_DIVIDE LSL_MODULO LSL_MULTIPLY +%right LSL_BIT_NOT LSL_BOOL_NOT LSL_NEGATION -%token LSL_INTEGER +%token LSL_PARENTHESIS_OPEN LSL_PARENTHESIS_CLOSE %type expr %% -input: - expr { ((LuaSL_yyparseParam*)data)->expression = $1; } - ; +input : + expr { ((LuaSL_yyparseParam*)data)->expression = $1; } +; -expr: - LSL_PARENTHESIS_OPEN expr LSL_PARENTHESIS_CLOSE { $$ = $2; } - | expr LSL_MULTIPLY expr { $$ = addOperation( LSL_MULTIPLY, $1, $3 ); } +expr : + LSL_INTEGER { $$ = addInteger($1); } + | expr LSL_BOOL_AND expr { $$ = addOperation( LSL_BOOL_AND, $1, $3 ); } + | expr LSL_BOOL_OR expr { $$ = addOperation( LSL_BOOL_OR, $1, $3 ); } + | expr LSL_BIT_OR expr { $$ = addOperation( LSL_BIT_OR, $1, $3 ); } + | expr LSL_BIT_XOR expr { $$ = addOperation( LSL_BIT_XOR, $1, $3 ); } + | expr LSL_BIT_AND expr { $$ = addOperation( LSL_BIT_AND, $1, $3 ); } + | expr LSL_NOT_EQUAL expr { $$ = addOperation( LSL_NOT_EQUAL, $1, $3 ); } + | expr LSL_EQUAL expr { $$ = addOperation( LSL_EQUAL, $1, $3 ); } + | expr LSL_GREATER_EQUAL expr { $$ = addOperation( LSL_GREATER_EQUAL, $1, $3 ); } + | expr LSL_LESS_EQUAL expr { $$ = addOperation( LSL_LESS_EQUAL, $1, $3 ); } + | expr LSL_GREATER_THAN expr { $$ = addOperation( LSL_GREATER_THAN, $1, $3 ); } + | expr LSL_LESS_THAN expr { $$ = addOperation( LSL_LESS_THAN, $1, $3 ); } + | expr LSL_RIGHT_SHIFT expr { $$ = addOperation( LSL_RIGHT_SHIFT, $1, $3 ); } + | expr LSL_LEFT_SHIFT expr { $$ = addOperation( LSL_LEFT_SHIFT, $1, $3 ); } | expr LSL_ADD expr { $$ = addOperation( LSL_ADD, $1, $3 ); } - | LSL_INTEGER { $$ = addInteger($1); } + | expr LSL_SUBTRACT expr { $$ = addOperation( LSL_SUBTRACT, $1, $3 ); } + | expr LSL_MULTIPLY expr { $$ = addOperation( LSL_MULTIPLY, $1, $3 ); } + | expr LSL_MODULO expr { $$ = addOperation( LSL_MODULO, $1, $3 ); } + | expr LSL_DIVIDE expr { $$ = addOperation( LSL_DIVIDE, $1, $3 ); } + | 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; } ; %% -- cgit v1.1