ошибка типа для правила в yacc - PullRequest
1 голос
/ 01 апреля 2012

Я написал следующий код как часть моего файла yacc.

 %{
 #include <stdio.h>
 #include <stdlib.h>
 #include <math.h>
  FILE *fp;
  %}

  %token  LINE CIRCLE POLYGON
  %token CENTRE RADIUS WITHIN
  %token    END 

  %union
  {
  char *string;
  int number;
  }

 %token <number> NUM
 %token <string> CORDINATE 
 %start  Input
 %%

  Input:

         | Input Statement
         ;

 Statement :
         END     
         | LINE CORDINATE CORDINATE END {fprintf(fp,"\n\\newline\n\\psline%s%s\n",$2,$3,$2,$3);}
         | SCirc END
         | POLYGON Mcords         {fprintf(fp,"\n\\newline\n\\pspolygon%s",$2);}
         ;

 SCirc  :
          CIRCLE RADIUS NUM CENTRE CORDINATE {fprintf(fp,"\n\\newline\n\\pscircle%s{%d}\n",3*$3,3*$3,$5,$3);}
         | CIRCLE CENTRE CORDINATE RADIUS NUM   {fprintf(fp,"\n\\newline\n\\pscircle%s{%d}\n",-2*$5,-2*$5,2*$5,2*$5,$3,$5);}
;
Mcord   :
          CORDINATE CORDINATE CORDINATE {$$ = strcat(strcat($1,$2),$3);}
         | Mcord CODINATE       {$$ = strcat($1,$2); }
        ; 

%%

int yyerror(char *s) {
      printf("%s\n",s);
  }

int main(void) {

/* some stuff */
yyparse();
fprintf(fp,"\\end{pspicture}\n\\end{document}");
fclose(fp);
}

и я получаю сообщение об ошибке как


parser.y: 41.42-43: $$ для `Mcord 'не имеет объявленного типа


Я имею в виду, что следующий пример работает правильно, где $$ заканчивается числом

             Expression :
                          Number    {$$ = $1;}
                        | Expression '+' Expression  {$$ = $1+$2;}

Я хочу, чтобы Макорд был как объединение многих CORDINATE. Как я могу это сделать? Есть ли способ определения типа для правил тоже?

1 Ответ

3 голосов
/ 01 апреля 2012

Да, нетерминальные символы должны иметь тип, использующий %type <...> вместо %token <...>.У вас нет хорошего справочного руководства для Yacc?Руководство по GNU Bison довольно хорошее, даже если вы используете какой-то другой Yacc.

...