/* * listas.c * Recursive descencent Parser for Abstract Grammars */ #include #include "tokens.h" extern int yylex(); static int prox_simb; int da_simbolo() { return yylex(); } rec_term(int simb) { if(prox_simb == simb) { prox_simb = da_simbolo(); } else{ fprintf(stderr, "ERROR: unexpexpected token = %d",prox_simb); exit(1); } } void error() { fprintf(stderr, "ERROR: Syntactic, near - %d", prox_simb); exit(2); } /* ---- Parser functions declaration ---- */ /* ------------------------------------------- */ /* ---- TOKENIZER - debug only ----- */ void tokenizer() { while(prox_simb) { printf("%d\n",prox_simb); prox_simb=da_simbolo(); } exit(0); } /* ------------------------------------------- */ /* ---- THE PARSER ----- */ main() { prox_simb = da_simbolo(); tokenizer(); } rec_Gabs() { rec_term(OGA); rec_BlockList(); rec_term(CGA); } rec_BlockList() { rec_Block(); rec_BList2(); } rec_BList2() { switch(prox_simb) { case CGA: break; case SEP: rec_term(SEP); rec_Block(); rec_BList2(); break; default: error(); } } rec_Block() { rec_term(SIMBN); rec_term(ODLIST); rec_DList(); } rec_DList() { rec_Deriv(); rec_DList2(); } rec_DList2() { switch(prox_simb) { case CGA: case SEP: break; case SEPDLIST: rec_term(SEPDLIST); rec_Deriv(); rec_DList2(); break; default: error(); } } rec_Deriv() { rec_term(ID); rec_term(ODER); rec_SimbList(); rec_term(CDER); } rec_SimbList() { switch(prox_simb) { case CDER: break; case SIMBN: case SIMBT: rec_Simb(); rec_SimbList(); break; default: error(); } } rec_Simb() { switch(prox_simb) { case SIMBN: rec_term(SIMBN); break; case SIMBT: rec_term(SIMBT); break; default: error(); } }