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