Problema: Escreva um programa YACC para verificar se a string dada é Palíndromo ou não.

Explicação:
Yacc (para “mais um compilador compilador.”) É o gerador de analisador padrão para o sistema operacional Unix. Um programa de código aberto, o yacc gera código para o analisador na linguagem de programação C. O acrônimo é geralmente processado em minúsculas, mas às vezes é visto como YACC ou Yacc.

Exemplos:

Input: naman
Output: palindrome

Input: geeksforgeeks
Output: not palindrome 

Código-fonte do Lexical Analyzer:

%{
    /* Definition section */
    #include <stdio.h>
    #include <stdlib.h>
    #include "y.tab.h"
%}
  
/* %option noyywrap */
  
/* Rule Section */
%%
  
[a-zA-Z]+   {yylval.f = yytext; return STR;}
[-+()*/]    {return yytext[0];}
[ \t\n]      {;}
  
%%
  
 int yywrap()
 { 
  return -1; 
 }  

Código-fonte do analisador:

%{
    /* Definition section */
    #include <stdio.h>
    #include <string.h>   
    #include <stdlib.h>
    extern int yylex();
     
    void yyerror(char *msg);
    int flag;
     
    int i;
    int k =0;       
%}
  
%union {
    char* f;
 }
  
%token <f> STR
%type <f> E
  
/* Rule Section */
%%
  
S : E    {
         flag = 0;
         k = strlen($1) - 1;
         if(k%2==0){   
           
         for (i = 0; i <= k/2; i++) {
           if ($1[i] == $1[k-i]) {
            } else {
               flag = 1;
              }
          }
         if (flag == 1) printf("Not palindrome\n");
         else printf("palindrome\n");
         printf("%s\n", $1);
           
        }else{
          
        for (i = 0; i < k/2; i++) {
          if ($1[i] == $1[k-i]) {
          } else {
              flag = 1;
             }
            }
        if (flag == 1) printf("Not palindrome\n");
        else printf("palindrome\n");
        printf("%s\n", $1);           
         
  
          }
       }
  ;
  
E :  STR    {$$ = $1;}
  ;
  
%%
  
void yyerror(char *msg)
 {
    fprintf(stderr, "%s\n", msg);
    exit(1);
 }
  
//driver code 
int main()
 {
    yyparse();
    return 0;
 }

Saída: