我正在使用BISON和FLEX。 对于我发布的kcalc.l文件,返回0的作用是什么? 而且我没有使用yywrap而没有身体(我的意思不是字面上而是空体)。代码是一个没有任何变量管理和基本操作的计算器,可以像加法减法乘法除法和处理一元减去运营商。我一直在研究lex和yacc的规范,但没有得到我问的查询的任何答案。
Kcal.y
%{
#include <stdio.h>
%}
%token Number
%left '-' '+'
%left '*' '/'
%nonassoc UMINUS
%%
statement: expression
{ printf(" result = %d\n", $1);} ;
expression: expression '+' expression
{ $$ = $1 + $3;
printf("Recognised'+'expression\n");
}
| expression '-' expression
{ $$ = $1 - $3;
printf("Recognised '-' expression\n");
}
| expression '*' expression
{ $$ = $1 * $3;
printf("Recognised '*' expression\n");
}
| expression '/' expression
{ if ($3 == 0)
printf ("divide by zero\n");
else
$$ = $1 / $3;
printf("Recognised '/' expression\n");
}
| '-' expression %prec UMINUS
{
$$ = - $2;
printf("Recognised paranthesized expression\n");
}
| '(' expression ')'
{
$$ = $2;
printf("Recognised paranthesized expression");
}
| Number { $$ = $1;
printf("Recognised a no.\n");
}
;
%%
int main(void)
{
return yyparse();
}
int yyerror (char *msg)
{
return fprintf(stderr,"Yacc :%s", msg);
}
yywrap()
{
}
kcalc.l
%{
#include "y.tab.h"
extern int yylval;
%}
%%
[0-9]+ { yylval = atoi(yytext);
printf("accepted the number : %d\n", yylval);
return Number; }
[ \t] { printf("skipped whitespace \n");}
\n { printf("reached end of line\n");
**return 0;**
}
. { printf("found other data \" %s\n", yytext);
return yytext[0];
}
%%
答案 0 :(得分:1)
return 0
通知解析器的输入结束,所以显然表达式应该包含在一行中。 yywrap
空洞的身体是错的。如果您将-Wall
与gcc
编译器一起使用,则会为yywrap
提供两个警告:
kcal.y:54: warning: return type defaults to ‘int’
kcal.y:55: warning: control reaches end of non-void function
第一个因为没有指定函数的结果类型(K&amp; R样式C),所以假设它应该返回int
。第二个警告,因为它没有return
这样的int
语句。
由于换行符终止输入,yywrap
被调用的可能性很小。但是如果输入不包含换行符,则会调用它。如果纯粹意外({或1}}的(或多或少随机)返回值被解释为yywrap
,则标记化器将最终处于重复调用0
的无限循环中。