%{ // Parser assignment template grammar file for Bison #define __GRAM_TAB_H__ #include "parserstl.h" %} %{ // Semantic Stack Definition %} %union { CHAR c; INT_32 i; UINT_32 ui; FLOAT f; CHAR *str; } %{ #define yylloc stl_lloc #define yyerror stl_error void stl_error(char* s); #define yylex stl_lex extern int stl_lex(); extern YYLTYPE stl_lloc; extern int yyparse(void); extern CScanner *stl_gpCScanner; extern int stl_leng; extern VOID stl_BeginInitial(); extern YY_BUFFER_STATE stl_GetCurrentBuffer(); extern YY_BUFFER_STATE stl_CreateBuffer(FILE *fpFile); extern VOID stl_DeleteBuffer(YY_BUFFER_STATE yyBufferState); extern VOID stl_SwitchToBuffer(YY_BUFFER_STATE yyBufferState); extern VOID stl_SetValueInt(int i); extern VOID stl_SetValueFloat(float f); extern VOID stl_SetValueString(CHAR *pc); //void stl_PrintToken(void *pvLoc, char *s); CParserSTL *stl_gpCParserSTL = NULL; %} %{ // Reserved Word Definitions %} %token rwSOLID %token rwFACET %token rwNORMAL %token rwOUTER %token rwLOOP %token rwVERTEX %token rwENDLOOP %token rwENDFACET %token rwENDSOLID %token rwEND %{ // Operator Definitions %} %{ // Constants and Identifier Definitions %} %token tokCONST_CHAR %token tokCONST_INT %token tokCONST_FLOAT %token tokCONST_STRING %token tokIDENTIFIER %type value %% lump_set : lump_set_start non_empty_lump_list { stl_gpCParserSTL->EndLumpSet(); } ; lump_set_start : { stl_gpCParserSTL->AddLumpSet("", 0, 0); } ; non_empty_lump_list : lump { } | non_empty_lump_list lump { } ; lump : lump_start lump_middle end_solid ident_list { stl_gpCParserSTL->EndLump(); } ; lump_start : rwSOLID ident_list { stl_gpCParserSTL->AddLump(@1.text, @1.first_line, @1.first_column); } ; lump_middle : { } | lump_middle triangle { } ; triangle : triangle_start triangle_middle end_loop end_facet { stl_gpCParserSTL->EndTriangle(); } ; triangle_start : rwFACET normal rwOUTER rwLOOP { stl_gpCParserSTL->AddTriangle(@1.text, @1.first_line, @1.first_column); } ; triangle_middle : vertex vertex vertex { } ; normal : rwNORMAL value value value { } ; vertex : rwVERTEX value value value { stl_gpCParserSTL->AddVertex(@1.text, @1.first_line, @1.first_column, $2, $3, $4); } ; value : tokCONST_FLOAT { $$ = $1; } | tokCONST_INT { $$ = (FLOAT)$1; } ; end_loop : rwENDLOOP { } | rwEND rwLOOP { } ; end_facet : rwENDFACET { } | rwEND rwFACET { } ; end_solid : rwENDSOLID { } | rwEND rwSOLID { } ; ident_list : { } | ident_list tokIDENTIFIER { } ; %% CParserSTL *stl_InitParser(CParserSTL *pCParserSTL, CHAR *pcInput, CHAR **ppcDirectories, UINT_32 uiDirectories) { ASSERT( pcInput != NULL ); ASSERT( pCParserSTL != NULL ); pCParserSTL->Init(pcInput, ppcDirectories, uiDirectories, &stl_gpCParserSTL, &stl_lloc, yyparse, &stl_gpCScanner, &stl_leng, stl_BeginInitial, stl_GetCurrentBuffer, stl_CreateBuffer, stl_DeleteBuffer, stl_SwitchToBuffer, stl_SetValueInt, stl_SetValueFloat, stl_SetValueString); return pCParserSTL; } // This is for debugging only /* void stl_PrintToken(void *pvLoc, char *s) { YYLTYPE *pLoc; pLoc = (YYLTYPE*)pvLoc; printf("file \"%s\": line %d: col %d: %s\n", pLoc->text, pLoc->first_line, pLoc->first_column, s); } */ // This is yyerror which is called by bison void stl_error(char */*s*/) { stl_gpCParserSTL->HandleError(yylloc.first_line, yylloc.first_column, ""); /* fprintf(stderr, "Syntax error in file \"%s\" near line %d, column %d.\n", yylloc.text, yylloc.first_line, yylloc.first_column); */ }