%{ #include "parserstl.h" #include "stl_.tab.h" #define yylval stl_lval extern YYSTYPE yylval; // holds start line and column of token. #define yylloc stl_lloc extern YYLTYPE yylloc; // holds start line and column of token. CScanner *stl_gpCScanner = NULL; #undef yywrap #define yywrap() stl_gpCScanner->PopFile() #define FLEX_DEBUG 1 // Define macro to return token and update column number. #define ReturnToken(x) \ stl_gpCScanner->ConsumeToken(); \ return (x) #define ReturnTokenInt() \ stl_gpCScanner->ScanInteger(yytext); \ return tokCONST_INT #define ReturnTokenFloat() \ stl_gpCScanner->ScanFloat(yytext); \ return tokCONST_FLOAT #define ReturnTokenString() \ stl_gpCScanner->ScanString(); \ return tokCONST_STRING #define ReturnTokenIdentifier() \ stl_gpCScanner->ScanIdentifier(yytext); \ return tokIDENTIFIER #define TABSIZE 8 // Size of tab. %} OCT [0-7] DIGIT [0-9] HEX [0-9A-Fa-f] LETTER [A-Za-z_] IDTAIL [A-Za-z0-9_] ID {LETTER}{IDTAIL}* STR [^\0]|"\\\"" SPACE [ \t\f\v\a] FLOAT "-"?({DIGIT}*\.)?{DIGIT}+([eE][-+]?{DIGIT}+)? %x COMMENT_STATE %x STRING_STATE %x INCLUDE_STATE %% "(*" {stl_gpCScanner->CommentStart();} "*)" { if ( stl_gpCScanner->CommentEnd() ) { BEGIN 0; } } "\n" {stl_gpCScanner->ConsumeNewLine();} [*(] {stl_gpCScanner->ConsumeToken();} [^*(\n]+ {stl_gpCScanner->ConsumeToken();} "\"" {stl_gpCScanner->StringEnd(); BEGIN 0; ReturnTokenString();} "\n" {stl_gpCScanner->StringAppendNewLine();} "\\\n" {stl_gpCScanner->ConsumeNewLine();} [^"\\\n]+ {stl_gpCScanner->StringAppend(yytext);} "\""{SPACE}*")" { stl_gpCScanner->FileNameEnd(); BEGIN 0; stl_gpCScanner->PushFile(stl_gpCScanner->ScanFileName()); } "\n" {stl_gpCScanner->FileNameAppendNewLine();} "\\\n" {stl_gpCScanner->ConsumeNewLine();} [^"\\\n]+ {stl_gpCScanner->FileNameAppend(yytext);} \n {stl_gpCScanner->ConsumeNewLine();} {SPACE}+ {stl_gpCScanner->ConsumeToken();} "solid" {ReturnToken(rwSOLID);} "facet" {ReturnToken(rwFACET);} "normal" {ReturnToken(rwNORMAL);} "outer" {ReturnToken(rwOUTER);} "loop" {ReturnToken(rwLOOP);} "vertex" {ReturnToken(rwVERTEX);} "endloop" {ReturnToken(rwENDLOOP);} "endfacet" {ReturnToken(rwENDFACET);} "endsolid" {ReturnToken(rwENDSOLID);} "end" {ReturnToken(rwEND);} "(*" {stl_gpCScanner->CommentStart(); BEGIN COMMENT_STATE;} "*)" { stl_gpCScanner->HandleError(0, 0, "Mismatched comment parentheses"); stl_gpCScanner->ConsumeToken(); } "#".* {stl_gpCScanner->ConsumeToken();} "\"" {stl_gpCScanner->StringStart(); BEGIN STRING_STATE;} "("{SPACE}*"include"{SPACE}+"\"" {stl_gpCScanner->FileNameStart(); BEGIN INCLUDE_STATE;} {FLOAT} {ReturnTokenFloat();} {ID} {ReturnTokenIdentifier();} . { stl_gpCScanner->HandleError(0, 0, "Unknown character \"%s\"", yylloc.text); stl_gpCScanner->ConsumeToken(); } %% VOID stl_BeginInitial() { BEGIN 0; } YY_BUFFER_STATE stl_GetCurrentBuffer() { return YY_CURRENT_BUFFER; } YY_BUFFER_STATE stl_CreateBuffer(FILE *fpFile) { return yy_create_buffer(fpFile, YY_BUF_SIZE); } VOID stl_DeleteBuffer(YY_BUFFER_STATE yyBufferState) { yy_delete_buffer(yyBufferState); } VOID stl_SwitchToBuffer(YY_BUFFER_STATE yyBufferState) { yy_switch_to_buffer(yyBufferState); } VOID stl_SetValueInt(int i) { yylval.i = i; } VOID stl_SetValueFloat(float f) { yylval.f = f; } VOID stl_SetValueString(CHAR *pc) { yylval.str = pc; }