Bison / Yacc中$ 1的`…'没有声明types

当我在我的c2p.y yacc文件上执行命令yacc -dv c2p.y时,错误$ 1的`…'在Bison / Yacc中没有声明types发生多次。

我知道的是,我必须添加一个%types的东西,并删除$ 1.string,但它仍然无法正常工作。

你能帮忙解决这个错误吗?

这是我的初始代码:

 %{
 #包括
 #包括
 int func;
 char * ch;
 int mainf = -1; 
 %}
 %开始编
 %令牌MAIN_
 %记号PRINTF_
 %令牌STRING_
 %令牌TYPE_ 
 %令牌ID_
 %令牌IF_ 
 %令牌COND_ 
 %标记ELSE_
 %令牌FOR_
 %令牌WHILE_
 %记号DO_
 %token UNTIL_
 %令牌ATRIB_
 %代币PLUSPLUS_

 %union {
     char * string;
 };

 %%

编:funcs
 ;

 funcs中:
 |  func funcs
 ;

 func:头块
 ;

 head:TYPE_ MAIN_'('args')'{mainf ++;}
 |  TYPE_ {if(!strcmp($ 1.string,“void”)){func = 0;  printf(“\ n \ nprocedure”);  }
         else {func = 1;  printf(“\ n \ nfunction”);}} 
       ID_'('{printf(“%s(”,$ 3.string);}
       args')'
       {printf的( “)”);  if(func == 1)transRetType($ 1.string);
       else printf(“;”);}
 ;

 ARGS: 
 |  TYPE_ ID_ {translateType($ 1.string,$ 2.string);}参数
 |  TYPE_ ID_','{translateType($ 1.string,$ 2.string); printf(“;”);} args
 ;

块:
 |  '{'{if(mainf == 0)
 {printf(“\ n \ nBEGIN”); mainf--;}
     else printf(“\ nbegin”);
     } 
         called_funcs 
         '}'{
         if(t_main == 0)printf(“\ nEND。”);  else printf(“\ nend;”);}
 |  '{'decvars {printf(“\ nbegin”);} called_funcs'}'{printf(“\ nend”); 
         if(t_main == 0)printf(“。”);  else printf(“;”);}
 ;

 decvars:{printf(“\ nvar”);} listdecl
 ;

 listdecl:decl |  listdecl decl
 ;

东方电气: 
 TYPE_ listvars';'  {transRetType($ 1.string);}
 ;

 listvars:ID_ {printf(“%s”,$ 1.string);} |  ID_','listvars {printf(“,%s”,$ 1.string);}
 ;

 called_funcs: 
 | 块
 |  called_func called_funcs
 ;

 called_func:printf
 | 如果
 |  func_apel
 | 对于
 | 而
 | 做
 |  atrib
 |  INC
 ;

 INC:
 ID_ PLUSPLUS_';'  {printf(“%s =%s + 1;”,$ 1,$ 1);}
 ;

 EXPR:
 ID_ {printf(“%s”,$ 1);}
 |  expr'+'{printf(“+”);} expr
 |  expr' - '{printf(“ - ”);} expr
 |  expr'*'{printf(“*”);} expr
 |  expr'/'{printf(“div”);} expr
 |  expr'%'{printf(“mod”);} expr
 |  ' - '{printf(“ - ”);} expr     
 |  '('{printf(“(”);} expr')'{printf(“)”);}
 ;

对于:
 FOR_ {printf(“\ nfor”);}
 '('ID_ {printf(“%s:=”,yylval.string);} 
     ATRIB_ ID_ {printf(“%s to”,yylval.string);} 
     ';'  ID_ COND_ ID_ {printf(“%s do”,yylval.string);} 
     ';'
      ID_
      '+' 
      ')' 
     called_funcs
 ;

而:
 WHILE_ {printf(“\ nwhile”);}
 '('ID_ {printf(“%s”,$ 3);} 
    条件_ 
         {
         if(!strcmp(yylval.string,“==”))printf(“=”); 
         else if(!strcmp(yylval.string,“!=”))printf(“”);
         else printf(“%s”,yylval.string);}
     ID_ 
         {printf(“%s do”,yylval.string);}  
 ')'called_funcs            
 ;

做:
 DO_ {printf(“\ nrepeat”);}
 called_funcs
 UNTIL_ {printf(“\ nuntil”);}
 '('ID_ {printf(“%s”,yylval.string);} 
    条件_ {
         if(!strcmp(yylval.string,“==”))printf(“=”); 
         else if(!strcmp(yylval.string,“!=”))printf(“”);
         else printf(“%s”,yylval.string);}
     ID_ 
         {printf(“%s;”,yylval.string);}  
 ')'';'
 ;

 atrib:
 ID_ {printf(“\ n%s:=”,$ 1);} ATRIB_ expr';'  {printf的( “;”);}
 |  ID_“++”{printf(“\ n%s =%s + 1”,$ 1,$ 1);}
 |  ID_' - '{printf(“\ n%s =%s  -  1”,$ 1,$ 1);}
 ;

如果:IF_'('ID_ {printf(“\ nif%s”,yylval.string);} COND_ 
         {if(!strcmp(yylval.string,“==”))printf(“=”);  else printf(“%s”,yylval.string);}
         ID_ {printf(“%s then”,yylval.string);}')'called_funcs else
 ;

其他:
 |  ELSE_ {printf(“\ nelse”);} called_funcs
 ;

 func_apel: 
 ID_'('{printf(“\ n%s(”,$ 1.string);} call_args')'';'{printf(“);”);}
 ;

 call_args:call_args','{printf(“,”);} call_arg 
 |  call_arg
 ;

 call_arg: 
 |  ID_ {printf(“%s”,yylval.string);}
 ;

 printf:PRINTF_'('STRING_ {output(yylval.string);}')'';'
 ;

 %%
 void transRetType(char * str){
     if(!strcmp(str,“int”))printf(“:integer;”);
    如果(!strcmp(str,“long”))printf(“:longint;”);
     if(!strcmp(str,“char”))printf(“:byte;”);
     if(!strcmp(str,“float”))printf(“:real;”);
 }
 void translateType(char * str1,char * str2){
     if(!strcmp(str1,“int”))printf(“%s:integer”,str2);
    如果(!strcmp(str1,“long”))printf(“%s:longint”,str2);
    如果(!strcmp(str1,“char”))printf(“%s:byte”,str2);
    如果(!strcmp(str1,“float”))printf(“%s:real”,str2);
 }
 void output(char * str){
     int i;
    的printf( “\ nwriteln(\”“);
     for(i = 1; i 

谢谢,Horatiu

您需要为具有语义值的标记声明添加一个类型,如下所示:

%token <string> TYPE_