当我在我的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_