%x incl
%x quote
%%
%{
#undef yywrap
char filename[128];
%}


^.*$		{
			if (yyin != stdin)
				cout << "PFL: " << yytext << endl;
			REJECT;
		}

"_include"	{
			return IncludeToken;
		}

"_load"		{
			/* return LoadToken; */
			BEGIN(incl); /* expect name of include file...*/
		}

<incl>[ \t\"]*          /* eat the whitespace */

<incl>[^ \t\n\"\'\;]+ {     /* got the include file name */

			strcpy(filename, yytext);

	                BEGIN(quote);
	        }

<quote>[ \t\"\'\n]*\;	{
			BEGIN(INITIAL);
			switch_input( filename );
		}

<quote><<EOF>>	{

			cout << "Missing end quote from include/load operation" << endl;
			switch_input("");
			BEGIN(INITIAL);
		}

<<EOF>> 	{
			/* yywrap has been called and returned a non-zero value, indicating */
			/* that switch_input returned a zero i.e. had an EOF from the 	    */
			/* original input file - therefore treat as a Quit condition	    */

			cout << "EXIT" << endl;
			yyterminate();
	        }
	

"//"[^\n]*	{
			//	A comment
		}

"_command"	{
			return CommandToken;
		}

"_commit"	{
			return CommitToken;
		}

"_define"	{
			return DefineToken;
		}

"_exclude"	{
			return ExcludeToken;
		}

"_function"	{
			return FunctionToken;
		}

"_display"	{
			return DisplayToken;
		}

"_restore"	{
			return RestoreToken;
		}

"_extsel"	{
			return ExtSelToken;
		}

"_intsel"	{
			return IntSelToken;
		}

"_system"	{
			return SystemToken;
		}

"_type"		{
			return TypeToken;
		}

"_value"	{
			return ValueToken;
		}

"=="		{
			return SetToken;
		}

":"		{
			return ConsToken;
		}

"[]"	{
			result.set(Con,database->str_to_id(yytext));
			return Token;
		}

"(:)"		{
			result.set(Con,database->str_to_id(yytext));
			return Token;
		}

"++"		{
			return AppendToken;
		}

"(++)"		{
			result.set(Var,database->str_to_id(yytext));
			return Token;
		}

"--"		{
			return DifferenceToken;
		}

"(--)"		{
			result.set(Var,database->str_to_id(yytext));
			return Token;
		}

"\$"		{
			result.set(Var,database->str_to_id(yytext));
			return Token;
		}

"&"		{
			return AndToken;
		}

"(&)"		{
			result.set(Var,database->str_to_id(yytext));
			return Token;
		}

"#"		{
			return OrToken;
		}

"(#)"		{
			result.set(Var,database->str_to_id(yytext));
			return Token;
		}


"!"		{
			return IndexToken;
		}

"(!)"		{
			result.set(Var,database->str_to_id(yytext));
			return Token;
		}


"+"		{
			return PlusToken;
		}

"(+)"		{
			result.set(Pre,user_id(yytext));
			return Token;
		}

"-"		{
			return MinusToken;
		}

"(-)"		{
			result.set(Pre,user_id(yytext));
			return Token;
		}

"*"		{
			return MultiplyToken;
		}

"(*)"		{
			result.set(Pre,user_id(yytext));
			return Token;
		}

"div"		{
			return IDivideToken;
		}

"(div)"		{
			result.set(Pre,user_id(yytext));
			return Token;
		}

"/"		{
			return RDivideToken;
		}

"(/)"		{
			result.set(Pre,user_id(yytext));
			return Token;
		}

"%"		{
			return ModulusToken;
		}

"(%)"		{
			result.set(Pre,user_id(yytext));
			return Token;
		}

"?="		{
			return MatchToken;
		}

"(?=)"		{
			result.set(Pre,user_id(yytext));
			return Token;
		}

"="		{
			return EqualToken;
		}

"(=)"		{
			result.set(Pre,user_id(yytext));
			return Token;
		}

"!="		{
			return NotEqualToken;
		}

"(!=)"		{
			result.set(Pre,user_id(yytext));
			return Token;
		}

"<"		{
			return LesserToken;
		}

"(<)"		{
			result.set(Pre,user_id(yytext));
			return Token;
		}

">="		{
			return NotLesserToken;
		}

"(>=)"		{
			result.set(Pre,user_id(yytext));
			return Token;
		}

">"		{
			return GreaterToken;
		}

"(>)"		{
			result.set(Pre,user_id(yytext));
			return Token;
		}

"<="		{
			return NotGreaterToken;
		}

"(<=)"		{
			result.set(Pre,user_id(yytext));
			return Token;
		}

"<-"		{
			return LArrow;
		}

"->"		{
			return RArrow;
		}

"(->)"		{
			result.set(Con,database->str_to_id(yytext));
			return Token;
		}

".."		{
			return DotDot;
		}

","		{
			return Comma;
		}
"|"		{
			return Bar;
		}

"["		{
			return LSB;
		}

"]"		{
			return RSB;
		}

[0-9]+"."[0-9]+	{
			float	fres = atof(yytext);
			if (fres == int(fres))
				result.set(Int,int(fres));
			else	result.set(Real,fres);
			return Token;
		}

[0-9]+		{
			result.set(Int,atoi(yytext));
			return Token;
		}

"\/\\"		{
			result.set(Con,database->str_to_id(yytext));
			return Token;
		}

"->"		{
			result.set(Con,database->str_to_id(yytext));
			return Token;
		}

"type"[0-9]*	{
			int	i;
			sscanf(yytext,"%*c%*c%*c%*c%d",&i);
			result.set(TVar,i);
			return Token;
		}

[A-Z][A-Za-z0-9_\']*	{
			result.set(Con,database->str_to_id(yytext));
			return Token;
		}

"'\\n'"		{
			result.set(Chr,'\n');
			return(Token);
		}

\'[^\']\'	{
			result.set(Chr,yytext[1]);
			return Token;
		}

\"[^\"]*\"	{
			char	string[MaxString];

			sscanf(&yytext[1],"%[^\"]",string);
			result.set(Str,database->str_to_id(string));
			return Token;
		}

"all"[A-Z][A-Za-z0-9_]*	{
			result.set(Sel2,database->str_to_id(yytext));
			return Token;
			}

[a-z][A-Za-z0-9_]*	{
			int	i = user_id(yytext);

			if (i != -1)
				result.set(Pre,i);
			else
				result.set(Var,database->str_to_id(yytext));
			return Token;
		}

"|"[A-Za-z0-9_]*	{
			result.set(Sel1,database->str_to_id(yytext));
			return Token;
			}

";"	{
		return End;
	}

"("	{
		return LRB;
	}

")"	{
		return RRB;
	}

[ \t\n]	{
		//	Ignore anything else
	}

[^;]	{
		return WrongToken;
	}

%%
int	yywrap( void );
#include "switch.C"

