📜  YACC程序检查给定的字符串是否是回文

📅  最后修改于: 2021-06-28 07:13:57             🧑  作者: Mango

问题:编写YACC程序以检查给定的字符串是否为回文。

解释:
Yacc(表示“另一个编译器”。)是Unix操作系统的标准解析器生成器。 yacc是一个开源程序,它使用C编程语言为解析器生成代码。首字母缩略词通常用小写字母表示,但有时被视为YACC或Yacc。

例子:

Input: naman
Output: palindrome

Input: geeksforgeeks
Output: not palindrome 

词法分析器源代码:

%{
    /* Definition section */
    #include 
    #include 
    #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; 
 }  

解析器源代码:

%{
    /* Definition section */
    #include 
    #include    
    #include 
    extern int yylex();
     
    void yyerror(char *msg);
    int flag;
     
    int i;
    int k =0;       
%}
  
%union {
    char* f;
 }
  
%token  STR
%type  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;
 }

输出: