1
/* -------------- declaration section -------------- */
11
#include "parsenode.h"
13
using namespace Aqsis;
18
#ifdef AQSIS_SYSTEM_MACOSX
19
#include "parser.cpp.h"
26
extern "C" TqInt isatty(TqInt);
27
#pragma warning(disable : 4786)
33
extern std::istream* ParseInputStream;
34
extern CqString ParseStreamName;
35
extern TqInt ParseLineNumber;
37
extern TqBool FindVariable(const char* name, SqVarRef& ref);
38
extern TqBool FindFunction(const char* name, std::vector<SqFuncRef>& Ref);
39
extern CqString strNameSpace();
43
static TqInt scannerinput(char* Buffer, TqInt MaxSize);
45
#define YY_INPUT(buffer, result, max_size) (result = scannerinput(buffer, max_size))
55
LF (\r\n)|(\r)|(\n)|(\x0c)
57
hashline #{WS}?(line|{D}+)
58
hash #{WS}?((pragma)).*{LF}
59
string \"(\\.|[^\\"])*\"
62
#define YY_SKIP_YYWRAP
64
static TqInt check_type();
69
{LF} { ParseLineNumber+=+1; }
71
"break" { return(BREAK); }
72
"continue" { return(CONTINUE); }
73
"else" { return(ELSE); }
74
"float" { return(TYPE_FLOAT); }
75
"point" { return(TYPE_POINT); }
76
"vector" { return(TYPE_VECTOR); }
77
"normal" { return(TYPE_NORMAL); }
78
"string" { return(TYPE_STRING); }
79
"void" { return(TYPE_VOID); }
80
"matrix" { return(TYPE_MATRIX); }
81
"color" { return(TYPE_COLOR); }
82
"for" { return(FOR); }
84
"return" { return(RETURN); }
85
"while" { return(WHILE); }
86
"uniform" { return(TYPE_UNIFORM); }
87
"varying" { return(TYPE_VARYING); }
88
"output" { return(OUTPUT); }
89
"extern" { return(EXTERN); }
90
"atmosphere" { return(SHADER_TYPE_ATMOSPHERE); }
91
"surface" { return(SHADER_TYPE_SURFACE); }
92
"volume" { return(SHADER_TYPE_VOLUME); }
93
"displacement" { return(SHADER_TYPE_DISPLACEMENT); }
94
"imager" { return(SHADER_TYPE_IMAGER); }
95
"attribute" { return(ATTRIBUTE);}
96
"option" { return(OPTION);}
97
"rendererinfo" { return(RENDERERINFO);}
98
"incident" { return(INCIDENT);}
99
"opposite" { return(OPPOSITE);}
100
"transformation" { return(SHADER_TYPE_TRANSFORMATION); }
101
"light" { return(SHADER_TYPE_LIGHT); }
102
"lightsource" { return(LIGHTSOURCE); }
103
"illuminate" { return(ILLUMINATE);}
104
"illuminance" { return(ILLUMINANCE);}
105
"solar" { return(SOLAR);}
106
"texture" { return(TEXTUREMAP);}
107
"environment" { return(ENVIRONMENT);}
108
"bump" { return(BUMP);}
109
"shadow" { return(SHADOW);}
110
"occlusion" { return(OCCLUSION);}
111
"textureinfo" { return(TEXTUREINFO);}
114
// Find the start of the line no.
116
i=strcspn((char*)yytext, "0123456789");
118
ln=strtol((char*)yytext+i, &endptr, 10);
120
// Now check if there is a new filename specified.
122
if((fname=strchr(endptr, '\"'))!=0)
125
if((i=strcspn(fname, "\""))>0)
127
CqString strfName(fname);
128
ParseStreamName=strfName.substr(0,i).c_str();
132
{hash} { ParseLineNumber+=1; }
134
{L}({L}|{D})* { yylval.m_Identifier=new CqString((char*)yytext); return(check_type()); }
136
0[xX]{H}+{IS}? { yylval.m_FloatConst=(TqFloat)atof((char*)yytext); return(FLOAT_CONSTANT); }
137
0{D}+{IS}? { yylval.m_FloatConst=(TqFloat)atof((char*)yytext); return(FLOAT_CONSTANT); }
138
{D}+{IS}? { yylval.m_FloatConst=(TqFloat)atof((char*)yytext); return(FLOAT_CONSTANT); }
139
'(\\.|[^\\'])+' { yylval.m_FloatConst=(TqFloat)atof((char*)yytext); return(FLOAT_CONSTANT); }
141
{D}+{E}{FS}? { yylval.m_FloatConst=(TqFloat)atof((char*)yytext); return(FLOAT_CONSTANT); }
142
{D}*"."{D}+({E})?{FS}? { yylval.m_FloatConst=(TqFloat)atof((char*)yytext); return(FLOAT_CONSTANT); }
143
{D}+"."{D}*({E})?{FS}? { yylval.m_FloatConst=(TqFloat)atof((char*)yytext); return(FLOAT_CONSTANT); }
146
CqString strText((char*)yytext);
147
yylval.m_Identifier=new CqString(strText.substr(1,strText.size()-2));
148
return(STRING_LITERAL);
151
"+=" { return(ADD_ASSIGN); }
152
"-=" { return(SUB_ASSIGN); }
153
"*=" { return(MUL_ASSIGN); }
154
"/=" { return(DIV_ASSIGN); }
155
"&&" { return(AND_OP); }
156
"||" { return(OR_OP); }
157
"<=" { return(LE_OP); }
158
">=" { return(GE_OP); }
159
"==" { return(EQ_OP); }
160
"!=" { return(NE_OP); }
187
. { /* ignore bad characters */ }
199
// Check the type against known variables.
200
TqInt Ret=IDENTIFIER;
202
CqString strName(strNameSpace());
203
strName+=(char*)yytext;
205
yylval.m_pSymbol.eType=0;
207
if(FindVariable(strName.c_str(), var))
209
yylval.m_pSymbol.VarRef=var;
210
yylval.m_pSymbol.eType=1;
214
// Check the type against global variables.
215
strName=(char*)yytext;
216
if(FindVariable(strName.c_str(), var))
218
yylval.m_pSymbol.VarRef=var;
219
yylval.m_pSymbol.eType=1;
223
// Check the type against known functions.
224
std::vector<SqFuncRef> func;
225
if(FindFunction((char*)yytext, func))
227
yylval.m_pSymbol.FuncRef=func[0];
228
yylval.m_pSymbol.eType|=2;
235
static TqInt scannerinput(char* Buffer, TqInt MaxSize)
238
assert(ParseInputStream);
244
if(!ParseInputStream->eof())
246
ParseInputStream->read(Buffer,MaxSize);
247
count=ParseInputStream->gcount();
248
ParseInputStream->clear(ParseInputStream->rdstate()&(~std::ios::failbit));
249
if(ParseInputStream->bad())