我想,我的问题有点简单。这是我的代码,
%{
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
int yylex(void);
void yyerror(char const *c);
int yywarp(){
return 1;
}
%}
%token LETTER MID
%%
input: {printf("Enter the polindrom:\n");}
| input line;
line: anal '\n' {printf("good\n\n");}
| error '\n' {yyerrok;}
;
anal: MID MID {
printf("%d %d\n", $1, $2);
if($1!=$2)
YYERROR;
}
|LETTER anal LETTER {
printf("%d %d\n", $1, $3);
if($1!=$3)
YYERROR;
}
;
%%
int yylex(void)
{
int c;
char a[10];
c = getchar();
if(c == 'a'){
yylval = c;
return MID;
}
if(isalpha(c)){
yylval = c;
return LETTER;
}
if(c == EOF)
return 0;
return c;
}
void yyerror(char const *c)
{
fprintf(stderr, "%s\n", c);
}
int main(){
return(yyparse());
}
如您所见,MID仅在您输入&#39;时返回。我的问题是:如何获得真正的中间元素?任务是使用YACC识别回文。但我认为如果我只是使用&#34;我的老师不会接受它。为它循环。
答案 0 :(得分:1)
回文的语言不是LR(1),所以yacc
不能为它生成解析器,而没有oracle可以让它知道字符串中间的位置。你的例子包括这样一个神谕;如果中间字母(或字母对)具有不同的值,则很容易做到。如果这是问题规范的一部分,那么你基本上就是在正确的轨道上。
bison
解析器而不是GLR
解析器, LALR(1)
可以解析回文。您说yacc
而不是bison
这一事实表明这不是一个合适的解决方案,并且它通常不是一个合适的解决方案,因为GLR解析器与这样的语法不是线性时间,而是存在明显的线性时间解析解决方案。
如果所有其他方法都失败了,您可以简单地将输入解析为字符列表,并检查它是否是最终缩减操作中的回文。