0

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* 而不是整数。

4

2 回答 2

0

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

于 2013-10-28T01:33:39.290 回答
0

您需要gencode在 .y 文件中声明,无论是在头文件中#include还是直接在 .y 文件中。

您有一个更大的问题,因为您将dval(用于大多数规则的类型)声明为 a char *,但是在使用 写入之前您从未将其初始化为任何内容strcpy,因此当 strcpy 尝试写入时您的代码将崩溃(或更糟)到随机地址。您可以通过将strcpylex 文件中的调用替换为yylval.dval = strdup(yytext)并将 yacc 文件中的调用替换为仅分配给$$(so $$ = gencode(... 或其他)来解决此问题

于 2013-10-28T02:04:21.673 回答