#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//S → aSd | aAd   :. S → a(Sd | Ad) :. S → a(S | A)d
//A → bAc | bc    :. A → b(Ac | bc) :. A → b(A | b)c
//    |
//    v
//
//S → aS’
//S'→ Sd | Ad
//A → bA'
//A'→Ac|bc

char buffer[80], lookahead;
int i=0;

void erro();
void gets(char *, int);
void S();
void S_();
void A();
void A_();
void reconhecedor(char);

void reconhecedor(char t){
    if(lookahead==t)
        lookahead=buffer[i++];
    else erro();
}

void erro(){
    printf("\n Erro Sintático");
    exit(1);
}

void gets(char *s, int size){
    fgets(s, size, stdin);
    s[strlen(s)-1]='\0';
}

int main(){ //testar para a,a,a,a
    printf("\n Cadeia");
    gets(buffer, 80);
    lookahead = buffer[i++];
    S(); //S → aS'
    if (lookahead == '\0')
        printf("\nAnálise Sintática completa com sucesso");
    else
        printf("\nEra esperado fim da cadeia");

    getchar();
}

void S(){
    //S → aS' first(S)={a}
    if (lookahead='a'){
        reconhecedor('a');
        S_();
    }
    else erro();
}

void S_(){ //S'→ Sd | Ad  first(S_)={a,b}
    if (lookahead='a'){
        S();
        reconhecedor('d');
    }
    else if (lookahead=='b'){
            A();
            reconhecedor('d');  
         }
         else erro();
}

void A() { //A → bA' first(A)={b}
    if(lookahead=='b'){
        reconhecedor('b');
        A_();
    }
}

void A_() { //A'→Ac|bc  first(A_)={b,c}
    if(lookahead=='b'){
        A();
        reconhecedor('c');
    }
    else if (lookahead =='c'){
            reconhecedor('c');
         }
         else erro();  
}
