Разбор математических выражений

lion8

Есть ли у кого-нибудь интерпретатор математических выражений на Яве либо другом каком языке. В идеале хотелось бы следующее: передаем строку, содержащую математическое выражение, и значение независимой переменной, а на выходе получаем значение этого выражения.

voronetskaya

калькулятор есть на сях, на втором курсе писали
умеет разбирать любое синтаксически верное для си выражение, с переменными
пойдет?

stm7870384

Расшаривай, пожалуйста. Или еще как переправляй. И вопрос, к нему, конечно, никакой описашки не имеется?

voronetskaya

никакой описашки не имеется?
неа
причем там так код написан, что вообще песец
маладой был

voronetskaya

вот оно


#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <setjmp.h>
jmp_buf state;
char buff[256]="",bufbuf[2];
char *str;
char math[7][5]={"SIN(","COS(","TG(","ATG(","LN(","LG(","EXP("};
void stderror(char *text)
{printf("\nError : %s",text);fputs("\nPress ENTER",stderr);fgets(buff,2,stdin);longjmp(state,1);}
double log_(double x){if(x>0)return(log(x;else stderror("Illegal argument to logarithm");return(0);}
double log10_(double x){if(x>0)return(log10(x;else stderror("Illegal argument to logarithm");return(0);}
double (*fmath[7]double)={&sin,&cos,&tan,&atan,&log_,&log10_,&exp};
long inotb(long x){return(~x);}
long iandb(long x1,long x2){return(x1&x2);}
long ixorb(long x1,long x2){return(x1^x2);}
long iorb(long x1,long x2){return(x1|x2);}
long ishl(long x1,long x2){return(x1<<x2);}
long ishr(long x1,long x2){return(x1>>x2);}
long imod(long x1,long x2){if(x2==0)stderror("Divizion by ZERO");return(x1%x2);}
long (*OnlyInt2Int[6]long,long)={&iandb,&ixorb,&iorb,&ishl,&ishr,&imod};
long iless(long x1,long x2){return(x1<x2);}
long ileq(long x1,long x2){return(x1<=x2);}
long igrt(long x1,long x2){return(x1>x2);}
long igeq(long x1,long x2){return(x1>=x2);}
long iequ(long x1,long x2){return(x1==x2);}
long inequ(long x1,long x2){return(x1!=x2);}
long iorl(long x1,long x2){return(x1&&x2);}
long iandl(long x1,long x2){return(x1||x2);}
long (*IntDbl2Int[8]long,long)={&iless,&ileq,&igrt,&igeq,&iequ,&inequ,&iorl,&iandl};
long iaddu(long x){return(+x);}
long isubu(long x){return(-x);}
long (*AltInt2IntU[2]long)={&iaddu,&isubu};
long iaddb(long x1,long x2){return(x1+x2);}
long isubb(long x1,long x2){return(x1-x2);}
long idel(long x1,long x2){if(x2==0)stderror("Divizion by ZERO");return(x1/x2);}
long imul(long x1,long x2){return(x1*x2);}
long (*AltInt2Int[4]long,long)={&iaddb,&isubb,&idel,&imul};
long ippi(long *x){return(++(*x;}
long immi(long *x){return(--(*x;}
long ippp(long *x){return*x)++);}
long immp(long *x){return*x)--);}
long (*VarInt2Int[4]long *)={&ippi,&immi,&ippp,&immp};
long inotl(long x){return(!x);}
long imodass(long *x1,long x2){if(x2==0)stderror("Divizion by ZERO");return(*x1%=x2);}
long iandass(long *x1,long x2){return(*x1&=x2);}
long ixorass(long *x1,long x2){return(*x1^=x2);}
long iorass(long *x1,long x2){return(*x1|=x2);}
long ishlass(long *x1,long x2){return(*x1<<=x2);}
long ishrass(long *x1,long x2){return(*x1>>=x2);}
long (*AssOnlyInt[6]long *,long)={&imodass,&iandass,&ixorass,&iorass,&ishlass,&ishrass};
long iass (long *x1,long x2){return(*x1=x2);}
long imulass(long *x1,long x2){return(*x1*=x2);}
long idelass(long *x1,long x2){if(x2==0)stderror("Divizion by ZERO");return(*x1/=x2);}
long iaddass(long *x1,long x2){return(*x1+=x2);}
long isubass(long *x1,long x2){return(*x1-=x2);}
long (*AssAltInt[5]long *,long)={&iass,&imulass,&idelass,&iaddass,&isubass};
/*DOUBLE*//*DOUBLE*//*DOUBLE*//*DOUBLE*//*DOUBLE*//*DOUBLE*//*DOUBLE*//*DOUBLE*//*DOUBLE*/
long fless(double x1,double x2){return(x1<x2);}
long fleq(double x1,double x2){return(x1<=x2);}
long fgrt(double x1,double x2){return(x1>x2);}
long fgeq(double x1,double x2){return(x1>=x2);}
long fequ(double x1,double x2){return(x1==x2);}
long fnequ(double x1,double x2){return(x1!=x2);}
long forl(double x1,double x2){return(x1||x2);}
long fandl(double x1,double x2){return(x1&&x2);}
long (*Dbl2Int[8]double,double)={&fless,&fleq,&fgrt,&fgeq,&fequ,&fnequ,&forl,&fandl};
long fnotl(double x){return(!x);}
double faddu(double x){return(+x);}
double fsubu(double x){return(-x);}
double (*AltDbl2DblU[2]double)={&faddu,&fsubu};
double faddb(double x1,double x2){return(x1+x2);}
double fsubb(double x1,double x2){return(x1-x2);}
double fdel(double x1,double x2){if(x2==0.0)stderror("Divizion by ZERO");return(x1/x2);}
double fmul(double x1,double x2){return(x1*x2);}
double (*AltDbl2Dbl[4]double,double)={&faddb,&fsubb,&fdel,&fmul};
double fppi(double *x){return(++(*x;}
double fmmi(double *x){return(--(*x;}
double fppp(double *x){return*x)++);}
double fmmp(double *x){return*x)--);}
double (*VarDbl2Dbl[4]double *)={&fppi,&fmmi,&fppp,&fmmp};
double dass (double *x1,double x2){return(*x1=x2);}
double dmulass(double *x1,double x2){return(*x1*=x2);}
double ddelass(double *x1,double x2){if(x2==0)stderror("Divizion by ZERO");return(*x1/=x2);}
double daddass(double *x1,double x2){return(*x1+=x2);}
double dsubass(double *x1,double x2){return(*x1-=x2);}
double (*AssAltDbl[5]double *,double)={&dass,&dmulass,&ddelass,&daddass,&dsubass};
typedef enum fncz {sin_=0, cos_, tg_, atg_, ln_, lg_, exp_,
/*int->int*/ notb_=10,
andb_=20,xorb_,orb_,shl_,shr_,mod_,
/*dbl/int->int*/ less_=30,leq_,grt_,geq_,equ_,nequ_,orl_,andl_,
notl_=40,intt_,dblt_,tern_,
/*dbl/int->dbl/int*/
addu_=50,subu_,
addb_=60,subb_,del_,mul_,
ppi_=70,mmi_,ppp_,mmp_,
ass_=80,mulass_,delass_,addass_,subass_,
modass_=90,andass_,xorass_,orass_,shlass_,shrass_,
intn=100,dbln,var,intv,dblv} ftable;
typedef struct poliz{struct poliz *next;
char viz[11];
ftable type;
int vuin;
union uval{long int i;
double d;} val;}poliz;
poliz *P=NULL,bufer={NULL,},*Stack=NULL,popbuf,popbuf2;
int push(poliz x){poliz *tmp;if inttmp=(poliz*)malloc(sizeof(poliz{ *tmp=x;tmp->next=Stack;Stack=tmp;return(0);}else return(-1);}
poliz *pop(void)
{if (Stack!=NULL){poliz *tmp;popbuf=*Stack;tmp=Stack;Stack=Stack->next;free(tmp);return(&popbuf);}
else{fputs("Stack's empty!",stderr);exit(1);}return(NULL);}
void error(char *text)
{printf("\n%s at %d pozition",text,buff-str>0?buff-str+1:str-buff+1);fputs("\nPress ENTER",stderr);fgets(buff,2,stdin);longjmp(state,1);}
/*!PPUSH IS HERE!*/
poliz *ppush(poliz **p,poliz x){
if (*p==NULL){
*p=(poliz*)malloc(sizeof(poliz;
**p=x;
return(*p);}
ppush(&*p)->nextx);return(NULL);}
/*SHOW POLIZ IS HERE!*/
void pshow(poliz *p){printf("\nThe POLIZ:");while(p!=NULL){printf(" {%s}",p->viz);p=p->next;}}
int equs(char *s1,char *s2);
int isoper(char x){return(x=='-'||x=='+'||x=='/'||x=='*'||x=='|'||x=='^'||
x=='&'||x=='~'||x=='<'||x=='>'||x=='%'||x=='='||x=='!'||
x=='?'||x==':');}
int isuoper(char x){return(x=='-'||x=='+'||x=='~'||x=='!'||x=='?'||x==':');}
int isfmt(char x) {return(x=='.'||x=='e'||x=='E');}
int isdgt(char x) {return(x>='0'&&x<='9')

stm7870384

Спасибо.

freezer

причем там так код написан, что вообще песец

полностью с тобой согласен

stm7870384

Тут я спорить не буду. Но автору все равно спасибо.

rosali

В инете (был бы ) можно поискать нечто CUP = Compiler of Useful Parsers. Это YACC под Java. У него в samples вроде было то, что тебе надо. А еще в TCL есть expr, арифметику рюхает, а больше не знаю...
Оставить комментарий
Имя или ник:
Комментарий: