00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 %{
00026
00027 #define YY_MAIN 0
00028 #define YY_NEVER_INTERACTIVE 1
00029
00030 #include "pbrt.h"
00031 #include "api.h"
00032
00033 struct ParamArray;
00034
00035 #ifdef WIN32
00036 #include "pbrtparse.hpp"
00037 #else
00038 #include "pbrtparse.h"
00039 #endif
00040
00041 #ifdef WIN32
00042 #pragma warning ( disable: 4244 )
00043 #endif
00044
00045 struct IncludeInfo {
00046 string filename;
00047 YY_BUFFER_STATE bufState;
00048 int lineNum;
00049 };
00050 vector<IncludeInfo> includeStack;
00051
00052 extern int line_num;
00053 int str_pos;
00054
00055 void add_string_char( char c )
00056 {
00057 yylval.string[str_pos++] = c;
00058 yylval.string[str_pos] = '\0';
00059 }
00060
00061 extern void yyerror( const char *str );
00062 extern void ParseError( const char *format, ... ) PRINTF_FUNC;
00063
00064 void include_push(char *filename) {
00065 if (includeStack.size() > 32)
00066 Severe("Only 32 levels of nested Include allowed in scene files.");
00067 IncludeInfo ii;
00068 extern string current_file;
00069 ii.filename = current_file;
00070 ii.bufState = YY_CURRENT_BUFFER;
00071 ii.lineNum = line_num;
00072 includeStack.push_back(ii);
00073
00074 current_file = filename;
00075 line_num = 1;
00076
00077 yyin = fopen(filename, "r");
00078 if (!yyin)
00079 Severe("Unable to open included scene file \"%s\"", filename);
00080 yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE));
00081 }
00082
00083 void include_pop(void)
00084 {
00085 extern int line_num;
00086 extern string current_file;
00087 yy_delete_buffer(YY_CURRENT_BUFFER);
00088 yy_switch_to_buffer(includeStack.back().bufState);
00089 current_file = includeStack.back().filename;
00090 line_num = includeStack.back().lineNum;
00091 includeStack.pop_back();
00092 }
00093 %}
00094 %option nounput
00095 WHITESPACE [ \t\0xa]+
00096 NUMBER [-+]?([0-9]+|(([0-9]+\.[0-9]*)|(\.[0-9]+)))([eE][-+]?[0-9]+)?
00097 IDENT [a-zA-Z_][a-zA-Z_0-9]*
00098 %x STR COMMENT INCL INCL_FILE
00099 %%
00100 Include { BEGIN(INCL); }
00101 <INCL>{WHITESPACE} ;
00102 <INCL>\" { BEGIN(INCL_FILE); }
00103 <INCL>. { ParseError( "Illegal character following Include directive" ); }
00104 <INCL_FILE>\" { BEGIN INITIAL; }
00105 <INCL_FILE>. { ParseError( "Illegal character in Include file name" ); }
00106 <INCL_FILE>[\-a-zA-Z_\.0-9/ \t]+ {
00107 BEGIN(INITIAL);
00108 include_push(yytext);
00109 }
00110 "#" { BEGIN COMMENT; }
00111 <COMMENT>. /* eat it up */
00112 <COMMENT>\n { line_num++; BEGIN INITIAL; }
00113 Accelerator { return ACCELERATOR; }
00114 AreaLightSource { return AREALIGHTSOURCE; }
00115 AttributeBegin { return ATTRIBUTEBEGIN; }
00116 AttributeEnd { return ATTRIBUTEEND; }
00117 Camera { return CAMERA; }
00118 ConcatTransform { return CONCATTRANSFORM; }
00119 CoordinateSystem { return COORDINATESYSTEM; }
00120 CoordSysTransform { return COORDSYSTRANSFORM; }
00121 Film { return FILM; }
00122 Identity { return IDENTITY; }
00123 LightSource { return LIGHTSOURCE; }
00124 LookAt { return LOOKAT; }
00125 Material { return MATERIAL; }
00126 ObjectBegin { return OBJECTBEGIN; }
00127 ObjectEnd { return OBJECTEND; }
00128 ObjectInstance { return OBJECTINSTANCE; }
00129 PixelFilter { return PIXELFILTER; }
00130 ReverseOrientation { return REVERSEORIENTATION; }
00131 Rotate { return ROTATE; }
00132 Sampler { return SAMPLER; }
00133 SearchPath { return SEARCHPATH; }
00134 Scale { return SCALE; }
00135 Shape { return SHAPE; }
00136 SurfaceIntegrator { return SURFACEINTEGRATOR; }
00137 Texture { return TEXTURE; }
00138 TransformBegin { return TRANSFORMBEGIN; }
00139 TransformEnd { return TRANSFORMEND; }
00140 Transform { return TRANSFORM; }
00141 Translate { return TRANSLATE; }
00142 Volume { return VOLUME; }
00143 VolumeIntegrator { return VOLUMEINTEGRATOR; }
00144 WorldBegin { return WORLDBEGIN; }
00145 WorldEnd { return WORLDEND; }
00146 {WHITESPACE} /* do nothing */
00147 \n { line_num++; }
00148 {NUMBER} {
00149 yylval.num = (float) atof(yytext);
00150 return NUM;
00151 }
00152 {IDENT} {
00153 strcpy( yylval.string, yytext );
00154 return ID;
00155 }
00156 "[" { return LBRACK; }
00157 "]" { return RBRACK; }
00158 \" { BEGIN STR; str_pos = 0; }
00159 <STR>\\n {add_string_char('\n');}
00160 <STR>\\t {add_string_char('\t');}
00161 <STR>\\r {add_string_char('\r');}
00162 <STR>\\b {add_string_char('\b');}
00163 <STR>\\f {add_string_char('\f');}
00164 <STR>\\\" {add_string_char('\"');}
00165 <STR>\\\\ {add_string_char('\\');}
00166 <STR>\\[0-9]{3} {
00167 int val = atoi(yytext+1);
00168 while(val > 256)
00169 val -= 256;
00170 add_string_char(val);
00171 }
00172 <STR>\\\n {line_num++;}
00173 <STR>\\. { add_string_char(yytext[1]);}
00174 <STR>\" {BEGIN INITIAL; return STRING;}
00175 <STR>. {add_string_char(yytext[0]);}
00176 <STR>\n {ParseError("Unterminated string!");}
00177
00178 . { ParseError( "Illegal character: %c",yytext[0] ); }
00179 %%
00180 int yywrap(void)
00181 {
00182 if (includeStack.size() ==0) return 1;
00183 include_pop();
00184 BEGIN(INCL_FILE);
00185 return 0;
00186 }
00187