From d4b977d0904a1dea37922dac60d3bb37f9769230 Mon Sep 17 00:00:00 2001 From: David Walter Seikel Date: Thu, 5 Jan 2012 04:47:56 +1000 Subject: Add a simple flex + btyacc stub. Will be fleshed out soon with LSL grammer. --- LuaSL/src/LuaSL_parser.c | 86 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 LuaSL/src/LuaSL_parser.c (limited to 'LuaSL/src/LuaSL_parser.c') diff --git a/LuaSL/src/LuaSL_parser.c b/LuaSL/src/LuaSL_parser.c new file mode 100644 index 0000000..9e1d3ca --- /dev/null +++ b/LuaSL/src/LuaSL_parser.c @@ -0,0 +1,86 @@ +#include "LuaSL_parser_param.h" +#include "LuaSL_yaccer.tab.h" + + +int yyparse(void *param); + +static int initParserParam(SParserParam* param) +{ + int ret = 0; + + ret = yylex_init(¶m->scanner); + param->expression = NULL; + + return ret; +} + +static int destroyParserParam(SParserParam* param) +{ + return yylex_destroy(param->scanner); +} + +SExpression *getAST(const char *expr) +{ + SParserParam p; + YY_BUFFER_STATE state; + + if ( initParserParam(&p) ) + { + // couldn't initialize + return NULL; + } + + state = yy_scan_string(expr, p.scanner); + + if ( yyparse(&p) ) + { + // error parsing + return NULL; + } + + yy_delete_buffer(state, p.scanner); + + destroyParserParam(&p); + + return p.expression; +} + +int evaluate(SExpression *e) +{ + switch(e->type) + { + case eVALUE: + return e->value; + case eMULTIPLY: + return evaluate(e->left) * evaluate(e->right); + case ePLUS: + return evaluate(e->left) + evaluate(e->right); + default: + // shouldn't be here + return 0; + } +} + +int yyerror(const char *msg) +{ + fprintf(stderr,"Error:%s\n",msg); return 0; +} + +int main(void) +{ + SExpression *e = NULL; + char test[]=" 4 + 2*10 + 3*( 5 + 1 )"; + int result = 0; + + e = getAST(test); + + result = evaluate(e); + + printf("Result of '%s' is %d\n", test, result); + + deleteExpression(e); + + return 0; +} + + -- cgit v1.1