This commit is contained in:
Dale Weiler 2012-04-09 20:39:54 -04:00
parent 0c824115cf
commit c3f08b289b
5 changed files with 28 additions and 76 deletions

View file

@ -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 *);

56
lex.c
View file

@ -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;
}

3
main.c
View file

@ -25,6 +25,8 @@
#include <limits.h>
#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);
}

40
parse.c
View file

@ -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);

View file

@ -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);
}