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

C++ 为什么即使字符串有效也要调用yyerror()?,c++,bison,flex-lexer,yacc,lex,C++,Bison,Flex Lexer,Yacc,Lex,这是一个yacc程序,它使用语法ANB(注意:输入n值)识别所有以b结尾的字符串,后跟n a 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

这是一个yacc程序,它使用语法ANB(注意:输入n值)识别所有以b结尾的字符串,后跟n a

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);
}
它显示无效字符串,即使对于有效字符串,如n值2的aab。 对于我输入的每个字符串,都会调用yyerror()。 请帮我解决这个问题! 短暂性脑缺血发作

从标准输入读取数字

它不读取数字和下面的换行符。它只是读一个数字。从
stdin
读取的下一个操作将返回数字后面的内容

因此,当您尝试解析时,lexer读取的字符就是您在数字后面键入的换行符。该换行符导致lexer将0返回给解析器,解析器将其解释为输入的结尾。但是语法不允许空输入,因此解析器报告语法错误

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

从标准输入读取数字

它不读取数字和下面的换行符。它只是读一个数字。从
stdin
读取的下一个操作将返回数字后面的内容

因此,当您尝试解析时,lexer读取的字符就是您在数字后面键入的换行符。该换行符导致lexer将0返回给解析器,解析器将其解释为输入的结尾。但是语法不允许空输入,因此解析器报告语法错误


在我的系统上,解析器在给我机会键入任何输入之前报告语法错误。它允许您键入输入行的事实让我有点困惑,但它可能与您运行程序所使用的IDE有关。

我也无法输入,但在输入一个数字并提供空间后,我就可以输入了。您建议我怎么做?@tanisha:通常的建议适用于。相反,使用
fgets()
读取整行,然后使用
strtol
从字符串中提取整数。(或者
sscanf
,但是
strtol
更简单更好。)我也无法输入,但在输入一个数字并留出空间后,我就可以输入了。你建议我怎么做?@tanisha:通常的建议是适用的。相反,使用
fgets()
读取整行,然后使用
strtol
从字符串中提取整数。(或
sscanf
,但
strtol
更简单更好。)
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 
scanf("%d",&n);