/ / $ 1 z „…“ nemá deklarovaný typ v Bison / Yacc - linux, konštrukcia kompilátora, yacc, bison

$ 1 z `… 'nemá v Bison / Yacc žiaden deklarovaný typ - linux, kompilátor, yacc, bizón

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ď č. 1

Do deklarácií tokenov musíte pridať typ so sémantickými hodnotami, napríklad takto:

%token <string> TYPE_