%{
// 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