From 737e7f59330532755167a222d4d52bb8cc2d6009 Mon Sep 17 00:00:00 2001 From: David Walter Seikel Date: Sun, 15 Jan 2012 23:47:53 +1000 Subject: Get multi file parsing working. --- LuaSL/src/LuaSL_LSL_tree.c | 214 +++++++++++++++++++++------------------------ LuaSL/src/LuaSL_LSL_tree.h | 37 +++----- LuaSL/src/LuaSL_lexer.l | 46 ++++------ 3 files changed, 130 insertions(+), 167 deletions(-) (limited to 'LuaSL') diff --git a/LuaSL/src/LuaSL_LSL_tree.c b/LuaSL/src/LuaSL_LSL_tree.c index 5a082bd..169a699 100644 --- a/LuaSL/src/LuaSL_LSL_tree.c +++ b/LuaSL/src/LuaSL_LSL_tree.c @@ -672,66 +672,74 @@ static void convertLeaf2Lua(FILE *file, LSL_Leaf *leaf) } } -int nextFile(LuaSL_yyparseExtra *extra) +static void doneParsing(LuaSL_yyparseParam *param) { - if (NULL != extra->file) - fclose(extra->file); - if (--(extra->argc) > 0 && *++(extra->argv) != '\0') + if (param->ast) { - strncpy(extra->fileName, *(extra->argv), PATH_MAX - 1); - extra->fileName[PATH_MAX - 1] = '\0'; - extra->file = fopen(extra->fileName, "r"); - if (NULL == extra->file) + FILE *out; + char buffer[PATH_MAX]; + char outName[PATH_MAX]; + char luaName[PATH_MAX]; + int count; + + outputLeaf(stdout, param->ast); + printf("\n"); + evaluateLeaf(param->ast, NULL, NULL); + printf("\n"); + + strcpy(outName, param->fileName); + strcat(outName, "2"); + strcpy(luaName, param->fileName); + strcat(luaName, ".lua"); + out = fopen(outName, "w"); + if (out) + { + outputLeaf(out, param->ast); + fclose(out); + sprintf(buffer, "diff %s %s", param->fileName, outName); + count = system(buffer); + printf("Return value of %s is %d\n", buffer, count); + if (0 != count) + fprintf(stderr, "%s says they are different!\n", buffer); + } + else + fprintf(stderr, "Unable to open file %s for writing!\n", outName); + out = fopen(luaName, "w"); + if (out) { - fprintf(stderr, "Error opening file %s.\n", extra->fileName); - return 1; + convertLeaf2Lua(out, param->ast); + fclose(out); } - printf("Opened %s.\n", extra->fileName); - return(0); + else + fprintf(stderr, "Unable to open file %s for writing!\n", luaName); } - return(1); } -int main(int argc, char **argv) +static int nextFile(LuaSL_yyparseParam *param) { -// char *programName = argv[0]; - int i; - - // Figure out what numbers yacc gave to our tokens. - for (i = 0; LSL_Tokens[i].token != NULL; i++) + if (NULL != param->file) { - if (lowestToken > LSL_Tokens[i].type) - lowestToken = LSL_Tokens[i].type; + fclose(param->file); + param->file = NULL; } - tokens = calloc(i + 1, sizeof(LSL_Token *)); - if (tokens) + if (--(param->argc) > 0 && *++(param->argv) != '\0') { - char buffer[PATH_MAX]; - char fileName[PATH_MAX]; - LuaSL_yyparseParam param; - LuaSL_yyparseExtra extra; - int count; - - // Sort the token table. - for (i = 0; LSL_Tokens[i].token != NULL; i++) + strncpy(param->fileName, *(param->argv), PATH_MAX - 1); + param->fileName[PATH_MAX - 1] = '\0'; + param->file = fopen(param->fileName, "r"); + if (NULL == param->file) { - int j = LSL_Tokens[i].type - lowestToken; - - tokens[j] = &(LSL_Tokens[i]); + fprintf(stderr, "Error opening file %s.\n", param->fileName); + return FALSE; } - - fileName[0] = '\0'; - param.ast = NULL; - param.lval = calloc(1, sizeof(LSL_Leaf)); - memset(&extra, 0, sizeof(extra)); - extra.argc = argc; - extra.argv = argv; - extra.fileName = fileName; - extra.file = NULL; - // Grab the first file name, if any. - if (1 == nextFile(&extra)) - return 1; - + printf("Opened %s.\n", param->fileName); + burnLeaf(param->ast); + param->ast = NULL; + param->lval = calloc(1, sizeof(LSL_Leaf)); + param->line = 0; + param->column = 0; + return TRUE; + } /* if ('\0' == fileName[0]) { @@ -757,87 +765,67 @@ int main(int argc, char **argv) } */ - if (yylex_init_extra(&extra, &(param.scanner))) - return 1; + return FALSE; +} -#ifdef LUASL_DEBUG -// yydebug= 5; -#endif +int main(int argc, char **argv) +{ +// char *programName = argv[0]; + int i; + // Figure out what numbers yacc gave to our tokens. + for (i = 0; LSL_Tokens[i].token != NULL; i++) + { + if (lowestToken > LSL_Tokens[i].type) + lowestToken = LSL_Tokens[i].type; + } + tokens = calloc(i + 1, sizeof(LSL_Token *)); + if (tokens) + { + LuaSL_yyparseParam param; -#ifdef LUASL_DEBUG - yyset_debug(1, param.scanner); -#endif + // Sort the token table. + for (i = 0; LSL_Tokens[i].token != NULL; i++) + { + int j = LSL_Tokens[i].type - lowestToken; -#ifdef LUASL_FILES - yyset_in(extra.file, &(param.scanner)); -#endif + tokens[j] = &(LSL_Tokens[i]); + } + + // First time setup. + memset(¶m, 0, sizeof(param)); + param.argc = argc; + param.argv = argv; + + // Loop through the files. + while (nextFile(¶m)) { void *pParser = ParseAlloc(malloc); int yv; - ParseTrace(stdout, "LSL_lemon "); - -#ifndef LUASL_FILES - while ((i = fread(buffer, 1, PATH_MAX - 1, extra.file)) > 0) +#ifdef LUASL_DEBUG +// yydebug= 5; #endif - { -#ifndef LUASL_FILES - buffer[i] = '\0'; - yy_scan_string(buffer, param.scanner); + if (yylex_init_extra(¶m, &(param.scanner))) + return 1; +#ifdef LUASL_DEBUG + yyset_debug(1, param.scanner); #endif - // on EOF yylex will return 0 - while((yv = yylex(param.lval, param.scanner)) != 0) - { - Parse(pParser, yv, param.lval, ¶m); - if (LSL_SCRIPT == yv) - break; - param.lval = calloc(1, sizeof(LSL_Leaf)); - } + yyset_in(param.file, param.scanner); + ParseTrace(stdout, "LSL_lemon "); + // on EOF yylex will return 0 + while((yv = yylex(param.lval, param.scanner)) != 0) + { + Parse(pParser, yv, param.lval, ¶m); + if (LSL_SCRIPT == yv) + break; + param.lval = calloc(1, sizeof(LSL_Leaf)); } yylex_destroy(param.scanner); Parse (pParser, 0, param.lval, ¶m); ParseFree(pParser, free); - - if (param.ast) - { - FILE *out; - char outName[PATH_MAX]; - char luaName[PATH_MAX]; - - outputLeaf(stdout, param.ast); - printf("\n"); - evaluateLeaf(param.ast, NULL, NULL); - printf("\n"); - - strcpy(outName, fileName); - strcat(outName, "2"); - strcpy(luaName, fileName); - strcat(luaName, ".lua"); - out = fopen(outName, "w"); - if (out) - { - outputLeaf(out, param.ast); - fclose(out); - sprintf(buffer, "diff %s %s", fileName, outName); - count = system(buffer); - printf("Return value of %s is %d\n", buffer, count); - if (0 != count) - fprintf(stderr, "%s says they are different!\n", buffer); - } - else - fprintf(stderr, "Unable to open file %s for writing!\n", outName); - out = fopen(luaName, "w"); - if (out) - { - convertLeaf2Lua(out, param.ast); - fclose(out); - } - else - fprintf(stderr, "Unable to open file %s for writing!\n", luaName); - burnLeaf(param.ast); - } + doneParsing(¶m); } } else diff --git a/LuaSL/src/LuaSL_LSL_tree.h b/LuaSL/src/LuaSL_LSL_tree.h index 2ef48ee..b87e7d2 100644 --- a/LuaSL/src/LuaSL_LSL_tree.h +++ b/LuaSL/src/LuaSL_LSL_tree.h @@ -3,7 +3,6 @@ #define __LSL_TREE_H__ #define LUASL_DEBUG -//#define LUASL_FILES #include // So we can have NULL defined. @@ -264,44 +263,30 @@ struct _LSL_Script LSL_Identifier *variables; }; +// Define the type for flex and lemon. +#define YYSTYPE LSL_Leaf + typedef struct { - char *ignorableText; - int column; - int line; + void *scanner; // This should be of type yyscan_t, which is typedef to void * anyway, but that does not get defined until LuaSL_lexer.h, which depends on this struct being defined first. int argc; char **argv; - char *fileName; + char fileName[PATH_MAX]; FILE *file; -} LuaSL_yyparseExtra; - - -// define the type for flex and lemon3 -#define YYSTYPE LSL_Leaf + LSL_Leaf *ast; + char *ignorableText; + LSL_Leaf *lval; + int column; + int line; +} LuaSL_yyparseParam; #ifndef excludeLexer #include "LuaSL_lexer.h" #endif -typedef struct -{ - yyscan_t scanner; - LSL_Leaf *ast; - LSL_Leaf *lval; -} LuaSL_yyparseParam; - -// the parameter name (of the reentrant 'yyparse' function) -// data is a pointer to a 'yyparseParam' structure -//#define YYPARSE_PARAM data - -// the argument for the 'yylex' function -#define YYLEX_PARAM ((LuaSL_yyparseParam*)data)->scanner -//#define ParseTOKENTYPE YYSTYPE * -//#define ParseARG_PDECL , LuaSL_yyparseParam *param void burnLeaf(LSL_Leaf *leaf); -int nextFile(LuaSL_yyparseExtra *extra); LSL_Leaf *addExpression(LSL_Leaf *exp); LSL_Leaf *addOperation(LSL_Leaf *left, LSL_Leaf *lval, LSL_Leaf *right); LSL_Leaf *addParenthesis(LSL_Leaf *lval, LSL_Leaf *expr, LSL_Leaf *rval); diff --git a/LuaSL/src/LuaSL_lexer.l b/LuaSL/src/LuaSL_lexer.l index 8e5e4ca..15cfae2 100644 --- a/LuaSL/src/LuaSL_lexer.l +++ b/LuaSL/src/LuaSL_lexer.l @@ -3,7 +3,7 @@ #define excludeLexer #include "LuaSL_LSL_tree.h" -int common(YYSTYPE *lval, char *text, LuaSL_yyparseExtra *extra, boolean checkIgnorable, int type); +int common(YYSTYPE *lval, char *text, LuaSL_yyparseParam *param, boolean checkIgnorable, int type); %} @@ -12,7 +12,7 @@ int common(YYSTYPE *lval, char *text, LuaSL_yyparseExtra *extra, boolean checkIg %option noreject noyymore %option backup debug perf-report perf-report verbose warn %option align full -%option extra-type="LuaSL_yyparseExtra *" +%option extra-type="LuaSL_yyparseParam *" HEX [[:xdigit:]] DECIMAL [[:digit:]] @@ -110,54 +110,49 @@ IDENTIFIER [[:alpha:]](_|[[:alpha:]]|[[:digit:]])* %% -int common(YYSTYPE *lval, char *text, LuaSL_yyparseExtra *extra, boolean checkIgnorable, int type) +int common(YYSTYPE *lval, char *text, LuaSL_yyparseParam *param, boolean checkIgnorable, int type) { int i; for (i = 0; text[i] != '\0'; i++) if (text[i] == '\n') { - extra->column = 0; - extra->line++; + param->column = 0; + param->line++; } else if (text[i] == '\t') - extra->column += 8 - (extra->column % 8); + param->column += 8 - (param->column % 8); else - extra->column++; + param->column++; lval->token = tokens[type - lowestToken]; - lval->line = extra->line; - lval->column = extra->column; + lval->line = param->line; + lval->column = param->column; if (checkIgnorable) { - lval->ignorableText = extra->ignorableText; - extra->ignorableText = NULL; + lval->ignorableText = param->ignorableText; + param->ignorableText = NULL; } else { - if (extra->ignorableText) + if (param->ignorableText) { - int lenI = strlen(extra->ignorableText); + int lenI = strlen(param->ignorableText); int lenT = strlen(text); - extra->ignorableText = realloc(extra->ignorableText, lenI + lenT + 1); - sprintf(&(extra->ignorableText[lenI]), "%s", text); + param->ignorableText = realloc(param->ignorableText, lenI + lenT + 1); + sprintf(&(param->ignorableText[lenI]), "%s", text); } else - extra->ignorableText = strdup(text); + param->ignorableText = strdup(text); } return type; } -int yywrap(yyscan_t yyscanner) +int yywrap(yyscan_t yyscanner) // This as actually useless for our needs, as it is called BEFORE the last token is dealt with. { -#ifdef LUASL_FILES - LuaSL_yyparseExtra *extra = yyget_extra(yyscanner); -#endif - int result = 1; - #ifdef FLEX_SCANNER #ifndef LL_WINDOWS // Get gcc to stop complaining about lack of use of yyunput and input. @@ -166,11 +161,6 @@ int yywrap(yyscan_t yyscanner) #endif #endif -#ifdef LUASL_FILES - result = nextFile(extra); - if (0 == result) - yyset_in(extra->file, yyscanner); -#endif - return result; + return 1; } -- cgit v1.1