为什么它显示我的函数在返回char *时返回int?

时间:2013-10-27 06:43:28

标签: yacc lex

yacc代码:

    %{
            #include<stdio.h>
        #include<string.h>



    %}

    %union {
                    char* dval;

            }

    %token <dval> NUM VAR
    %type <dval> E P
    %left '+' '-'
    %left '*' '/'

    %%
    statement : P {printf("\nt = %s\n \n",$1);}
              ;
    P: E
       ;

    E : E '+' E {strcpy($$,gencode($1,"+",$3));}
      | E '-' E {strcpy($$,gencode($1,"-",$3));}
      | E '*' E {strcpy($$,gencode($1,"*",$3));}
      | E '/' E {strcpy($$,gencode($1,"/",$3));}
      | '(' E ')' {strcpy($$,$2);}
      | NUM {strcpy($$,$1);}
      | VAR {strcpy($$,$1);}
      ;
    %%

**The lex code:**


   %{
            #include<stdio.h>
        #include<stdlib.h>
        #include<string.h>
            #include"y.tab.h"
        int n=0;
        char *ch="t";


    %}
    %%
    [0-9]+ {strcpy(yylval.dval,yytext); return NUM;}
    [a-z]+ {strcpy(yylval.dval,yytext); return VAR;}
    \n {return 0;}
    . {return yytext[0];}
    %%
    void yyerror(char* str)
    {
            printf("\n%s",str);
    }

    char* gencode(char *first,char *op,char *second)
    {
        char  *t;
        char x[5];
        t=(char*) malloc(sizeof(char)*5);

        strcpy(t, ch);
        itoa(n, x);
        strcat(t, x);        
        printf("\n%s = %s %s %s\n",t,first,op,second);
        n++;
        t[strlen(t)]='\0';

        return t;
    }

    main()
    {
            yyparse();
            return 0;
    }

由于某种原因,gcc输出错误:警告:传递'strcpy'的参数2使得指针来自整数而没有强制转换[默认情况下启用]。 strcpy的第二个参数是函数gencode,它返回一个char *而不是一个整数。

2 个答案:

答案 0 :(得分:0)

您需要在yacc文件的开头声明gencode。否则,编译器将其视为未定义,并假定它返回int

答案 1 :(得分:0)

您需要在.y文件中声明gencode,在#include标题中或直接在.y文件中声明。

你有一个更大的问题,因为你将dval(大多数规则使用的类型)声明为char *,但是在用{{{{}}写入之前你永远不会将它初始化为任何内容。 1}},因此当strcpy尝试写入随机地址时,您的代码将崩溃(或更糟)。您可以通过使用strcpy替换lex文件中的strcpy次调用以及仅使用yylval.dval = strdup(yytext)分配的yacc文件中的调用来解决此问题(所以$$ ...或者无论)