int n;

%}

 

%%

 

ARQUIVO : R_SAIDA R_DELTA_T R_DELTA_B R_N_PASSOS R_PULA R_TEMPO_ANIMACAO R_GRID R_ACELERACAO R_VEL_INICIAL R_PESO R_ETA R_QSI  R_MASSA R_GAMA  R_CTE_FLUIDO R_TIPO_OBJ_COLISAO R_TIPO_OBJ_DEFORMAVEL R_FRONTEIRA R_N_RESTRICOES R_RESTRICOES ;

 

R_SAIDA : SAIDA IGUAL TIPO_FORMATO_SAIDA ;

TIPO_FORMATO_SAIDA : NONE {formato=-1;} | BRP { formato=1; } | SHD { formato=2; } | OFF { formato=0; } | POV { formato=3; };

 

R_DELTA_T : DELTA_T IGUAL REAL { delta_t=real; } ;

 

R_DELTA_B : DELTA_B IGUAL REAL { delta_B=real; } ;

 

R_N_PASSOS : N_PASSOS IGUAL INTEIRO { n_passos=inteiro; } ;

 

R_PULA : PULA IGUAL INTEIRO { pula=inteiro; } ;

 

R_TEMPO_ANIMACAO : TEMPO_ANIMACAO IGUAL REAL {tempo_animacao=real;};

 

R_GRID : GRID DOIS_PONTOS INTEIRO { na[0]=inteiro; } INTEIRO { na[1]=inteiro; };

 

R_ACELERACAO : ACELERACAO DOIS_PONTOS X IGUAL REAL { acel[0]=real; }

                                      Y IGUAL REAL { acel[1]=real; }

                                      Z IGUAL REAL { acel[2]=real; };

 

R_VEL_INICIAL : VELOCIDADE DOIS_PONTOS X IGUAL REAL { vel[0]=real; }

                                       Y IGUAL REAL { vel[1]=real; }

                                       Z IGUAL REAL { vel[2]=real; };

 

R_PESO : PESO DOIS_PONTOS P1 IGUAL REAL { p[0]=real; }

                          P2 IGUAL REAL { p[1]=real; }

                          P3 IGUAL REAL { p[2]=real; };

 

R_ETA  : ETA  DOIS_PONTOS REAL { eta[0][0]=real; }

                          REAL { eta[0][1]=real; }

                          REAL { eta[1][0]=real; }

                          REAL { eta[1][1]=real; } ;

 

R_QSI  : QSI  DOIS_PONTOS REAL { qsi[0][0]=real; }

                          REAL { qsi[0][1]=real; }

                          REAL { qsi[1][0]=real; }

                          REAL { qsi[1][1]=real; } ;

 

R_MASSA : MASSA IGUAL REAL { mi=real; } ;

 

R_GAMA : GAMA IGUAL REAL { gama=real; } ;

 

R_CTE_FLUIDO : CTE_FORCA_FLUIDO IGUAL REAL { c_fluido = real; }

               | ;

 

R_TIPO_OBJ_COLISAO : OBJ_COLISAO DOIS_PONTOS R_OBJ_COLISAO | { obj_col=-1; };

R_OBJ_COLISAO :    PLANO    { obj_col=plano; } REAL { col_comp_x_plano=real; } REAL {col_comp_y_plano=real; } REAL {col_comp_z_plano=real; }

                 | ESFERA   { obj_col=esfera; } REAL { col_raio_esfera=real; }

                 | TORUS    { obj_col=torus; } REAL { col_raio_torus=real; } REAL { col_RAIO_torus=real; }

                 | CILINDRO { obj_col=cilindro; } REAL { col_raio_cilindro=real; } REAL { col_comp_cilindro=real; }

                 | CONE     { obj_col=cone; } REAL { col_raio_cone=real; } REAL { col_RAIO_cone=real; } REAL { col_alt_cone=real; }

          | SUP_CILINDRICA { obj_col=sup_cilindrica; } SENO { sup_cilindrica_tipo_col=seno; } REAL {col_valor_u_min=real;} REAL {col_valor_u_max=real;} REAL {col_valor_v_min=real;} REAL {col_valor_v_max=real;} REAL {col_compx_W=real;} REAL {col_compy_W=real;} REAL {col_compz_W=real;}

          | SUP_CILINDRICA { obj_col=sup_cilindrica; } PARABOLA { sup_cilindrica_tipo_col=parabola; } REAL {col_valor_u_min=real;} REAL {col_valor_u_max=real;} REAL {col_valor_v_min=real;} REAL {col_valor_v_max=real;} REAL {col_compx_W=real;} REAL {col_compy_W=real;} REAL {col_compz_W=real;}

          | SUP_REGRADA   { obj_col=sup_regrada; } SELA { sup_regrada_tipo_col=sela; } REAL {col_valor_u_min_reg=real;} REAL {col_valor_u_max_reg=real;} REAL {col_valor_v_min_reg=real;} REAL {col_valor_v_max_reg=real;} REAL {col_valor_k=real;} REAL {col_compy_W=real;} 

          | SUP_REGRADA   { obj_col=sup_regrada; } HELICOIDE { sup_regrada_tipo_col=helicoide; } REAL {col_valor_u_min_reg=real;} REAL {col_valor_u_max_reg=real;} REAL {col_valor_v_min_reg=real;} REAL {col_valor_v_max_reg=real;} REAL {col_valor_k=real;} REAL {col_compy_W=real;}

          | PROJ_ESTEREOGRAFICA {obj_col=proj_estereografica;} CIRCULAR {col_tipo_dominio=circular;} REAL {col_raio_esfera_proj=real;} REAL {col_raio_circulo_proj=real;} REAL {col_t_min=real;} REAL {col_t_max=real;}

          | PROJ_ESTEREOGRAFICA {obj_col=proj_estereografica;} RETANGULAR {col_tipo_dominio=retangular;} REAL {col_raio_esfera_proj=real;} REAL {col_raio_circulo_proj=real;} REAL {col_t_min=real;} REAL {col_t_max=real;}

          | SUP_ENNEPER {obj_col=sup_enneper;} REAL {col_u_min_enneper=real;} REAL {col_u_max_enneper=real;} REAL {col_v_min_enneper=real;} REAL {col_v_max_enneper=real;}

          | SUP_REVOLUCAO {obj_col=sup_revolucao;} C_SHERLOCK {sup_revolucao_tipo_col=c_sherlock;} REAL {col_u_revolucao=real;} REAL {col_v_min_revolucao=real;} REAL {col_v_max_revolucao=real;}

          | SUP_REVOLUCAO {obj_col=sup_revolucao;} CATENOIDE {sup_revolucao_tipo_col=catenoide;} REAL {col_u_revolucao=real;} REAL {col_v_min_revolucao=real;} REAL {col_v_max_revolucao=real;}

          | SUP_REVOLUCAO {obj_col=sup_revolucao;} PSEUDO_ESFERA {sup_revolucao_tipo_col=pseudo_esfera;} REAL {col_u_revolucao=real;} REAL {col_v_min_revolucao=real;} REAL {col_v_max_revolucao=real;}; 

 

R_TIPO_OBJ_DEFORMAVEL : OBJ_DEFORMAVEL DOIS_PONTOS R_OBJ_DEFORMAVEL ;

R_OBJ_DEFORMAVEL : PLANO    { objeto=plano; } REAL { comp_x_plano=real; } REAL {comp_y_plano=real; } REAL {comp_z_plano=real; }

                 | ESFERA   { objeto=esfera; } REAL {raio_esfera=real; }

                 | TORUS    { objeto=torus; } REAL {raio_torus=real; } REAL { RAIO_torus=real; }

                 | CILINDRO { objeto=cilindro; } REAL { raio_cilindro=real; } REAL { comp_cilindro=real; }

                 | CONE { objeto=cone; } REAL { raio_cone=real; }  REAL { RAIO_cone=real; } REAL { alt_cone=real; }

          | SUP_CILINDRICA { objeto=sup_cilindrica; } SENO { sup_cilindrica_tipo=seno; } REAL {valor_u_min=real;} REAL {valor_u_max=real;} REAL {valor_v_min=real;} REAL {valor_v_max=real;} REAL {compx_W=real;} REAL {compy_W=real;} REAL {compz_W=real;}

          | SUP_CILINDRICA { objeto=sup_cilindrica; } PARABOLA { sup_cilindrica_tipo=parabola; } REAL {valor_u_min=real;} REAL {valor_u_max=real;} REAL {valor_v_min=real;} REAL {valor_v_max=real;} REAL {compx_W=real;} REAL {compy_W=real;} REAL {compz_W=real;}

          | SUP_REGRADA { objeto=sup_regrada; } SELA { sup_regrada_tipo=sela; } REAL {valor_u_min_reg=real;} REAL {valor_u_max_reg=real;} REAL {valor_v_min_reg=real;} REAL {valor_v_max_reg=real;} REAL {valor_k=real;}

          | SUP_REGRADA   { objeto=sup_regrada; } HELICOIDE { sup_regrada_tipo=helicoide; } REAL {valor_u_min_reg=real;} REAL {valor_u_max_reg=real;} REAL {valor_v_min_reg=real;} REAL {valor_v_max_reg=real;} REAL {valor_k=real;}

          | PROJ_ESTEREOGRAFICA {objeto=proj_estereografica;} CIRCULAR {tipo_dominio=circular;} REAL {raio_esfera_proj=real;} REAL {raio_circulo_proj=real;} REAL {t_min=real;} REAL {t_max=real;}

          | PROJ_ESTEREOGRAFICA {objeto=proj_estereografica;} RETANGULAR {tipo_dominio=retangular;} REAL {raio_esfera_proj=real;} REAL {raio_circulo_proj=real;} REAL {t_min=real;} REAL {t_max=real;}

          | SUP_ENNEPER {objeto=sup_enneper;} REAL {u_min_enneper=real;} REAL {u_max_enneper=real;} REAL {v_min_enneper=real;} REAL {v_max_enneper=real;}

          | SUP_REVOLUCAO {objeto=sup_revolucao;} C_SHERLOCK {sup_revolucao_tipo=c_sherlock;} REAL {u_revolucao=real;} REAL {v_min_revolucao=real;} REAL {v_max_revolucao=real;}

          | SUP_REVOLUCAO {objeto=sup_revolucao;} CATENOIDE {sup_revolucao_tipo=catenoide;} REAL {u_revolucao=real;} REAL {v_min_revolucao=real;} REAL {v_max_revolucao=real;}

          | SUP_REVOLUCAO {objeto=sup_revolucao;} PSEUDO_ESFERA {sup_revolucao_tipo=pseudo_esfera;} REAL {u_revolucao=real;} REAL {v_min_revolucao=real;} REAL {v_max_revolucao=real;};

 

R_FRONTEIRA :  FRONTEIRA DOIS_PONTOS REAL { k[0]=real; } REAL { k[1]=real; } REAL { k[2]=real; }

                                     REAL { k[3]=real; } REAL { k[4]=real; } REAL { k[5]=real; }

                                     REAL { k[6]=real; } REAL { k[7]=real; } REAL { k[8]=real; }

                                     REAL { k[9]=real; } REAL { k[10]=real; } REAL { k[11]=real; };

 

R_N_RESTRICOES : N_RESTRICOES IGUAL INTEIRO { n_restricoes=inteiro; } ;

 

R_RESTRICOES : RESTRICOES  { if(n_restricoes==0) yyerror(); } IGUAL ABRE_CHAVES { n=0; restr=(STR_REST *)malloc(sizeof(STR_REST)*n_restricoes);  } R_ITEM_PONTO

             | ;

 

R_ITEM_PONTO : INTEIRO { restr[n].coord[0]=inteiro; } INTEIRO { restr[n].coord[1]=inteiro; } R_PFIXO_MOLA_FORCA R_ITEM_PONTO

               | FECHA_CHAVES;

 

R_PFIXO_MOLA_FORCA : PONTO_FIXO { if(n>=n_restricoes){ yyerror();}else {restr[n].tipo=1; n++;} } | MOLA { restr[n].tipo=2; } CTE IGUAL REAL { restr[n].cte=real; } X IGUAL REAL { restr[n].pe[0]=real; } Y IGUAL REAL { restr[n].pe[1]=real; } Z IGUAL REAL {if(n>=n_restricoes){ yyerror();}else { restr[n].pe[2]=real; n++;} } | FORCA { restr[n].tipo=3; } X IGUAL REAL { restr[n].pe[0]=real; } Y IGUAL REAL { restr[n].pe[1]=real; } Z IGUAL REAL {if(n>=n_restricoes){ yyerror();}else { restr[n].pe[2]=real; n++;} } ;

 

 

%%

 

 

yyerror(){

  printf("erro na linha %d: %s\n",linha,yytext);

  exit(1);

}

 

carrega_parametros(nome)

char * nome;

{

  int fd,ropen;

 

  printf("Arquivo de parametros = %s\n",nome);

 

  fd=dup(0);

  close(0);

 

  ropen = open(nome,O_RDONLY);

 

  if(ropen>=0) yyparse();

 

  close(0);

  dup(fd);

  close(fd);

 

  if(ropen<0)

  {

      printf("Impossivel abrir arquivo de parametros!\n");

      exit(1);

  }

  else

  {

      printf("formato  = %d\n",formato);

      printf("delta_t  = %f\n",delta_t);

      printf("delta_B  = %f\n",delta_B);

      printf("n-passos = %d\n",n_passos);

      printf("pula = %d\n",pula);

      printf("tempo_animacao = %f\n",tempo_animacao);          

      printf("grid     = %d x %d \n",na[0],na[1]);

      printf("aceleracao = %f %f %f \n",acel[0],acel[1],acel[2]);

      printf("velocidade = %f %f %f \n",vel[0],vel[1],vel[2]);

      printf("peso = %f %f %f \n",p[0],p[1],p[2]);

 

      printf("eta      = %f %f %f %f %f\n",eta[0][0],eta[1][1],eta[2][2],eta[3][3],eta[4][4]);

      printf("qsi      = %f %f %f %f\n",qsi[0][0],qsi[0][1],qsi[1][0],qsi[1][1]);

    

      printf("mi         = %f\n",mi);

      printf("gama       = %f\n",gama);

      printf("cte fluido = %f\n",c_fluido);

 

      printf("Objeto     = %d\n",objeto);

 

      printf("comp_x_plano   = %f comp_y_plano  = %f comp_z_plano  = %f\n",comp_x_plano, comp_y_plano, comp_z_plano);

      printf("raio da esfera = %f\n",raio_esfera);

      printf("raio_torus     = %f RAIO_torus   =%f\n",raio_torus, RAIO_torus);

      printf("raio_cilindro  = %f comp_cilindro = %f\n",raio_cilindro, comp_cilindro);

      printf("raio_cone  = %f RAIO_cone = %f alt_cone = %f\n",raio_cone, RAIO_cone,alt_cone);

      printf("sup_cilindrica_tipo = %d\n valor_u_min  = %f valor_u_max = %f \n valor_v_min = %f valor_v_max = %f\n compx_W = %f compy_W = %f compz_W = %f\n",sup_cilindrica_tipo,valor_u_min,valor_u_max,valor_v_min,valor_v_max,compx_W,compy_W,compz_W );

      printf("sup_regrada_tipo = %d\n valor_u_min_reg  = %f valor_u_max_reg = %f \n valor_v_min_reg = %f valor_v_max_reg = %f\n valor_k = %f\n",sup_regrada_tipo,valor_u_min_reg,valor_u_max_reg,valor_v_min_reg,valor_v_max_reg,valor_k);

      printf("tipo_dominio = %d\n raio_esfera_proj = %f raio_circulo_proj = %f\n t_min = %f t_max = %f\n", tipo_dominio,raio_esfera_proj,raio_circulo_proj,t_min,t_max);  

      printf("u_min_enneper = %f u_max_enneper = %f\n v_min_enneper = %f v_max_enneper = %f\n",u_min_enneper,u_max_enneper,v_min_enneper,v_max_enneper);

      printf("sup_revolucao_tipo = %d\n u_revolucao = %f\n v_min_revolucao = %f v_max_revolucao = %f\n",sup_revolucao_tipo,u_revolucao,v_min_revolucao,v_max_revolucao);

      printf("fronteira :\n");

      for(fd=0;fd<12;fd++)

    printf("k[%d]=%g ",fd,k[fd]);        

      printf("restricoes :\n");  

      for(fd=0;fd<n_restricoes;fd++)

         printf("coord(%d,%d) tipo(%d)\n",restr[fd].coord[0],restr[fd].coord[1],restr[fd].tipo);

  }

  return;

}