在字符串YACC的中间获取char

时间:2014-11-19 11:03:57

标签: c yacc lex

我想,我的问题有点简单。这是我的代码,

%{

#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;我的老师不会接受它。为它循环。

1 个答案:

答案 0 :(得分:1)

回文的语言不是LR(1),所以yacc不能为它生成解析器,而没有oracle可以让它知道字符串中间的位置。你的例子包括这样一个神谕;如果中间字母(或字母对)具有不同的值,则很容易做到。如果这是问题规范的一部分,那么你基本上就是在正确的轨道上。

如果您要求它生成bison解析器而不是GLR解析器,

LALR(1)可以解析回文。您说yacc而不是bison这一事实表明这不是一个合适的解决方案,并且它通常不是一个合适的解决方案,因为GLR解析器与这样的语法不是线性时间,而是存在明显的线性时间解析解决方案。

如果所有其他方法都失败了,您可以简单地将输入解析为字符列表,并检查它是否是最终缩减操作中的回文。