/* Programmer: Austin Guthals */ /* A recursive decent parser that checks static semantics */ /* The language is called "tiny" */ #include #include #include #include /* Some Constants */ #define DELIMETER 1 #define DELIMETER2 6 #define VARIABLE 2 #define NUMBER 3 #define REAL 4 #define INT 5 #define END "end" #define REAL1 "real" #define READ1 "Read" #define DEC "dec" #define WRITE1 "Write" #define INT1 "int" #define PROG "program" /* Some global variables */ int declaration = 0; int done = 0; int dec_counter = 0; int statement_counter = 0; int lexical_flag = 0; char tok_delim[80]; int actual_type; int type_list[150]; int type_var_counter = 0; char var_list[150][20]; // Max # of variables is 150 int tok_type; char token[80]; FILE * file_input; FILE * file_output; /* Some local subroutines */ static void get_token(void); static void isdelim(char c); static void isdelim2(char *c); static void isdec(char *temp); static void dec_part(void); static void list_var(void); static void type1(void); static void isvar(char *temp); static void isdec(char *temp); static void statmt_part(void); static void statement(void); static void input(void); static void output(void); static void assignment(void); static void expression(void); static void term(void); static void factor(void); static void name_digit(void); static void identifier(void); static void serror(char *temp); /* There is a function for just about every production rule in the tiny language */ static void serror(char *temp) { fputs(" Invalid Program ", file_output); fputs(temp, file_output); exit(0); // exit program when error found } static void prgrm(void) { char *c = "prgrm"; get_token(); if(!strncmp("program", token, 7)) { get_token(); if(!done) dec_part(); else serror(c); if(!done) statmt_part(); else serror(c); return; } else { serror(c); } if((!strncmp("end", token, 7)) && (getc(file_input) == EOF)) return; else serror(c); // end was expected } static void statmt_part(void) { char* c = "statmt_part"; statement(); if(!done) { while(token[0] == '!') { get_token(); if(!done) statement(); else serror(c); } } else serror(c); return; } static void statement(void) { // either Read Write or Assignment if(!strncmp(token, READ1, 7)) input(); else if(!strncmp(token, WRITE1, 7)) output(); else assignment(); return; } static void input(void) { char *c = "input"; get_token(); if(!done) { if(token[0] == '(') { get_token(); if(done) serror(c); list_var(); if(token[0] == ')') { get_token(); if(done) serror(c); } else serror(c); } else serror(c); } else serror(c); return; } static void output(void) { char* c = "output"; get_token(); if(done) serror(c); list_var(); return; } static void assignment(void) { char *c = "assignment"; int test1 = 0; int expected_type = 0; int x; int i; actual_type = 0; // printf(" assignment var = %s tok_type = %d\n", token, tok_type); if(tok_type == VARIABLE) { for(i=0; i