From 0306182b9bcafa7f850dd91aa196ae7d562d2254 Mon Sep 17 00:00:00 2001 From: David Walter Seikel Date: Sun, 8 Jan 2012 09:01:44 +1000 Subject: Use character classes, some clean up. Tried to add space storing, but it did not work. --- LuaSL/src/LuaSL_LSL_tree.c | 17 ++++++++++++++--- LuaSL/src/LuaSL_LSL_tree.h | 28 ++++++++++++++-------------- LuaSL/src/LuaSL_lexer.l | 19 +++++++------------ LuaSL/src/LuaSL_yaccer.y | 13 +++++++++++-- 4 files changed, 46 insertions(+), 31 deletions(-) (limited to 'LuaSL') diff --git a/LuaSL/src/LuaSL_LSL_tree.c b/LuaSL/src/LuaSL_LSL_tree.c index c3f2a49..cc9007c 100644 --- a/LuaSL/src/LuaSL_LSL_tree.c +++ b/LuaSL/src/LuaSL_LSL_tree.c @@ -69,7 +69,7 @@ LSL_Token LSL_Tokens[] = // Then the rest of the syntax tokens. -// {LSL_SPACE, " ", LSL_NONE, NULL, NULL, NULL}, + {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}, @@ -142,7 +142,7 @@ LSL_AST *addInteger(int value) return ast; } -LSL_AST *addOperation(LSL_Operation type, LSL_AST *left, LSL_AST *right) +LSL_AST *addOperation(LSL_Type type, LSL_AST *left, LSL_AST *right) { LSL_AST *ast = newAST(type, left, right); @@ -182,11 +182,22 @@ LSL_Statement *createStatement(LSL_Type type, LSL_AST *expr) return stat; } +LSL_AST *addSpace(char *text, LSL_AST *root) +{ + LSL_AST *ast = newAST(LSL_SPACE, root, NULL); + + if (ast) + ast->content.spaceValue = text; + + return ast; +} + LSL_AST *addStatement(LSL_Statement *statement, LSL_AST *root) { LSL_AST *ast = newAST(LSL_STATEMENT, root, NULL); - ast->content.statementValue = statement; + if (ast) + ast->content.statementValue = statement; return ast; } diff --git a/LuaSL/src/LuaSL_LSL_tree.h b/LuaSL/src/LuaSL_LSL_tree.h index 597db54..0b2f125 100644 --- a/LuaSL/src/LuaSL_LSL_tree.h +++ b/LuaSL/src/LuaSL_LSL_tree.h @@ -89,16 +89,12 @@ typedef enum // In order of precedence, high to low. LSL_BIT_XOR, LSL_BIT_OR, LSL_BOOL_OR, - LSL_BOOL_AND -} LSL_Operation; -#else -typedef int LSL_Operation; -#endif + LSL_BOOL_AND, -#ifdef LUASL_USE_ENUM -typedef enum -{ - LSL_COMMENT = (LSL_BOOL_AND + 1), + // The rest are not operater types. + + LSL_SPACE, + LSL_COMMENT, LSL_TYPE, LSL_NAME, LSL_IDENTIFIER, @@ -125,7 +121,8 @@ typedef enum LSL_PARAMETER, LSL_FUNCTION, LSL_STATE, - LSL_SCRIPT + LSL_SCRIPT, + LSL_UNKNOWN } LSL_Type; #else typedef int LSL_Type; @@ -166,6 +163,7 @@ typedef struct typedef union LSL_Leaf { + char *spaceValue; char *commentValue; LSL_Type typeValue; char *nameValue; @@ -178,7 +176,7 @@ typedef union LSL_Leaf float rotationValue[4]; union LSL_Leaf *listValue; char *labelValue; - LSL_Operation operationValue; + LSL_Type operationValue; struct LSL_AST *expressionValue; LSL_Statement *doValue; LSL_Statement *forValue; @@ -192,6 +190,7 @@ typedef union LSL_Leaf LSL_Function *functionValue; LSL_State *stateValue; LSL_Script *scriptValue; + char *unknownValue; } LSL_Leaf; typedef struct @@ -257,10 +256,11 @@ 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 *addOperation(LSL_Type 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); +LSL_Statement *createStatement(LSL_Type type, LSL_AST *root); +LSL_AST *addStatement(LSL_Statement *statement, LSL_AST *root); +LSL_AST *addSpace(char *text, LSL_AST *root); int yyerror(const char *msg); int yyparse(void *param); diff --git a/LuaSL/src/LuaSL_lexer.l b/LuaSL/src/LuaSL_lexer.l index 91e4264..2166743 100644 --- a/LuaSL/src/LuaSL_lexer.l +++ b/LuaSL/src/LuaSL_lexer.l @@ -19,22 +19,17 @@ %option backup debug perf-report perf-report verbose warn %option align full -SPACE [ \r\n\t]* - -LETTER [A-Za-z] -DECIMAL [0-9] -HEX [0-9A-Fa-f] - -NAME {LETTER}(_|{LETTER}|{DECIMAL})* -INTEGER {DECIMAL}+ +HEX [[:xdigit:]] +NAME [[:alpha:]](_|[[:alpha:]]|[[:digit:]])* +INTEGER [[:digit:]]+ EXPONANT [eE][+-]?{INTEGER} FLOAT {INTEGER}("."{INTEGER})?{EXPONANT}? %% /* Basic tokens */ -{SPACE} %{ ECHO; /* Skip blanks. */ %} -{NAME} %{ ECHO; /* yylval->nameValue=strdup(yytext); return LSL_NAME; */ %} +[[:space:]]+ %{ /* ECHO; yylval->spaceValue = strdup(yytext); return LSL_SPACE; */ %} +{NAME} %{ ECHO; /* yylval->nameValue = strdup(yytext); return LSL_NAME; */ %} {INTEGER} %{ ECHO; yylval->integerValue = atoi(yytext); return LSL_INTEGER; %} {FLOAT} %{ ECHO; /* yylval->floatValue = atof(yytext); return LSL_FLOAT; */ %} @@ -74,12 +69,12 @@ int yywrap(yyscan_t yyscanner) { #ifdef FLEX_SCANNER #ifndef LL_WINDOWS - // get gcc to stop complaining about lack of use of yyunput + // Get gcc to stop complaining about lack of use of yyunput and input. (void) yyunput; (void) input; #endif #endif -// TODO - If we are getting files from stdin, or multiple -f arguments, we should loop through them asd return 0. Return 1 when there are no more files. +// TODO - If we are getting files from stdin, or multiple -f arguments, we should loop through them and return 0. Return 1 when there are no more files. return(1); } diff --git a/LuaSL/src/LuaSL_yaccer.y b/LuaSL/src/LuaSL_yaccer.y index 75cfd78..57d3075 100644 --- a/LuaSL/src/LuaSL_yaccer.y +++ b/LuaSL/src/LuaSL_yaccer.y @@ -9,9 +9,12 @@ %define api.pure -%token LSL_INTEGER +%token LSL_SPACE %nonassoc LSL_STATEMENT + +%token LSL_INTEGER + %left LSL_BOOL_AND %left LSL_BOOL_OR %left LSL_BIT_AND LSL_BIT_XOR LSL_BIT_OR @@ -20,19 +23,25 @@ %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_PARENTHESIS_OPEN LSL_PARENTHESIS_CLOSE LSL_EXPRESSION %type expr - %type statement +%type ignorable %% input : expr { ((LuaSL_yyparseParam*)data)->ast = addOperation(LSL_EXPRESSION, $1, $1); } | statement { ((LuaSL_yyparseParam*)data)->ast = addStatement($1, ((LuaSL_yyparseParam*)data)->ast); } + | ignorable { ((LuaSL_yyparseParam*)data)->ast = addSpace($1, ((LuaSL_yyparseParam*)data)->ast); } +; + +ignorable : + LSL_SPACE { $$ = strdup($1); } ; statement : -- cgit v1.1