/* ** Parser Recursivo-Descendente para a Gramática ** Frase --> INIC Lista FIM ** Lista --> Elem Cauda ** Cauda --> & ** Cauda --> "," Elem Cauda ** Elem --> pal ** | num */ #include /*-- Codigo dos Simbolos NT e T --*/ #define EOF 0 #define Frase 1 #define Lista 2 #define Cauda 3 #define Elem 4 #define INIC 5 #define FIM 6 #define Virg 7 #define pal 8 #define num 9 typedef int simbolo; /*-- Tratamento de Erros (versão simplista) --*/ void erro() { printf("ERRO Sintactico \n"); exit(1); } /*-- Analisador Léxico (le um simbolo e retorna o seu código --*/ simbolo daSimbolo() { simbolo prox; scanf("%d",&prox); return(prox); } /*-- Reconhecedor para todos os Terminais --*/ simbolo recT(simbolo esperado, simbolo lido) { simbolo novo; if (lido == esperado) { novo = daSimbolo(); } else { erro(); } return(novo); } /*-- Reconhecedores para cada um dos simbolos Não-Terminais --*/ simbolo recElem(simbolo prox) { if (prox == pal) { prox = recT(pal,prox); } else { if (prox == num) { prox = recT(num,prox); } else { erro(); } } return(prox); } simbolo recCauda(simbolo prox) { if (prox == FIM) { ; } else { if (prox == Virg) { prox = recT(Virg,prox); prox = recElem(prox); prox = recCauda(prox); } else { erro(); } } return(prox); } simbolo recLista(simbolo prox) { if ((prox == pal) || (prox == num)) { prox = recElem(prox); prox = recCauda(prox); } else { erro(); } return(prox); } simbolo recFrase(simbolo prox) { if (prox == INIC) { prox = recT(INIC,prox); prox = recLista(prox); prox = recT(FIM,prox); } else { erro(); } return(prox); } /* *** Exemplos de frases válidas que podem ser usadas para testar: ** 5 8 6 0 ** 5 9 6 0 ** 5 9 7 9 6 0 ** 5 8 7 9 7 9 7 8 6 0 */ int main() { simbolo novo; novo=daSimbolo(); recFrase(novo); printf("Frase Valida \n"); return(0); }