返回0在代码中做了什么,为什么没有正文写入yywrap函数?

时间:2013-04-16 13:34:34

标签: yacc lex

我正在使用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];
     }
%%

1 个答案:

答案 0 :(得分:1)

return 0通知解析器的输入结束,所以显然表达式应该包含在一行中。 yywrap空洞的身体是错的。如果您将-Wallgcc编译器一起使用,则会为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的无限循环中。