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;
}