字串表达式解析求值(适合C语言语法的表达式)
浏览:50日期:2023-02-07
内容: package x9;//调用示范:double d=value.doubleOf('pow(22,3)-sqrt(101)*100');public class value{ static int i,j,ii,jj,k,kk,ei,kkk; static char c,cii,cjj; static char[] cc=new char[200]; static String[] function=new String[50]; static String s; static class element { int u,d;//u,d即up,down,分别指上一个和下一个元素在element[]中的下标。 double n;//若该元素是数字,则放入n中。 char sign;//sign:存放该元素属性。 String s;//当元素为单字符或函数名时,存入。 element() {sign='$';} } static element[] ele=new element[200]; public static void fun() { function[0]='abs';function[1]='acos'; function[2]='asin';function[3]='atan'; function[4]='atan2';function[5]='ceil'; function[6]='cos';function[7]='sin'; function[8]='abs';function[9]='floor'; function[10]='exp';function[11]='fmod';//Math.IEEEremainder(); function[12]='exp';function[13]='log'; function[14]='log';function[15]='pow'; function[16]='sqrt';function[17]='tan'; } public static double doubleOf(String s1) { fun(); s=s1;//reserve cc=s.toCharArray(); ei=1; for(i=0;i0;i=ele[i].d ) { if(ele[i].s.equals('-')) { j=ele[i].d;jj=ele[j].d; k=ele[i].u; if(ele[k].s.equals('(')&&ele[j].sign=='n'&&ele[jj].s.equals(')')) { ele[j].n*=-1;ele[k].d=j;ele[j].u=k;//.将(,-, 2,)变为(,-2,) }//将-2.0,*,-,16.0,变为-2.0,*,-16.0, 这里的逗号用以区分开各个元素。 else if(ele[k].s.equals('*')&&ele[j].sign=='n') { ele[j].n*=-1; ele[j].u=k;ele[k].d=j; } } } for (i=ele[0].d;i>0;i=ele[i].d )//去掉形如...(2.2)...之类的多余括号。 { if(ele[i].sign=='n') { k=ele[i].u;kk=ele[k].u;j=ele[i].d; if(ele[kk].sign!='f'&&ele[k].s.equals('(')&&ele[j].s.equals(')')) { jj=ele[j].d; ele[i].u=kk;ele[kk].d=i; ele[i].d=jj;ele[jj].u=i; } } }//形如...-(3)...之类的,去掉括号后还得决定-号的属性//若是形如...+-(3)..此-号则变为数的一部分, for(i=ele[0].d;i>0;i=ele[i].d ) { if(ele[i].s.equals('-')) { j=ele[i].d; if(ele[j].sign=='n') { k=ele[i].u; c=ele[k].s.charAt(0); if(c=='+'||c=='-'||c=='*'||c=='/'||c=='(') { ele[j].n*=-1; ele[j].u=k;ele[k].d=j; i=ele[i].d; } } } }//System.out.print('ntidy1: ');show(); }//end tidy_up() static void show() { int i; System.out.print('n'+s+':nstruct:'); for(i=ele[0].d;i>0;) { if(ele[i].sign=='c'||ele[i].sign=='f') System.out.print(ele[i].s+','); else if(ele[i].sign=='n') System.out.print(ele[i].n+','); else System.out.println('?'); i=ele[i].d; } System.out.print('nsign :'); for(i=ele[0].d;i>0; i=ele[i].d) { System.out.print(ele[i].sign+', '); } for(i=ele[0].d;;i=ele[i].d) { System.out.print(','+i); if(i==0) break; } }// void show() static int num(char[] cc,int i) { c=cc[i]; if(c>='0'&&c='0'&&cjj='0'&&cjj='a'&&cjj='A'&&cjj='a'&&cc[i]='A'&&cc[i]0;) { if(ele[i].s.equals('+')||ele[i].s.equals('-')) { k=ele[i].u;j=ele[i].d; if(ele[k].sign=='n'&&ele[j].sign=='n') { kk=ele[k].u;jj=ele[j].d; if(!ele[kk].s.equals('*')&&!ele[kk].s.equals('/')) if(!ele[jj].s.equals('*')&&!ele[jj].s.equals('/')) { return i; } } } i=ele[i].d; } return -1; } static int f_fun(element ele[],int i)//查找可立即求值的函数 { char sign; for(;i>0;) { if(ele[i].sign=='f') { j=ele[i].d; do { j=ele[j].d;sign=ele[j].sign; } while(sign=='n'||(sign=='c'&&ele[j].s.equals(','))); if(sign=='c'&&ele[j].s.equals(')')) {return i;} } i=ele[i].d; } return -1; }}// value Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd
上一条:改写的基于SWING的日期选择控件下一条:J2SE发展演变史
相关文章: