%{ #include #include #include #include #include "entity.h" #include "material.h" #include "util.h" #define YYDEBUG 1 extern int yylex(void); static void yyerror (char const *msg) { extern int yylineno; printf ("%s (line %d)", msg, yylineno); abort (); } using namespace std; vector tmpvtx; vector tmpidx; list models; geometry_indexed_2d *geoid; %} %union { char *ident; char *string; float num; } %token MODEL IAPO NODES SHADOWMODEL %token ID %token STRING %token NUMBER %% proc: ID sections ; sections: section | sections section ; section: MODEL '{' STRING NUMBER '}' | MODEL '{' STRING NUMBER surfaces '}' | IAPO '{' NUMBER NUMBER pos '}' | NODES '{' NUMBER nodes '}' | SHADOWMODEL '{' STRING NUMBER NUMBER NUMBER NUMBER NUMBER mods modidxs '}' ; nodes: node | nodes node ; node: '(' NUMBER NUMBER NUMBER NUMBER ')' NUMBER NUMBER | ; pos: po | pos po ; po: NUMBER NUMBER NUMBER pokla pokla pokla pokla ; poklas: pokla | poklas pokla ; pokla: '(' NUMBER NUMBER NUMBER ')'; ; mods: mod | mods mod ; mod: '(' NUMBER NUMBER NUMBER ')' | ; modidxs: modidx | modidxs modidx ; modidx: NUMBER NUMBER NUMBER ; surfaces: surface | surfaces surface ; surface: '{' STRING NUMBER NUMBER vertexes triangles '}' { geoid = new geometry_indexed_2d (testmat, GL_TRIANGLES, tmpvtx, tmpidx); entity *e = new entity (geoid); e->show (); tmpvtx.clear (); tmpidx.clear (); } ; vertexes: vertex | vertexes vertex ; vertex: '(' NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER ')' { tmpvtx.push_back (vertex_t2f_n3f_v3f (point ($2, $4, $3), -vec3 ($7, $8, $9), tex2 ($5, $6))); } ; triangles: triangle | triangles triangle ; triangle: NUMBER NUMBER NUMBER { tmpidx.push_back ((GLushort) $1); tmpidx.push_back ((GLushort) $3); tmpidx.push_back ((GLushort) $2); } %% extern FILE *yyin; bool doom3parse (const char *f) { yyin = fopen (f, "r"); if (!yyin) return false; yyparse (); }