127 lines
2.9 KiB
Plaintext
127 lines
2.9 KiB
Plaintext
/* The geo2bog Yacc/Bison spesification file */
|
|
%{
|
|
#define YYPARSER /* distinguishes yacc output from other code files */
|
|
|
|
#include "globals.h"
|
|
#include "parse.h"
|
|
#include "util.h"
|
|
|
|
#define YYSTYPE TreeNode_t *
|
|
|
|
static TreeNode_t * savedTree; /* Stores syntax tree for later return */
|
|
|
|
%}
|
|
|
|
%token AMBIENT_LIGHT_COLOR NAMED_OBJECT TRIMESH VERTICES FACES MAPPED
|
|
%token MATERIAL VERTEX VERTEX_LIST FACE_LIST FACE SMOOTHING AB BC CA
|
|
%token RED GREEN BLUE ASSIGN SOLID_BACKGROUND_COLOR
|
|
%token FLOAT NUM STRING
|
|
%token ERROR
|
|
|
|
%%
|
|
geometry: head object_seq
|
|
{ savedTree = newGeometry($1,$2); }
|
|
;
|
|
head: AMBIENT_LIGHT_COLOR ':' color
|
|
{ $$ = newHead(); }
|
|
| AMBIENT_LIGHT_COLOR ':' color SOLID_BACKGROUND_COLOR ':' color { $$ = newHead(); }
|
|
;
|
|
color: RED ASSIGN float_num GREEN ASSIGN float_num BLUE ASSIGN float_num
|
|
;
|
|
float_num: FLOAT
|
|
{ $$ = newFloat(atof(tokenString)); }
|
|
;
|
|
object_seq: object_seq object
|
|
{ $$ = linkNode($1,$2); }
|
|
| object
|
|
{ $$ = $1; }
|
|
;
|
|
object: object_head object_geo
|
|
{ $$ = newObject($1,$2); }
|
|
;
|
|
object_head: NAMED_OBJECT ':' STRING
|
|
{
|
|
tokenString[strlen(tokenString)-1] = '\0';
|
|
$$ = newObjectHead(copyString(tokenString+1));
|
|
}
|
|
;
|
|
object_geo: trimesh_head vertex_list face_list
|
|
{ $$ = newTriMesh($1,$2,$3); }
|
|
;
|
|
trimesh_head: TRIMESH ',' VERTICES ':' num FACES ':' num MAPPED
|
|
{ $$ = newTriMeshHead($5,$8,TRUE); }
|
|
| TRIMESH ',' VERTICES ':' num FACES ':' num
|
|
{ $$ = newTriMeshHead($5,$8,FALSE); }
|
|
;
|
|
num: NUM
|
|
{ $$ = newNum(atoi(tokenString)); }
|
|
;
|
|
vertex_list: VERTEX_LIST ':' vertex_seq
|
|
{ $$ = $3; }
|
|
;
|
|
vertex_seq: vertex_seq vertex
|
|
{ $$ = linkNode($1,$2); }
|
|
| vertex
|
|
{ $$ = $1; }
|
|
;
|
|
vertex: vertex_coord uv_mapping
|
|
{ $$ = linkNode($1,$2); }
|
|
| vertex_coord
|
|
{ $$ = $1; }
|
|
;
|
|
uv_mapping: 'U' ':' float_num 'V' ':' float_num
|
|
{ $$ = newUVMapping($3,$6); }
|
|
vertex_coord: VERTEX num ':' 'X' ':' float_num 'Y' ':' float_num 'Z' ':' float_num
|
|
{ $$ = newVertex($2,$6,$9,$12); }
|
|
;
|
|
face_list: FACE_LIST ':' face_seq
|
|
{ $$ = $3; }
|
|
;
|
|
face_seq: face_seq face_index
|
|
{ $$ = linkNode($1,$2); }
|
|
| face_index
|
|
{ $$ = $1; }
|
|
;
|
|
face_index: face face_opt_seq
|
|
{ $$ = linkNode($1,$2); }
|
|
| face
|
|
{ $$ = $1; }
|
|
;
|
|
face: FACE num ':' 'A' ':' num 'B' ':' num 'C' ':' num AB ':' num BC ':' num CA ':' num
|
|
{ $$ = newFace($2,$6,$9,$12); }
|
|
;
|
|
face_opt_seq: face_opt_seq face_opt
|
|
{ $$ = linkNode($1,$2); }
|
|
| face_opt
|
|
{ $$ = $1; }
|
|
;
|
|
face_opt: material
|
|
{ $$ = $1; }
|
|
| smoothing
|
|
{ $$ = $1; }
|
|
;
|
|
material: MATERIAL ':' STRING
|
|
{
|
|
tokenString[strlen(tokenString)-1] = '\0';
|
|
$$ = newMaterial(copyString(tokenString+1));
|
|
}
|
|
;
|
|
smoothing: SMOOTHING ':' num
|
|
{ $$ = newSmoothing($3); }
|
|
;
|
|
%%
|
|
|
|
static TokenType yylex(){
|
|
return getToken();
|
|
}
|
|
|
|
int yyerror(char * message){
|
|
printf("Syntax error at line %d: %s\n",lineno,message);
|
|
return 0;
|
|
}
|
|
|
|
TreeNode_t * parse(){
|
|
yyparse();
|
|
return savedTree;
|
|
}
|