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