From: Dale Weiler Date: Tue, 10 Apr 2012 00:39:54 +0000 (-0400) Subject: Cleanups X-Git-Tag: 0.1-rc1~703 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=c3f08b289bff35de3f5988fa9131bb5bf2dc6001;p=xonotic%2Fgmqcc.git Cleanups --- diff --git a/gmqcc.h b/gmqcc.h index d8dafe2..5f599db 100644 --- a/gmqcc.h +++ b/gmqcc.h @@ -146,7 +146,7 @@ struct lex_file { /* * It's important that this table never exceed 32 keywords, the ascii - * table starts at 33 (which we need) + * table starts at 33 (and we don't want conflicts) */ #define TOKEN_DO 0 #define TOKEN_ELSE 1 @@ -177,7 +177,6 @@ struct lex_file { int lex_token(struct lex_file *); void lex_reset(struct lex_file *); -int lex_debug(struct lex_file *); int lex_close(struct lex_file *); struct lex_file *lex_open (FILE *); diff --git a/lex.c b/lex.c index 9296158..6c381c9 100644 --- a/lex.c +++ b/lex.c @@ -164,11 +164,8 @@ static int lex_get(struct lex_file *file) { while (isspace(ch) && ch != '\n') ch = lex_getch(file); - if (ch == '\n') { - file->line ++; + if (ch == '\n') return ch; - } - lex_unget(ch, file); return ' '; } @@ -313,54 +310,3 @@ void lex_reset(struct lex_file *file) { memset(file->peek, 0, sizeof(file->peek )); memset(file->lastok, 0, sizeof(file->lastok)); } - -int lex_debug(struct lex_file *file) { - int list_do = 0; - int list_else = 0; - int list_if = 0; - int list_while = 0; - int list_break = 0; - int list_continue = 0; - int list_return = 0; - int list_goto = 0; - int list_for = 0; - int token = 0; - printf("===========================\nTOKENS: \n===========================\n"); - while ((token = lex_token(file)) != ERROR_LEX && file->length >= 0) { - if (token != -1) { - switch (token) { - case 0: list_do ++; break; - case 1: list_else ++; break; - case 2: list_if ++; break; - case 3: list_while ++; break; - case 4: list_break ++; break; - case 5: list_continue++; break; - case 6: list_return ++; break; - case 7: list_goto ++; break; - case 8: list_for ++; break; - } - } - if (token >= 33 && token <= 126) - putchar(token); - } - printf("\n===========================\nBRANCHES \n===========================\n"); - printf("\t if % 8d\n", list_if); - printf("\t else % 8d\n", list_else); - printf("===========================\nLOOPS \n===========================\n"); - printf("\t for % 8d\n", list_for); - printf("\t while % 8d\n", list_while); - printf("\t do % 8d\n", list_do); - printf("===========================\nSTATEMENTS \n===========================\n"); - printf("\t break % 8d\n", list_break); - printf("\t continue % 8d\n", list_continue); - printf("\t return % 8d\n", list_return); - printf("\t goto % 8d\n", list_goto); - printf("===========================\nIDENTIFIERS\n===========================\n"); - lex_reset(file); - while ((token = lex_token(file)) != ERROR_LEX && file->length >= 0) - if (token == LEX_IDENT) - printf("%s ", file->lastok); - fputc('\n', stdout); - lex_reset(file); - return 1; -} diff --git a/main.c b/main.c index bb5b83e..0699c18 100644 --- a/main.c +++ b/main.c @@ -25,6 +25,8 @@ #include #include "gmqcc.h" +//typedef int foo; + int usage(const char *name) { printf("Usage: %s -f infile -o outfile\n", name); return 0; @@ -65,7 +67,6 @@ int main(int argc, char **argv) { return error(ERROR_COMPILER, "Source file: %s not found\n", ifile); } else { struct lex_file *lex = lex_open(fp); - lex_debug(lex); parse (lex); lex_close(lex); } diff --git a/parse.c b/parse.c index 3cfa596..9c38111 100644 --- a/parse.c +++ b/parse.c @@ -59,17 +59,15 @@ #define PARSE_TYPE_MINUS 26 #define PARSE_TYPE_ADD 27 #define PARSE_TYPE_EQUAL 28 -#define PARSE_TYPE_LSS 29 // left subscript -#define PARSE_TYPE_RSS 30 -#define PARSE_TYPE_LBS 31 // left bracket scope -#define PARSE_TYPE_RBS 32 // right bracket scope -#define PARSE_TYPE_ELIP 33 // ... -#define PARSE_TYPE_DOT 34 -#define PARSE_TYPE_LT 35 -#define PARSE_TYPE_GT 36 -#define PARSE_TYPE_BAND 37 -#define PARSE_TYPE_BOR 38 -#define PARSE_TYPE_DONE 39 // finished statement +#define PARSE_TYPE_LBS 29 // left bracket scope +#define PARSE_TYPE_RBS 30 // right bracket scope +#define PARSE_TYPE_ELIP 31 // ... +#define PARSE_TYPE_DOT 32 +#define PARSE_TYPE_LT 33 +#define PARSE_TYPE_GT 34 +#define PARSE_TYPE_BAND 35 +#define PARSE_TYPE_BOR 36 +#define PARSE_TYPE_DONE 37 // finished statement /* * Adds a parse type to the parse tree, this is where all the hard @@ -114,6 +112,8 @@ void parse_debug(struct parsenode *tree) { case PARSE_TYPE_BREAK: STORE("STATEMENT: BREAK \n"); case PARSE_TYPE_CONTINUE: STORE("STATEMENT: CONTINUE\n"); case PARSE_TYPE_GOTO: STORE("STATEMENT: GOTO\n"); + case PARSE_TYPE_RETURN: STORE("STATEMENT: RETURN\n"); + case PARSE_TYPE_DONE: STORE("STATEMENT: DONE\n"); case PARSE_TYPE_ELIP: STORE("DECLTYPE: VALIST\n"); @@ -129,6 +129,8 @@ void parse_debug(struct parsenode *tree) { case PARSE_TYPE_LBS: STORE("BLOCK: BEG\n"); case PARSE_TYPE_RBS: STORE("BLOCK: END\n"); + case PARSE_TYPE_ELSE: STORE("BLOCK: ELSE\n"); + case PARSE_TYPE_IF: STORE("BLOCK: IF\n"); case PARSE_TYPE_LAND: STORE("LOGICAL: AND\n"); case PARSE_TYPE_LNOT: STORE("LOGICAL: NOT\n"); @@ -137,11 +139,11 @@ void parse_debug(struct parsenode *tree) { case PARSE_TYPE_LPARTH: STORE("PARTH: BEG\n"); case PARSE_TYPE_RPARTH: STORE("PARTH: END\n"); + case PARSE_TYPE_WHILE: STORE("LOOP: WHILE\n"); case PARSE_TYPE_FOR: STORE("LOOP: FOR\n"); case PARSE_TYPE_DO: STORE("LOOP: DO\n"); - case PARSE_TYPE_ELSE: STORE("BLOCK: ELSE\n"); - case PARSE_TYPE_IF: STORE("BLOCK: IF\n"); + } tree = tree->next; } @@ -210,9 +212,13 @@ int parse(struct lex_file *file) { case LEX_IDENT: token = lex_token(file); - printf("FOO: %s\n", file->lastok); break; - + + /* + * This is a quick and easy way to do typedefs at parse time + * all power is in typedef_add(), in typedef.c. We handle + * the tokens accordingly here. + */ case TOKEN_TYPEDEF: { char *f = NULL; char *t = NULL; @@ -223,7 +229,7 @@ int parse(struct lex_file *file) { typedef_add(f, t); - /* free new strings */ + /* free stdup strings */ mem_d(f); mem_d(t); break; @@ -247,7 +253,7 @@ int parse(struct lex_file *file) { * need to actual create tokens from these because they're already * tokenized as these individual tokens (which are in a special area * of the ascii table which doesn't conflict with our other tokens - * which are higer than the ascii table. + * which are higer than the ascii table.) */ case '&': /* & */ token = lex_token(file); diff --git a/typedef.c b/typedef.c index 5e72cf8..5f52903 100644 --- a/typedef.c +++ b/typedef.c @@ -185,5 +185,5 @@ int typedef_add(const char *from, const char *to) { return -100; } } - return error(ERROR_PARSE, "cannot typedef %s (not a type)\n", from); + return error(ERROR_PARSE, "cannot typedef `%s` (not a type)\n", from); }