From e85ff16e367aaf3b0e68e6a79615496d179f85ca Mon Sep 17 00:00:00 2001 From: David Walter Seikel Date: Fri, 6 Jan 2012 16:27:25 +1000 Subject: Even more debugging stuff, and make it selectable if the parser uses #defines or enums for tokens. NOTE - enum does not work anyway with btyacc. --- LuaSL/src/LuaSL_LSL_tree.c | 267 ++++++++++++++++++++++++++++----------------- LuaSL/src/LuaSL_LSL_tree.h | 28 +++-- LuaSL/src/LuaSL_lexer.l | 27 +++-- LuaSL/src/LuaSL_yaccer.y | 7 +- 4 files changed, 207 insertions(+), 122 deletions(-) (limited to 'LuaSL') diff --git a/LuaSL/src/LuaSL_LSL_tree.c b/LuaSL/src/LuaSL_LSL_tree.c index 552de04..a69b0d3 100644 --- a/LuaSL/src/LuaSL_LSL_tree.c +++ b/LuaSL/src/LuaSL_LSL_tree.c @@ -7,6 +7,7 @@ #define LSL_Tokens_define #include "LuaSL_LSL_tree.h" #include +#include /** @@ -88,10 +89,18 @@ LSL_Expression *newTree(const char *expr) LuaSL_yyparseParam param; YY_BUFFER_STATE state; +#ifdef LUASL_DEBUG + yydebug= 5; +#endif + param.expression = NULL; if (yylex_init(&(param.scanner))) return NULL; +#ifdef LUASL_DEBUG + yyset_debug(1, param.scanner); +#endif + state = yy_scan_string(expr, param.scanner); if (yyparse(¶m)) return NULL; @@ -106,88 +115,112 @@ int evaluateExpression(LSL_Expression *exp, int old) { switch(exp->type) { -// case LSL_COMMENT : -// case LSL_TYPE : -// case LSL_NAME : -// case LSL_IDENTIFIER : -// break; -// case LSL_FLOAT : return (int) exp->value.floatValue; - case LSL_INTEGER : return exp->value.integerValue; -// case LSL_STRING : -// case LSL_KEY : -// case LSL_VECTOR : -// case LSL_ROTATION : -// case LSL_LIST : -// case LSL_LABEL : -// break; +#ifdef LUASL_USE_ENUM + case LSL_COMMENT : + case LSL_TYPE : + case LSL_NAME : + case LSL_IDENTIFIER : + break; + case LSL_FLOAT : return (int) exp->value.floatValue; +#endif + case LSL_INTEGER : +#ifdef LUASL_DEBUG + printf("%d", exp->value.integerValue); +#endif + return exp->value.integerValue; +#ifdef LUASL_USE_ENUM + case LSL_STRING : + case LSL_KEY : + case LSL_VECTOR : + case LSL_ROTATION : + case LSL_LIST : + case LSL_LABEL : + break; +#endif case LSL_EXPRESSION : { switch (exp->expression) { -// case LSL_COMMA : -// case LSL_INCREMENT_PRE : -// case LSL_INCREMENT_POST : -// case LSL_DECREMENT_PRE : -// case LSL_DECREMENT_POST : -// case LSL_DOT : -// case LSL_ASSIGNMENT_PLAIN : -// case LSL_ASSIGNMENT_DIVIDE : -// case LSL_ASSIGNMENT_MODULO : -// case LSL_ASSIGNMENT_MULTIPLY : -// case LSL_ASSIGNMENT_SUBTRACT : -// case LSL_ASSIGNMENT_ADD : -// case LSL_ASSIGNMENT_CONCATENATE : +#ifdef LUASL_USE_ENUM + case LSL_COMMA : + case LSL_INCREMENT_PRE : + case LSL_INCREMENT_POST : + case LSL_DECREMENT_PRE : + case LSL_DECREMENT_POST : + case LSL_DOT : + case LSL_ASSIGNMENT_PLAIN : + case LSL_ASSIGNMENT_DIVIDE : + case LSL_ASSIGNMENT_MODULO : + case LSL_ASSIGNMENT_MULTIPLY : + case LSL_ASSIGNMENT_SUBTRACT : + case LSL_ASSIGNMENT_ADD : + case LSL_ASSIGNMENT_CONCATENATE : case LSL_PARENTHESIS_OPEN : case LSL_PARENTHESIS_CLOSE : -// case LSL_BRACKET_OPEN : -// case LSL_BRACKET_CLOSE : -// case LSL_ANGLE_OPEN : -// case LSL_ANGLE_CLOSE : -// case LSL_TYPECAST : -// case LSL_BIT_NOT : -// case LSL_BOOL_NOT : -// case LSL_NEGATION : + case LSL_BRACKET_OPEN : + case LSL_BRACKET_CLOSE : + case LSL_ANGLE_OPEN : + case LSL_ANGLE_CLOSE : + case LSL_TYPECAST : + case LSL_BIT_NOT : + case LSL_BOOL_NOT : + case LSL_NEGATION : break; -// case LSL_DIVIDE : return evaluateExpression(exp->left, old) / evaluateExpression(exp->right, old); -// case LSL_MODULO : return evaluateExpression(exp->left, old) % evaluateExpression(exp->right, old); - case LSL_MULTIPLY : return evaluateExpression(exp->left, old) * evaluateExpression(exp->right, old); -// case LSL_DOT_PRODUCT : break; -// case LSL_CROSS_PRODUCT : break; -// case LSL_SUBTRACT : return evaluateExpression(exp->left, old) - evaluateExpression(exp->right, old); - case LSL_ADD : return evaluateExpression(exp->left, old) + evaluateExpression(exp->right, old); -// case LSL_CONCATENATE : break; -// 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); -// case LSL_GREATER_THAN : return evaluateExpression(exp->left, old) > evaluateExpression(exp->right, old); -// case LSL_LESS_EQUAL : return evaluateExpression(exp->left, old) <= evaluateExpression(exp->right, old); -// case LSL_GREATER_EQUAL : return evaluateExpression(exp->left, old) >= evaluateExpression(exp->right, old); -// case LSL_EQUAL : return evaluateExpression(exp->left, old) == evaluateExpression(exp->right, old); -// case LSL_NOT_EQUAL : return evaluateExpression(exp->left, old) != evaluateExpression(exp->right, old); -// case LSL_BIT_AND : return evaluateExpression(exp->left, old) & evaluateExpression(exp->right, old); -// case LSL_BIT_XOR : return evaluateExpression(exp->left, old) ^ evaluateExpression(exp->right, 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); + case LSL_DIVIDE : return evaluateExpression(exp->left, old) / evaluateExpression(exp->right, old); + 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); +#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); +#ifdef LUASL_USE_ENUM + case LSL_CONCATENATE : break; + 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); + case LSL_GREATER_THAN : return evaluateExpression(exp->left, old) > evaluateExpression(exp->right, old); + case LSL_LESS_EQUAL : return evaluateExpression(exp->left, old) <= evaluateExpression(exp->right, old); + case LSL_GREATER_EQUAL : return evaluateExpression(exp->left, old) >= evaluateExpression(exp->right, old); + case LSL_EQUAL : return evaluateExpression(exp->left, old) == evaluateExpression(exp->right, old); + case LSL_NOT_EQUAL : return evaluateExpression(exp->left, old) != evaluateExpression(exp->right, old); + case LSL_BIT_AND : return evaluateExpression(exp->left, old) & evaluateExpression(exp->right, old); + case LSL_BIT_XOR : return evaluateExpression(exp->left, old) ^ evaluateExpression(exp->right, 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; } -// case LSL_DO : -// case LSL_FOR : -// case LSL_IF : -// case LSL_ELSE : -// case LSL_ELSEIF : -// case LSL_JUMP : -// case LSL_STATE_CHANGE : -// case LSL_WHILE : -// case LSL_RETURN : -// case LSL_STATEMENT : -// case LSL_BLOCK : -// case LSL_PARAMETER : -// case LSL_FUNCTION : -// case LSL_STATE : -// case LSL_SCRIPT : -// break; +#ifdef LUASL_USE_ENUM + case LSL_DO : + case LSL_FOR : + case LSL_IF : + case LSL_ELSE : + case LSL_ELSEIF : + case LSL_JUMP : + case LSL_STATE_CHANGE : + case LSL_WHILE : + case LSL_RETURN : + case LSL_STATEMENT : + case LSL_BLOCK : + case LSL_PARAMETER : + case LSL_FUNCTION : + case LSL_STATE : + case LSL_SCRIPT : + break; +#endif } return old; @@ -198,45 +231,54 @@ void outputExpression(LSL_Expression *exp) { switch(exp->type) { -// case LSL_COMMENT : return; -// case LSL_TYPE : return; -// case LSL_NAME : return; -// case LSL_IDENTIFIER : return; -// case LSL_FLOAT : printf("%f", exp->value.floatValue); break; +#ifdef LUASL_USE_ENUM + case LSL_COMMENT : return; + case LSL_TYPE : return; + case LSL_NAME : return; + case LSL_IDENTIFIER : return; + case LSL_FLOAT : printf("%f", exp->value.floatValue); break; +#endif case LSL_INTEGER : printf("%d", exp->value.integerValue); break; -// case LSL_STRING : return; -// case LSL_KEY : return; -// case LSL_VECTOR : return; -// case LSL_ROTATION : return; -// case LSL_LIST : return; -// case LSL_LABEL : return; +#ifdef LUASL_USE_ENUM + case LSL_STRING : return; + case LSL_KEY : return; + case LSL_VECTOR : return; + case LSL_ROTATION : return; + case LSL_LIST : return; + case LSL_LABEL : return; +#endif case LSL_EXPRESSION : outputExpression(exp->left); -// printf(" %s ", LSL_Tokens[exp->expression].token); -printf(" # "); +#ifdef LUASL_USE_ENUM + printf(" %s ", LSL_Tokens[exp->expression - LSL_COMMA].token); +#else + printf(" # "); +#endif outputExpression(exp->right); break; -// case LSL_DO : return; -// case LSL_FOR : return; -// case LSL_IF : return; -// case LSL_ELSE : return; -// case LSL_ELSEIF : return; -// case LSL_JUMP : return; -// case LSL_STATE_CHANGE : return; -// case LSL_WHILE : return; -// case LSL_RETURN : return; -// case LSL_STATEMENT : return; -// case LSL_BLOCK : return; -// case LSL_PARAMETER : return; -// case LSL_FUNCTION : return; -// case LSL_STATE : return; -// case LSL_SCRIPT : return; +#ifdef LUASL_USE_ENUM + case LSL_DO : return; + case LSL_FOR : return; + case LSL_IF : return; + case LSL_ELSE : return; + case LSL_ELSEIF : return; + case LSL_JUMP : return; + case LSL_STATE_CHANGE : return; + case LSL_WHILE : return; + case LSL_RETURN : return; + case LSL_STATEMENT : return; + case LSL_BLOCK : return; + case LSL_PARAMETER : return; + case LSL_FUNCTION : return; + case LSL_STATE : return; + case LSL_SCRIPT : return; +#endif } } void convertExpression2Lua(LSL_Expression *exp) { -/* +#ifdef LUASL_USE_ENUM switch(exp->type) { case LSL_COMMENT : return; @@ -268,7 +310,7 @@ void convertExpression2Lua(LSL_Expression *exp) case LSL_STATE : return; case LSL_SCRIPT : return; } -*/ +#endif } int yyerror(const char *msg) @@ -277,3 +319,24 @@ int yyerror(const char *msg) return 0; } +int main(void) +{ + const char test[] = " 4 + 2 * 10 + 3 * ( 5 + 1 )"; + LSL_Expression *exp; + + if ((exp = newTree(test))) + { + int result = evaluateExpression(exp, 0); + +#ifdef LUASL_DEBUG + printf("\n"); +#endif + printf("Result of '%s' is %d\n", test, result); + outputExpression(exp); + printf("\n"); + burnLSLExpression(exp); + } + + return 0; +} + diff --git a/LuaSL/src/LuaSL_LSL_tree.h b/LuaSL/src/LuaSL_LSL_tree.h index 7973509..42cf0ac 100644 --- a/LuaSL/src/LuaSL_LSL_tree.h +++ b/LuaSL/src/LuaSL_LSL_tree.h @@ -8,7 +8,17 @@ #define YY_NO_UNISTD_H 1 #endif // YY_NO_UNISTD_H +//#define LUASL_USE_ENUM +#define LUASL_DEBUG + +#ifndef LUASL_USE_ENUM #include "LuaSL_yaccer.tab.h" +#endif + +#define YYERRCODE 256 +#define YYDEBUG 1 +extern int yydebug; + // http://w-hat.com/stackdepth is a useful discussion about some aspects of the LL parser. @@ -22,12 +32,12 @@ typedef enum LSL_CREATION = 16 } LSL_Flags; -/* +#ifdef LUASL_USE_ENUM typedef enum // In order of precedence, high to low. // Left to right, unless oterwise stated. // According to http://wiki.secondlife.com/wiki/Category:LSL_Operators { - LSL_COMMA, + LSL_COMMA = 257, LSL_INCREMENT_PRE, // Right to left. LSL_INCREMENT_POST, // Right to left. LSL_DECREMENT_PRE, // Right to left. @@ -72,9 +82,9 @@ typedef enum // In order of precedence, high to low. LSL_BOOL_OR, LSL_BOOL_AND } LSL_Operation; -*/ - +#else typedef int LSL_Operation; +#endif typedef struct { @@ -137,10 +147,11 @@ LSL_Operator LSL_Tokens[] = }; #endif -/* + +#ifdef LUASL_USE_ENUM typedef enum { - LSL_COMMENT, + LSL_COMMENT = (LSL_BOOL_AND + 1), LSL_TYPE, LSL_NAME, LSL_IDENTIFIER, @@ -169,11 +180,10 @@ typedef enum LSL_STATE, LSL_SCRIPT } LSL_Type; -*/ - +#else typedef int LSL_Type; #define LSL_EXPRESSION 1 - +#endif #ifdef LSL_Keywords_define char *LSL_Keywords[] = diff --git a/LuaSL/src/LuaSL_lexer.l b/LuaSL/src/LuaSL_lexer.l index 478e62c..5e7d930 100644 --- a/LuaSL/src/LuaSL_lexer.l +++ b/LuaSL/src/LuaSL_lexer.l @@ -3,26 +3,35 @@ #define excludeLexer #include "LuaSL_LSL_tree.h" +#ifdef LUASL_DEBUG + #undef ECHO + #define ECHO printf ("[%s]\n", yytext) +#else + #undef ECHO + #define ECHO {} +#endif + + %} %option reentrant noyywrap never-interactive nounistd %option bison-bridge SPACE [ \r\n\t]* +NAME [a-zA-Z_][a-zA-Z0-9_]* NUMBER [0-9]+ -NAME [a-zA-Z][a-zA-Z0-9]* %% -{SPACE} { /* Skip blanks. */ } -{NUMBER} { yylval->integerValue = atoi(yytext); return LSL_INTEGER; } -{NAME} { /* yylval->nameValue=strdup(yytext); return LSL_NAME; */ } +{SPACE} { ECHO; /* Skip blanks. */ } +{NAME} { ECHO; /* yylval->nameValue=strdup(yytext); return LSL_NAME; */ } +{NUMBER} { ECHO; yylval->integerValue = atoi(yytext); return LSL_INTEGER; } -"*" { return LSL_MULTIPLY; } -"+" { return LSL_ADD; } -"(" { return LSL_PARENTHESIS_OPEN; } -")" { return LSL_PARENTHESIS_CLOSE; } -. { /* This should return an "unknown character" error */ } +"(" { 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 897a83e..414b5e9 100644 --- a/LuaSL/src/LuaSL_yaccer.y +++ b/LuaSL/src/LuaSL_yaccer.y @@ -2,6 +2,9 @@ #include "LuaSL_LSL_tree.h" +//extern char *yytext; +//#define YYDEBUG_LEXER_TEXT yytext + %} %define api.pure @@ -25,9 +28,9 @@ input: ; expr: - expr LSL_ADD expr { $$ = addOperation( LSL_ADD, $1, $3 ); } + LSL_PARENTHESIS_OPEN expr LSL_PARENTHESIS_CLOSE { $$ = $2; } | expr LSL_MULTIPLY expr { $$ = addOperation( LSL_MULTIPLY, $1, $3 ); } - | LSL_PARENTHESIS_OPEN expr LSL_PARENTHESIS_CLOSE { $$ = $2; } + | expr LSL_ADD expr { $$ = addOperation( LSL_ADD, $1, $3 ); } | LSL_INTEGER { $$ = addInteger($1); } ; -- cgit v1.1