1 %{ 2 // Saves information about a rib file 3 typedef struct TRibFile { 4 int ribLineno; 5 const char *ribFile; 6 YY_BUFFER_STATE ribState; 7 TRibFile *next; 8 } TRibFile; 9 10 static TRibFile *ribStack = NULL; 11 12 // Tell flex how to define yylex for pure parser 13 #undef YY_DECL 14 #define YY_DECL int yylex( YYSTYPE *yylval ) 15 16 #ifdef HAVE_ZLIB 17 18 // Overwrite the YYinput so that it uses libz 19 #undef YY_INPUT 20 #define YY_INPUT(buf, retval, maxlen) if ( (retval = gzread((gzFile)ribin,buf,maxlen)) < 0) \ 21 YY_FATAL_ERROR( "input in flex scanner failed" ); 22 23 #endif 24 25 %} 26 %option never-interactive 27 %option noyywrap 28 %% 29 Declare return RIB_DECLARE; 30 FrameBegin return RIB_FRAME_BEGIN; 31 FrameEnd return RIB_FRAME_END; 32 WorldBegin return RIB_WORLD_BEGIN; 33 WorldEnd return RIB_WORLD_END; 34 Format return RIB_FORMAT; 35 FrameAspectRatio return RIB_FRAME_ASPECT_RATIO; 36 ScreenWindow return RIB_SCREEN_WINDOW; 37 CropWindow return RIB_CROP_WINDOW; 38 Projection return RIB_PROJECTION; 39 Clipping return RIB_CLIPPING; 40 ClippingPlane return RIB_CLIPPING_PLANE; 41 DepthOfField return RIB_DEPTH_OF_FIELD; 42 Shutter return RIB_SHUTTER; 43 PixelVariance return RIB_PIXEL_VARIANCE; 44 PixelSamples return RIB_PIXEL_SAMPLES; 45 PixelFilter return RIB_PIXEL_FILTER; 46 Exposure return RIB_EXPOSURE; 47 Imager return RIB_IMAGER; 48 Quantize return RIB_QUANTIZE; 49 Display return RIB_DISPLAY; 50 DisplayChannel return RIB_DISPLAYCHANNEL; 51 Hider return RIB_HIDER; 52 ColorSamples return RIB_COLOR_SAMPLES; 53 RelativeDetail return RIB_RELATIVE_DETAIL; 54 Option return RIB_OPTION; 55 56 AttributeBegin return RIB_ATTRIBUTE_BEGIN; 57 AttributeEnd return RIB_ATTRIBUTE_END; 58 Color return RIB_COLOR; 59 Opacity return RIB_OPACITY; 60 TextureCoordinates return RIB_TEXTURE_COORDINATES; 61 LightSource return RIB_LIGHT_SOURCE; 62 AreaLightSource return RIB_AREA_LIGHT_SOURCE; 63 Illuminate return RIB_ILLUMINATE; 64 Surface return RIB_SURFACE; 65 Atmosphere return RIB_ATMOSPHERE; 66 Interior return RIB_INTERIOR; 67 Exterior return RIB_EXTERIOR; 68 ShadingRate return RIB_SHADING_RATE; 69 ShadingInterpolation return RIB_SHADING_INTERPOLATION; 70 Matte return RIB_MATTE; 71 Bound return RIB_BOUND; 72 Detail return RIB_DETAIL; 73 DetailRange return RIB_DETAIL_RANGE; 74 GeometricApproximation return RIB_GEOMETRIC_APPROXIMATION; 75 GeometricRepresentation return RIB_GEOMETRIC_REPRESENTATION; 76 Orientation return RIB_ORIENTATION; 77 ReverseOrientation return RIB_REVERSE_ORIENTATION; 78 Sides return RIB_SIDES; 79 80 Identity return RIB_IDENTITY; 81 Transform return RIB_TRANSFORM; 82 ConcatTransform return RIB_CONCAT_TRANSFORM; 83 Perspective return RIB_PERSPECTIVE; 84 Translate return RIB_TRANSLATE; 85 Rotate return RIB_ROTATE; 86 Scale return RIB_SCALE; 87 Skew return RIB_SKEW; 88 Deformation return RIB_DEFORMATION; 89 Displacement return RIB_DISPLACEMENT; 90 CoordinateSystem return RIB_COORDINATE_SYSTEM; 91 CoordSysTransform return RIB_COORDINATE_SYS_TRANSFORM; 92 93 TransformBegin return RIB_TRANSFORM_BEGIN; 94 TransformEnd return RIB_TRANSFORM_END; 95 96 Attribute return RIB_ATTRIBUTE; 97 98 Polygon return RIB_POLYGON; 99 GeneralPolygon return RIB_GENERAL_POLYGON; 100 PointsPolygons return RIB_POINTS_POLYGONS; 101 PointsGeneralPolygons return RIB_POINTS_GENERAL_POLYGONS; 102 Basis return RIB_BASIS; 103 Patch return RIB_PATCH; 104 PatchMesh return RIB_PATCH_MESH; 105 NuPatch return RIB_NU_PATCH; 106 TrimCurve return RIB_TRIM_CURVE; 107 108 Sphere return RIB_SPHERE; 109 Cone return RIB_CONE; 110 Cylinder return RIB_CYLINDER; 111 Hyperboloid return RIB_HYPERBOLOID; 112 Paraboloid return RIB_PARABOLOID; 113 Disk return RIB_DISK; 114 Torus return RIB_TORUS; 115 Curves return RIB_CURVES; 116 Points return RIB_POINTS; 117 SubdivisionMesh return RIB_SUBDIVISION_MESH; 118 Blobby return RIB_BLOBBY; 119 Geometry return RIB_GEOMETRY; 120 121 Procedural return RIB_PROCEDURAL; 122 123 SolidBegin return RIB_SOLID_BEGIN; 124 SolidEnd return RIB_SOLID_END; 125 126 ObjectBegin return RIB_OBJECT_BEGIN; 127 ObjectEnd return RIB_OBJECT_END; 128 129 ObjectInstance return RIB_OBJECT_INSTANCE; 130 131 MotionBegin return RIB_MOTION_BEGIN; 132 MotionEnd return RIB_MOTION_END; 133 134 MakeTexture return RIB_MAKE_TEXTURE; 135 MakeBrickMap return RIB_MAKE_BRICKMAP; 136 MakeBump return RIB_MAKE_BUMP; 137 MakeLatLongEnvironment return RIB_MAKE_LAT_LONG_ENVIRONMENT; 138 MakeCubeFaceEnvironment return RIB_MAKE_CUBE_FACE_ENVIRONMENT; 139 MakeShadow return RIB_MAKE_SHADOW; 140 141 ArchiveRecord return RIB_ARCHIVE_RECORD; 142 143 ArchiveBegin return RIB_ARCHIVE_BEGIN; 144 ArchiveEnd return RIB_ARCHIVE_END; 145 146 Resource return RIB_RESOURCE; 147 ResourceBegin return RIB_RESOURCE_BEGIN; 148 ResourceEnd return RIB_RESOURCE_END; 149 150 IfBegin return RIB_IFBEGIN; 151 IfEnd return RIB_IFEND; 152 ElseIf return RIB_ELSEIF; 153 Else return RIB_ELSE; 154 155 156 ReadArchive[ \t]*\"[^\"]*\" { 157 char fileName[256]; 158 char *start = strchr(ribtext,'\"'); 159 char location[OS_MAX_PATH_LENGTH]; 160 COptions *options; 161 162 assert(start != NULL); 163 164 strcpy(fileName,start+1); 165 166 fileName[strlen(fileName)-1] = '\0'; 167 168 options = CRenderer::context->getOptions(); 169 170 if (CRenderer::locateFile(location,fileName,options->archivePath) == TRUE) { 171 FILE *in; 172 173 info(CODE_RESOLUTION,"\"%s\" -> \"%s\"\n",fileName,location); 174 175 #ifdef HAVE_ZLIB 176 in = (FILE *) gzopen( location, "r" ); 177 #else 178 in = fopen( location, "r" ); 179 #endif 180 181 if (in != NULL) { 182 TRibFile *newFile = new TRibFile; 183 184 newFile->ribLineno = ribLineno; 185 newFile->ribState = YY_CURRENT_BUFFER; 186 newFile->ribFile = ribFile; 187 newFile->next = ribStack; 188 ribStack = newFile; 189 190 ribFile = strdup(fileName); 191 ribLineno = 1; 192 ribin = in; 193 rib_switch_to_buffer(rib_create_buffer( ribin, YY_BUF_SIZE ) ); 194 BEGIN(INITIAL); 195 } else { 196 error(CODE_NOFILE,"Failed to open \"%s\"\n",location); 197 } 198 } else { 199 error(CODE_NOFILE,"Failed to find \"%s(.rib)\"\n",fileName); 200 } 201 } 202 203 ErrorHandler return RIB_ERROR_HANDLER; 204 205 version return RIB_VERSION; 206 [0-9]+\.[0-9]+\.[0-9]+ return RIB_VERSION_STRING; 207 208 \[ return RIB_ARRAY_BEGIN; 209 \] return RIB_ARRAY_END; 210 211 \"[^\"]*\" { yylval->string = rstrdup(ribtext+1,CRenderer::globalMemory); yylval->string[strlen(yylval->string)-1] = '\0'; return RIB_TEXT;} 212 [+-]?([0-9]+|([0-9]*(\.[0-9]+)?)([eE][+-]?[0-9]+)?) { /*sscanf(ribtext,"%f",&yylval->real);*/ yylval->real = (float) atof(ribtext); return RIB_FLOAT; } 213 [+-]?([0-9]+|([0-9]+(\.[0-9]*)?)([eE][+-]?[0-9]+)?) { /*sscanf(ribtext,"%f",&yylval->real);*/ yylval->real = (float) atof(ribtext); return RIB_FLOAT; } 214 215 [\t ] ; 216 #\!.* { yylval->string = rstrdup(ribtext+2,CRenderer::globalMemory); return RIB_STRUCTURE_COMMENT; } 217 #.* ; 218 \n { ribLineno++; } 219 <<EOF>> { 220 if (ribStack == NULL) { 221 yyterminate(); 222 } else { 223 TRibFile *nextFile = ribStack->next; 224 rib_delete_buffer( YY_CURRENT_BUFFER ); 225 #ifdef HAVE_ZLIB 226 gzclose((gzFile)ribin); 227 #else 228 fclose(ribin); 229 #endif 230 free((char *) ribFile); 231 rib_switch_to_buffer(ribStack->ribState); 232 ribLineno = ribStack->ribLineno; 233 ribFile = ribStack->ribFile; 234 delete ribStack; 235 ribStack = nextFile; 236 } 237 } 238 \377 { // Terminate parsing for a runprogram 239 if (ribStack == NULL) { 240 yyterminate(); 241 } else { 242 TRibFile *nextFile = ribStack->next; 243 rib_delete_buffer( YY_CURRENT_BUFFER ); 244 245 #ifdef HAVE_ZLIB 246 gzclose((gzFile)ribin); 247 #else 248 fclose(ribin); 249 #endif 250 251 free((char *) ribFile); 252 rib_switch_to_buffer(ribStack->ribState); 253 ribLineno = ribStack->ribLineno; 254 ribFile = ribStack->ribFile; 255 delete ribStack; 256 ribStack = nextFile; 257 } 258 } 259 %% 260 261