Files
pvvmud/util/asc2bog/asc_parse.y
2025-03-05 08:37:43 +01:00

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