为什么即使字符串有效也会调用 yyerror()?

Why is yyerror() being called even when string is valid?

这是一个 yacc 程序,使用语法 a n b(注意:输入 n 值)识别所有以 b 结尾且前面带有 n a 的字符串。



%{
#include "y.tab.h"
%}
%%
a {return A;}
b {return B;}
\n {return 0;}
. {return yytext[0];}
%%

yacc 部分

YACC PART
%{
#include <stdio.h>
int aCount=0,n;
%}
%token A
%token B
%%
s : X  B {   if (aCount<n || aCount>n) 
        {
    YYFAIL();
}
 }
X : X T | T
T : A { aCount++;} 
  ;
%%

int main()
{   printf("Enter the value of n \n");
scanf("%d",&n);
    printf("Enter the string\n");
    yyparse();
    printf("Valid string\n");
}

int YYFAIL()
{
    printf("Invalid count of 'a'\n");
    exit(0);
}

int yyerror()
{
    printf("Invalid string\n");
    exit(0);
}

输出

invalid string 

即使对于 n 值为 2 的 aab 这样的有效字符串,它也会显示无效字符串。 对于我输入的每个字符串,都会调用 yyerror()。 请帮我解决这个问题! TIA

scanf("%d",&n);

从标准输入中读取一个数字。

不读取数字和后面的换行符。它只是读取一个数字。无论数字后面是什么,都将从 stdin.

读取的下一个操作中 returned

因此,当您尝试解析时,词法分析器读取的字符是您在数字后键入的换行符。该换行符导致词法分析器 return 0 到解析器,解析器将其解释为输入结束。但是语法不允许空输入,所以解析器报语法错误。

在我的系统上,解析器在让我有机会键入任何输入之前报告语法错误。它允许您键入输入行这一事实对我来说有点令人费解,但它可能与您在 运行 程序中使用的任何 IDE 有关。