为什么即使字符串有效也会调用 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 有关。
这是一个 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
.
因此,当您尝试解析时,词法分析器读取的字符是您在数字后键入的换行符。该换行符导致词法分析器 return 0 到解析器,解析器将其解释为输入结束。但是语法不允许空输入,所以解析器报语法错误。
在我的系统上,解析器在让我有机会键入任何输入之前报告语法错误。它允许您键入输入行这一事实对我来说有点令人费解,但它可能与您在 运行 程序中使用的任何 IDE 有关。