код yacc и lex для трех операторов кода адреса - PullRequest
2 голосов
/ 20 марта 2011

вот мой лекс код: three.l

%{
#include "y.tab.h"
#include "string.h"
%}
%%
[a-zA-Z]+ { yylval.a_var=(char *)malloc(sizeof(char *));
         strcpy(yylval.a_var,yytext);
         return var;}
[-+/*,]   {return yytext[0];}

[\t\n] return 0;

%%

Мой YACC

three.y

%{

#include "stdio.h"

#include "string.h"

int yywrap()

{


return 1;
}

static int i;


int d;

char temp();

%}

%left '+' '-'

%left '*' '/'

%union{char *a_var;}

%token id

%token <a_var>var

%start line


%%
line:var '=' exp {printf("%c=t%c\n",$1,$3);}

;
exp:exp '+' exp   {$$=temp();if(i<=1){printf("t%c=%c+%c\n",$$,$1,$3);}  else{printf("t%c=t%c+%c\n",$$,$1,$3);} }

|exp '-' exp       {$$=temp();if(i<=1){printf("t%c=%c-%c\n",$$,$1,$3); } else{printf("t%c=t%c-%c\n",$$,$1,$3);} }

|exp '*' exp        {$$=temp();if(i<=1){printf("t%c=%c*%c\n",$$,$1,$3); } else{printf("t%c=t%c*%c\n",$$,$1,$3);} }

|exp '/' exp       {$$=temp();if(i<=1){printf("t%c=%c/%c\n",$$,$1,$3); } else {printf("t%c=t%c/%c\n",$$,$1,$3);} }

|var    {$$=$1;}

;

%%

main()

{

yyparse();

return 0;

}

int yyerror(char *s)

{



fprintf(stderr,"%s\n",s);

}

char temp()

{

return('1'+ i++);

}

но когда я скомпилирую это

three.y: 19.40-41: $ 3 строки не имеет объявленного типа

three.y: 21.20-21: $$ для exp не имеет объявленного типа

three.y: 21.60-61: $$ для exp не имеет объявленного типа

three.y: 21.63-64: $ 1 для exp не имеет объявленного типа

three.y: 21.66-67: $ 3 для exp не имеет объявленного типа

three.y: 21.100-101: $$ для exp не имеет объявленного типа

three.y: 21.103-104: $ 1 для exp не имеет объявленного типа

three.y: 21.106-107: $ 3 для exp не имеет объявленного типа

three.y: 22.21-22: $$ для exp не имеет объявленного типа

three.y: 22.61-62: $$ для exp не имеет объявленного типа

three.y: 22.64-65: $ 1 для exp не имеет объявленного типа

three.y: 22.67-68: $ 3 для exp не имеет объявленного типа

three.y: 22.104-105: $ 1 для exp не имеет объявленного типа

three.y: 22.107-108: $ 3 для exp не имеет объявленного типа

three.y: 23.22-23: $$ для exp не имеет объявленного типа

three.y: 23.62-63: $$ для `exp 'не имеет объявленного типа

three.y: 23.65-66: $ 1 для exp не имеет объявленного типа

three.y: 23.68-69: $ 3 для exp не имеет объявленного типа

three.y: 23.102-103: $$ для `exp 'не имеет объявленного типа

three.y: 23.105-106: $ 1 для exp не имеет объявленного типа

three.y: 23.108-109: $ 3 для exp не имеет объявленного типа

three.y: 24.21-22: $$ для exp не имеет объявленного типа

three.y: 24.61-62: $$ для exp не имеет объявленного типа

three.y: 24.64-65: $ 1 для exp не имеет объявленного типа

three.y: 24.67-68: $ 3 для exp не имеет объявленного типа

three.y: 24.102-103: $$ для `exp 'не имеет объявленного типа

three.y: 24.105-106: $ 1 для exp не имеет объявленного типа

three.y: 24.108-109: $ 3 для exp не имеет объявленного типа

three.y: 25.10-11: $$ для `exp 'не имеет объявленного типа

PL, помогите мне решить это ..

Ответы [ 3 ]

1 голос
/ 18 октября 2012

добавить строку

%type <a_var> exp

к вашему коду, вам нужно определить эксп.

0 голосов
/ 20 марта 2011

Насколько я вижу, типы семантических значений line и exp, похоже, не являются указано в вашем коде.
Итак, я думаю, что определение типов, как %type <a_var> line exp решит ошибка.
Надеюсь, это поможет

0 голосов
/ 20 марта 2011

Когда вы используете% union для своего yystype, тогда, когда вы ссылаетесь на yylval, вы должны указать, какого члена союза использовать.Так что с вашим союзом

%union{char *a_var;}

, когда вы говорите

line:var '=' exp {printf("%c=t%c\n",$1,$3);}

, вы должны сказать что-то вроде $ 1.a_var:

line:var '=' exp {printf("%c=t%c\n",$1.a_var,$3.a_var);}
...