问题:编写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;
}
输出: