#include #include #include "grammar.h" // forward declarations void program(void); void stmt_list(void); void stmt(void); void expr(void); void term_tail(void); void term(void); void factor_tail(void); void factor(void); void add_op(void); void mult_op(void); void match(int x); void epsilon(void); void fail(void) __attribute__ ((noreturn)) ; void get_nexttoken(); extern int nextToken; void program() { stmt_list(); match(0); } void stmt_list() { if(nextToken == ID || nextToken == READ || nextToken == WRITE) { stmt(); stmt_list(); } else { epsilon(); } } void stmt() { if(nextToken == ID) { match(ID); match(ASSIGN); expr(); } else if(nextToken == READ) { match(READ); match(ID); } else if(nextToken == WRITE) { match(WRITE); expr(); } else { fail(); } } void expr() { term(); term_tail(); } void term_tail() { if(nextToken == PLUS || nextToken == MINUS) { add_op(); term(); term_tail(); } else { epsilon(); } } void term() { factor(); factor_tail(); } void factor_tail() { if(nextToken == DIVIDE || nextToken == MULTIPLY) { mult_op(); factor(); factor_tail(); } else { epsilon(); } } void factor() { if(nextToken == LPAREN) { match(LPAREN); expr(); match(RPAREN); } else if(nextToken == ID) { match(ID); } else if(nextToken == NUMBER) { match(NUMBER); } else { fail(); } } void add_op() { if(nextToken == PLUS) { match(PLUS); } else if(nextToken == MINUS) { match(MINUS); } else { fail(); } } void mult_op() { if(nextToken == MULTIPLY) { match(MULTIPLY); } else if(nextToken == DIVIDE) { match(DIVIDE); } else { fail(); } } void epsilon() { } void match(int x) { if(nextToken == x) { get_nexttoken(); } else { fail(); } } void fail() { fprintf(stderr,"Parsing failed!\n"); exit(99); }