updated lex to return the right values to the tokens (mostly table entries)
This commit is contained in:
@ -47,28 +47,28 @@
|
|||||||
|
|
||||||
%union {
|
%union {
|
||||||
int integ;
|
int integ;
|
||||||
TableNode *tn;
|
|
||||||
char* words;
|
char* words;
|
||||||
|
TableNode* tn;
|
||||||
}
|
}
|
||||||
|
|
||||||
%type <integ> idlist
|
%type <integ> idlist
|
||||||
%type <tn> assignable
|
%type <tn> assignable
|
||||||
%type <tn> expression
|
%type <tn> expression
|
||||||
%type <t > constant
|
%type <tn> constant
|
||||||
%type <tn> id_or_types
|
%type <tn> id_or_types
|
||||||
%type <tn> types
|
%type <tn> types
|
||||||
%token <words> ID 101
|
%token <tn> ID 101
|
||||||
%token <words> T_INTEGER 201
|
%token <tn> T_INTEGER 201
|
||||||
%token <words> T_ADDRESS 202
|
%token <tn> T_ADDRESS 202
|
||||||
%token <words> T_BOOLEAN 203
|
%token <tn> T_BOOLEAN 203
|
||||||
%token <words> T_CHARACTER 204
|
%token <tn> T_CHARACTER 204
|
||||||
%token <words> T_STRING 205
|
%token <tn> T_STRING 205
|
||||||
%token <integ> C_INTEGER 301
|
%token <integ> C_INTEGER 301
|
||||||
%token <words> C_NULL 302
|
%token <tn> C_NULL 302
|
||||||
%token <words> C_CHARACTER 303
|
%token <tn> C_CHARACTER 303
|
||||||
%token <words> C_STRING 304
|
%token <tn> C_STRING 304
|
||||||
%token <words> C_TRUE 305
|
%token <tn> C_TRUE 305
|
||||||
%token <words> C_FALSE 306
|
%token <tn> C_FALSE 306
|
||||||
%token WHILE 401
|
%token WHILE 401
|
||||||
%token IF 402
|
%token IF 402
|
||||||
%token THEN 403
|
%token THEN 403
|
||||||
|
@ -13,6 +13,16 @@
|
|||||||
#endif
|
#endif
|
||||||
extern SymbolTable * cur;
|
extern SymbolTable * cur;
|
||||||
extern FILE* tok_flag;
|
extern FILE* tok_flag;
|
||||||
|
extern TableNode *funprime;
|
||||||
|
extern TableNode *funtypeprime;
|
||||||
|
extern TableNode *arrayprim;
|
||||||
|
extern TableNode *recprime;
|
||||||
|
extern TableNode *integ;
|
||||||
|
extern TableNode *addr;
|
||||||
|
extern TableNode *chara;
|
||||||
|
extern TableNode *stri;
|
||||||
|
extern TableNode *boo;
|
||||||
|
extern TableNode *undefined;
|
||||||
extern void incr(int lnum,int cnum, int tok);
|
extern void incr(int lnum,int cnum, int tok);
|
||||||
extern void print_tok(int tok);
|
extern void print_tok(int tok);
|
||||||
|
|
||||||
@ -36,10 +46,10 @@ SCHAR \\n|\\t|\\\"|[^\"\n\\]
|
|||||||
|
|
||||||
%%
|
%%
|
||||||
|
|
||||||
"integer" {if(DEBUG) {printf( "T_INTEGER: %s (%d)\n", yytext, T_INTEGER);} else {if(tok_flag != NULL){print_tok(T_INTEGER);}incr(line_number,column_number,T_INTEGER);yylval.words = strdup(yytext);return T_INTEGER;}}
|
"integer" {if(DEBUG) {printf( "T_INTEGER: %s (%d)\n", yytext, T_INTEGER);} else {if(tok_flag != NULL){print_tok(T_INTEGER);}incr(line_number,column_number,T_INTEGER);yylval.tn = integ;return T_INTEGER;}}
|
||||||
"address" {if(DEBUG) {printf( "T_ADDRESS: %s (%d)\n", yytext, T_ADDRESS);} else {if(tok_flag != NULL){print_tok(T_ADDRESS);}incr(line_number,column_number,T_ADDRESS);yylval.words = strdup(yytext);return T_ADDRESS;}}
|
"address" {if(DEBUG) {printf( "T_ADDRESS: %s (%d)\n", yytext, T_ADDRESS);} else {if(tok_flag != NULL){print_tok(T_ADDRESS);}incr(line_number,column_number,T_ADDRESS);yylval.tn = addr;return T_ADDRESS;}}
|
||||||
"Boolean" {if(DEBUG) {printf( "T_BOOLEAN: %s (%d)\n", yytext, T_BOOLEAN);} else {if(tok_flag != NULL){print_tok(T_INTEGER);}incr(line_number,column_number,T_INTEGER);yylval.words = strdup(yytext);return T_BOOLEAN;}}
|
"Boolean" {if(DEBUG) {printf( "T_BOOLEAN: %s (%d)\n", yytext, T_BOOLEAN);} else {if(tok_flag != NULL){print_tok(T_INTEGER);}incr(line_number,column_number,T_INTEGER);yylval.tn = boo;return T_BOOLEAN;}}
|
||||||
"character" {if(DEBUG) {printf( "T_CHARACTER: %s (%d)\n", yytext, T_CHARACTER);} else {if(tok_flag != NULL){print_tok(T_CHARACTER);}incr(line_number,column_number,T_CHARACTER);yylval.words = strdup(yytext);return T_CHARACTER;}}
|
"character" {if(DEBUG) {printf( "T_CHARACTER: %s (%d)\n", yytext, T_CHARACTER);} else {if(tok_flag != NULL){print_tok(T_CHARACTER);}incr(line_number,column_number,T_CHARACTER);yylval.tn = chara;return T_CHARACTER;}}
|
||||||
|
|
||||||
"while" {if(DEBUG) {printf( "WHILE: %s (%d)\n", yytext, WHILE);} else {if(tok_flag != NULL){print_tok(WHILE);}incr(line_number,column_number,WHILE);return WHILE;}}
|
"while" {if(DEBUG) {printf( "WHILE: %s (%d)\n", yytext, WHILE);} else {if(tok_flag != NULL){print_tok(WHILE);}incr(line_number,column_number,WHILE);return WHILE;}}
|
||||||
"if" {if(DEBUG) {printf( "IF: %s (%d)\n", yytext, IF);} else {if(tok_flag != NULL){print_tok(IF);}incr(line_number,column_number,IF);return IF;}}
|
"if" {if(DEBUG) {printf( "IF: %s (%d)\n", yytext, IF);} else {if(tok_flag != NULL){print_tok(IF);}incr(line_number,column_number,IF);return IF;}}
|
||||||
@ -73,8 +83,8 @@ SCHAR \\n|\\t|\\\"|[^\"\n\\]
|
|||||||
"->" {if(DEBUG) {printf( "ARROW: %s (%d)\n", yytext, ARROW);} else {if(tok_flag != NULL){print_tok(ARROW);}incr(line_number,column_number,ARROW);return ARROW;}}
|
"->" {if(DEBUG) {printf( "ARROW: %s (%d)\n", yytext, ARROW);} else {if(tok_flag != NULL){print_tok(ARROW);}incr(line_number,column_number,ARROW);return ARROW;}}
|
||||||
|
|
||||||
{DIGIT}+ {if(DEBUG) {printf( "C_INTEGER: %s (%d)\n", yytext, C_INTEGER);} else {if(tok_flag != NULL){print_tok(C_INTEGER);}incr(line_number,column_number,C_INTEGER);yylval.integ = atoi(yytext)/*words = strdup("integer")*/;return C_INTEGER;}}
|
{DIGIT}+ {if(DEBUG) {printf( "C_INTEGER: %s (%d)\n", yytext, C_INTEGER);} else {if(tok_flag != NULL){print_tok(C_INTEGER);}incr(line_number,column_number,C_INTEGER);yylval.integ = atoi(yytext)/*words = strdup("integer")*/;return C_INTEGER;}}
|
||||||
'{CHAR}' {if(DEBUG) {printf( "C_CHARACTER: %s (%d)\n", yytext, C_CHARACTER);} else {if(tok_flag != NULL){print_tok(C_CHARACTER);}incr(line_number,column_number,C_CHARACTER);yylval.words = strdup("character");return C_CHARACTER;}}
|
'{CHAR}' {if(DEBUG) {printf( "C_CHARACTER: %s (%d)\n", yytext, C_CHARACTER);} else {if(tok_flag != NULL){print_tok(C_CHARACTER);}incr(line_number,column_number,C_CHARACTER);yylval.tn = chara;return C_CHARACTER;}}
|
||||||
\"{SCHAR}*\" {if(DEBUG) {printf( "C_STRING: %s (%d)\n", yytext, C_STRING);} else {if(tok_flag != NULL){print_tok(C_STRING);}incr(line_number,column_number,C_STRING);yylval.words = strdup("string");return C_STRING;}}
|
\"{SCHAR}*\" {if(DEBUG) {printf( "C_STRING: %s (%d)\n", yytext, C_STRING);} else {if(tok_flag != NULL){print_tok(C_STRING);}incr(line_number,column_number,C_STRING);yylval.tn = stri;return C_STRING;}}
|
||||||
{COMMENT} {if(DEBUG) {printf( "COMMENT: %s (%d)\n", yytext, COMMENT);} else {if(tok_flag != NULL){print_tok(COMMENT);}incr(line_number,column_number,COMMENT);/*return COMMENT;*/}}
|
{COMMENT} {if(DEBUG) {printf( "COMMENT: %s (%d)\n", yytext, COMMENT);} else {if(tok_flag != NULL){print_tok(COMMENT);}incr(line_number,column_number,COMMENT);/*return COMMENT;*/}}
|
||||||
|
|
||||||
"(" {if(DEBUG) {printf( "L_PAREN: %s (%d)\n", yytext, L_PAREN);} else {if(tok_flag != NULL){print_tok(L_PAREN);}incr(line_number,column_number,L_PAREN);return L_PAREN;}}
|
"(" {if(DEBUG) {printf( "L_PAREN: %s (%d)\n", yytext, L_PAREN);} else {if(tok_flag != NULL){print_tok(L_PAREN);}incr(line_number,column_number,L_PAREN);return L_PAREN;}}
|
||||||
@ -84,9 +94,9 @@ SCHAR \\n|\\t|\\\"|[^\"\n\\]
|
|||||||
"{" {if(DEBUG) {printf( "L_BRACE: %s (%d)\n", yytext, L_BRACE);} else {if(tok_flag != NULL){print_tok(L_BRACE);}incr(line_number,column_number,L_BRACE);return L_BRACE;}}
|
"{" {if(DEBUG) {printf( "L_BRACE: %s (%d)\n", yytext, L_BRACE);} else {if(tok_flag != NULL){print_tok(L_BRACE);}incr(line_number,column_number,L_BRACE);return L_BRACE;}}
|
||||||
"}" {if(DEBUG) {printf( "R_BRACE: %s (%d)\n", yytext, R_BRACE);} else {if(tok_flag != NULL){print_tok(R_BRACE);}incr(line_number,column_number,R_BRACE);return R_BRACE;}}
|
"}" {if(DEBUG) {printf( "R_BRACE: %s (%d)\n", yytext, R_BRACE);} else {if(tok_flag != NULL){print_tok(R_BRACE);}incr(line_number,column_number,R_BRACE);return R_BRACE;}}
|
||||||
|
|
||||||
"true" {if(DEBUG) {printf( "C_TRUE: %s (%d)\n", yytext, C_TRUE);} else {if(tok_flag != NULL){print_tok(C_TRUE);}incr(line_number,column_number,C_TRUE);yylval.words = strdup("Boolean");return C_TRUE;}}
|
"true" {if(DEBUG) {printf( "C_TRUE: %s (%d)\n", yytext, C_TRUE);} else {if(tok_flag != NULL){print_tok(C_TRUE);}incr(line_number,column_number,C_TRUE);yylval.tn = boo;return C_TRUE;}}
|
||||||
"false" {if(DEBUG) {printf( "C_FALSE: %s (%d)\n", yytext, C_FALSE);} else {if(tok_flag != NULL){print_tok(C_FALSE);}incr(line_number,column_number,C_FALSE);yylval.words = strdup("Boolean");return C_FALSE;}}
|
"false" {if(DEBUG) {printf( "C_FALSE: %s (%d)\n", yytext, C_FALSE);} else {if(tok_flag != NULL){print_tok(C_FALSE);}incr(line_number,column_number,C_FALSE);yylval.tn = boo;return C_FALSE;}}
|
||||||
"null" {if(DEBUG) {printf( "C_NULL: %s (%d)\n", yytext, C_NULL);} else {if(tok_flag != NULL){print_tok(C_NULL);}incr(line_number,column_number,C_NULL);yylval.words = strdup("address");return C_NULL;}}
|
"null" {if(DEBUG) {printf( "C_NULL: %s (%d)\n", yytext, C_NULL);} else {if(tok_flag != NULL){print_tok(C_NULL);}incr(line_number,column_number,C_NULL);yylval.tn = addr;return C_NULL;}}
|
||||||
|
|
||||||
{ID} {if(DEBUG) {printf( "ID: %s (%d)\n", yytext, ID);} else {if(tok_flag != NULL){print_tok(ID);}incr(line_number,column_number,ID);yylval.words = strdup(yytext); return ID;}}
|
{ID} {if(DEBUG) {printf( "ID: %s (%d)\n", yytext, ID);} else {if(tok_flag != NULL){print_tok(ID);}incr(line_number,column_number,ID);yylval.words = strdup(yytext); return ID;}}
|
||||||
|
|
||||||
|
@ -769,6 +769,26 @@ TableNode *CreateEntry(SymbolTable *table, TableNode *typeOf, char *id,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TableNode *getTypeEntry(TableNode *tn) {
|
||||||
|
if (tn == NULL) {
|
||||||
|
printdebug("passed a NULL table entry to getType");
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
if (tn == undefined) {
|
||||||
|
printdebug("passed an undefined table entry to getType");
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
if (tn->theType == NULL) {
|
||||||
|
printdebug("type of entry is currently NULL type");
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
if (tn->theType == undefined) {
|
||||||
|
printdebug("type of entry is currently undefined type");
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
return tn->theType;
|
||||||
|
}
|
||||||
|
|
||||||
char *getType(TableNode *tn) {
|
char *getType(TableNode *tn) {
|
||||||
if (tn == NULL) {
|
if (tn == NULL) {
|
||||||
printdebug("passed a NULL table entry to getType");
|
printdebug("passed a NULL table entry to getType");
|
||||||
|
Reference in New Issue
Block a user