%{ // 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 #include #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;itype==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; } <> { 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); }