%{
// Rascal, the Advanced Scientific CALculator
// Copyright (C) 2001, Sebastian Ritterbusch (Rascal@Ritterbusch.de)
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
//

#include "symtab.h"
#include "y.tab.h"
#include <ctype.h>
#include <string.h>
#include "value.hpp"
#define YY_DECL int yylex( YYSTYPE *yylval ) 
%}
D		[0-9]
E		[DEde][-+]?{D}+
N		[A-Za-z]+{D}*
%%
[ \t]+					return PARSERwhite;
@					return PARSERat;
\n					return PARSERnewline;
{D}+					{ 
                                                (yylval)->val=new value(parseInteger(string(yytext)));
						return PARSERnumber;
					}
{D}*"."{D}+({E})?			|
{D}+"."{D}*({E})?			|
{D}+{E}					{ 
						(yylval)->val=new value(parseDouble(string(yytext)));
						return PARSERnumber;
					}
"*"					return PARSERtimes;	
"++"					return PARSERplusplus;
"+"					return PARSERplus;
"--"					return PARSERminusminus;
"-"					return PARSERminus;
"^"					return PARSERpower;
"/"					return PARSERdivide;
"("					return PARSERlparent;
")"					return PARSERrparent;
"["					return PARSERlbracket;
"]"					return PARSERrbracket;
";"[ \t]*				return PARSERsemicolon;
","					return PARSERcomma;
"%"					return PARSERmodulo;
"<"					return PARSERLT;
"<="					return PARSERLE;
">"					return PARSERGT;
">="					return PARSERGE;
"=="					return PARSEREQ;
"!="					return PARSERNEQ;
"&"					return PARSERAND;
"|"					return PARSEROR;
"~"					return PARSERNOT;
"!"					return PARSERFAC;
"?"					return PARSERquestionmark;
":"					return PARSERcolon;
"'"					return PARSERtranspose;
"\""[^\"\n]*"\""				{
					   yylval->val=new value(string(yytext+1).substr(0,strlen(yytext)-2));
					   return PARSERnumber; // somehow
					}
"for("[^;\n]*";"[^;\n]*";"[^;\n]*")"[^;\n]*(";")? { yylval->val=new value(string(yytext));
                                              return PARSERfor;
                                        }
"help"[^;\n]*				{     yylval->val=new value(string(yytext));
                                              return PARSERhelp;
                                        }

{N}"("{N}(","{N})*")"[ \t]*=[ \t]*.+";"[ \t]* {
					   int    i;
					   char   *name;
					   symrec *ptr;

					   for(i=0;i<strlen(yytext) && yytext[i]!='(';i++);
					   name=(char *)malloc(i+1);
					   for(i=0;i<strlen(yytext) && yytext[i]!='(';i++)
					      name[i]=yytext[i];
					   name[i]=0;
					   
					   if((ptr=getsym(name))!=(symrec *)0)
					   {
					      if(ptr->type==PARSERuserfunction)
					         free(ptr->ivalue.body);
					      ptr->type=PARSERuserfunction;
					   } else
					      ptr=putsym(name,PARSERuserfunction);
					   
					   ptr->ivalue.body=(char *)malloc(strlen(yytext)+1-i);
					   strcpy(ptr->ivalue.body,yytext+i);
					   
					   free(name);
					   
					   return PARSERfunctionDefinition;
					}
"="					return PARSERbecomes;
{N}	{
                  yylval->tptr=getsym(yytext);
                  if(yylval->tptr==0)
		  {
                     yylval->tptr=putsym(yytext,PARSERvariable);
                  }
		  return yylval->tptr->type;
		}
<<EOF>> {
           yyterminate();
        }
%%
int yywrap(void) { return 1 ;}
void * set_string_input(char *str)
{
   void * old=YY_CURRENT_BUFFER;
   yy_scan_string(str);
   BEGIN(INITIAL);
   return old;
}

void reset_input(void *b)
{
   yy_delete_buffer(YY_CURRENT_BUFFER);
   yy_switch_to_buffer((YY_BUFFER_STATE) b);
}


syntax highlighted by Code2HTML, v. 0.9.1