/* The main driver program for the COMPILER project.                     */

/* 2-15-91 11:15 am dad - added PrntSymTbl() statement.                  */

#include <stdio.h>

#include "types.h"
#include "y.tab.h"

#define PRNT_SYM
#undef PRNT_SYM

extern FILE *yyin;
extern char yytext[];
extern int yylex();
void print_token();

main(argc, argv)
int argc;
char *argv[];
{
	int t;

	if (argc != 2) {
		fprintf(stderr,"usage: %s <filename>\n",argv[0]);
		exit();
	}

	yyin = fopen(argv[1],"r");
	if (yyin == NULL) {
		fprintf(stderr,"%s: could not open file %s\n",argv[0],argv[1]);
		exit();
	}
	t = yyparse();
#ifdef PRNT_SYM
        PrntSymTbl();
#endif
	fclose(yyin);
}

struct token_map_t {
	char *str;
	int val;
};

struct token_map_t token_map[] = {
	{"identifier",		IDENTIFIER		},
	{"string const",	STRING			},
	{"int const",		INTEGER_CONSTANT	},
	{"float const",		FLOATING_CONSTANT	},
	{"char const",		CHARACTER_CONSTANT	},
	{"enum const",		ENUMERATION_CONSTANT	},
	{"typedef name",	TYPEDEF_NAME		},
	{"plus",		PLUS			},
	{"minus",		MOINUS			},
	{"star",		ASTERISK		},
	{"and",			AMPERSAND		},
	{"question mark",	QUESTION		},
	{"colon",		COLON			},
	{"and-and",		AND_AND			},
	{"or-or",		OR_OR			},
	{"or",			OR			},
	{"xor",			CIRCONFLEX		},
	{"struct",		STRUCT			},
	{"return",		RETURN			},
	{"goto",		GOTO			},
	{"if",			IF			},
	{"else",		ELSE			},
	{"switch",		SWITCH			},
	{"break",		BREAK			},
	{"continue",		CONTINUE		},
	{"while",		WHILE			},
	{"do",			DO			},
	{"for",			FOR			},
	{"default",		DEFAULT			},
	{"case",		CASE			},
	{"sizeof",		SIZEOF			},
	{"left paren",		LEFT_PARENTH		},
	{"right paren",		RIGHT_PARENTH		},
	{"left brace",		LEFT_BANANA		},
	{"right brace",		RIGHT_BANANA		},
	{"left brack",		LEFT_BRACKET		},
	{"right brack",		RIGHT_BRACKET		},
	{"comma",		COMMA			},
	{"semicolon",		SEMICOLON		},
	{"enum",		ENUM			},
	{"neighbour",		NEIGHBOUR		},
	{"plural",		PLURAL			},
	{"receive",		RECEIVE			},
	{"send",		SEND			},
	{"shared",		SHARED			},
	{"vector",		VECTOR			},
	{"less than",		LESS			},
	{"greater than",	MORE			},
	{"slash",		SLASH			},
	{"percent",		PERCENT			},
	{"tilde",		TILDE			},
	{"exclamation mark",	EXCLAMATION		},
	{"dot",			POINT			},
	{"equal",		EQUAL			},
	{"xor-equal",		XOR_EQUAL		},
	{"right shift",		RIGHT_SHIFT		},
	{"mod-equal",		REMAINDER_EQUAL		},
	{"plus-plus",		PLUS_PLUS		},
	{"plus-equal",		PLUS_EQUAL		},
	{"or-equal",		OR_EQUAL		},
	{"not equal",		NOT_EQUAL		},
	{"times-equal",		MULTIPLY_EQUAL		},
	{"decrement",		MINUS_MINUS		},
	{"minus-equal",		MINUS_EQUAL		},
	{"less than/equal",	LESS_EQUAL		},
	{"left shift",		LEFT_SHIFT		},
	{"greater than/equal",	GREATER_EQUAL		},
	{"equal-equal",		EQUAL_EQUAL		},
	{"slash-equal",		DIVIDE_EQUAL		},
	{"arrow",		ARROW			},
	{"and-equal",		AND_EQUAL		},
	{"ellipsis",		ELLIPSIS		},
	{"rshift-equal",	RIGHT_SHIFT_EQUAL	},
	{"lshift-equal",	LEFT_SHIFT_EQUAL	},
	{"int",			INT			},
	{"void",		VOID			},
	{"long",		LONG			},
	{"char",		CHAR			},
	{"auto",		AUTO			},
	{"union",		C_UNION			},
	{"short",		SHORT			},
	{"float",		FLOAT			},
	{"const",		CONST			},
	{"static",		STATIC			},
	{"signed",		SIGNED			},
	{"extern",		EXTERN			},
	{"double",		DOUBLE			},
	{"typedef",		TYPEDEF			},
	{"volatile",		VOLATILE		},
	{"unsigned",		UNSIGNED		},
	{"register",		REGISTER		}
};

void print_token(token)
int token;
{
	int i;

	printf("%2d...",token);
	for (i = 0; i < sizeof(token_map)/sizeof(struct token_map_t); i++) {
		if (token_map[i].val == token) {
			printf("%-14s %s\n",token_map[i].str,yytext);
		}
	}
}

