Keď vykonám príkaz yacc -dv c2p.y na mojom súbore yacc c2p.y, chyba $ 1 "..." nemá deklarovaný typ v Bison / Yacc sa vyskytne niekoľkokrát.
Viem, že musím pridať niečo typu% a vymazať reťazec $ 1.string, ale stále to nefunguje.
Môžete mi pomôcť vyriešiť túto chybu?
Tu je môj počiatočný kód:
% { #include #include int func; char * ch; intmainf = -1; %} % začiatočný prog % token MAIN_ % tokenu PRINTF_ % token STRING_ % token TYPE_ % token ID_ % token IF_ % token COND_ % token ELSE_ % token FOR_ % token WHILE_ % token DO_ % token UNTIL_ % tokenu ATRIB_ % token PLUSPLUS_ % únie { char * reťazec; }; %% prog: func ; funkcie: | func funcs ; func: hlavový blok ; head: TYPE_ MAIN_ "(" args ")" {mainf ++;} | TYPE_ {if (! Strcmp ($ 1.string, "void")) {func = 0; printf ("nnprocedure"); } else {func = 1; printf ("nnfunction");}} ID_ "(" {printf ("% s (", $ 3.reťazec);} args ")" {printf (")"); if (func == 1) transRetType ($ 1.reťazec); else printf (";");} ; args: | TYPE_ ID_ {translateType ($ 1.string, $ 2.string);} args | TYPE_ ID_ "," {translateType ($ 1.string, $ 2.string); printf (";");} args ; blok: | "{" {if (mainf == 0) {printf ("nnBEGIN"); mainf--;} else printf ("nbegin"); } tzv_funky "}" { if (t_main == 0) printf ("nEND."); else printf ("nend;");} | "{" decvars {printf ("nbegin");} nazvané_funcs "}" {printf ("nend"); if (t_main == 0) printf ("."); else printf (";");} ; decvars: {printf ("nvar");} listdecl ; listdecl: decl | listdecl decl ; pokles: TYPE_ listvars ";" {transRetType ($ 1. reťazec);} ; listvars: ID_ {printf ("% s", $ 1.reťazec);} | ID_ "," listvars {printf (",% s", $ 1.reťazec);} ; called_funcs: | blokovať | called_func called_funcs ; called_func: printf | ak | func_apel | pre | zatiaľ čo | robiť | atrib | vč ; prírastok: 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 ("-");} výraz | "(" {printf ("(");} expr ")" {printf (")");} ; pre: FOR_ {printf ("nfor");} "(" ID_ {printf ("% s: =", yylval.string);} ATRIB_ ID_ {printf ("% s to", yylval.string);} „;“ ID_ COND_ ID_ {printf ("% s do", yylval.string);} „;“ ID_ „+“ „)“ tzv_funky ; zatiaľ čo: WHILE_ {printf ("zatiaľ");} "(" ID_ {printf ("% s", $ 3);} COND_ { if (! strcmp (yylval.string, "==")) printf ("="); else if (! strcmp (yylval.string, "! =")) printf (""); else printf ("% s", yylval.string);} ID_ {printf ("% s do", yylval.string);} „)“ nazvané_funky ; robiť: DO_ {printf ("nrepeat");} tzv_funky UNTIL_ {printf ("nuntil");} "(" ID_ {printf ("% s", yylval.string);} COND_ { 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: IF_ "(" ID_ {printf ("nif% s", yylval.string);} COND_ {if (! strcmp (yylval.string, "==")) printf ("="); else printf ("% s", yylval.string);} ID_ {printf ("% s potom", yylval.string);} ")" nazvané_funky else ; inak: | ELSE_ {printf ("nelse");} volal_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_ {výstup (yylval.string);} ")" ";" ; %% void transRetType (char * str) { if (! strcmp (str, "int")) printf (": integer;"); if (! 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); if (! strcmp (str1, "long")) printf ("% s: longint", str2); if (! strcmp (str1, "char")) printf ("% s: byte", str2); if (! strcmp (str1, "float")) printf ("% s: real", str2); } neplatný výstup (char * str) { int i; printf ("nwriteln (" ")); pre (i = 1; i
Ďakujem, Horatiu
odpovede:
3 pre odpoveď č. 1Do deklarácií tokenov musíte pridať typ so sémantickými hodnotami, napríklad takto:
%token <string> TYPE_