站内搜索: 请输入搜索关键词

当前页面: 开发资料首页Java 专题字串表达式解析求值(适合C语言语法的表达式)

字串表达式解析求值(适合C语言语法的表达式)

摘要: 字串表达式解析求值(适合C语言语法的表达式)
内容: 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;i { j=i;
c=cc[i];
ele[ei]=new element();
ele[ei].s="$";//以防止以后在没进行初始化的情况下对
//ele[i].s进行处理时所发生的异常情况。
if(i if(i>0) cii=cc[i-1];
else cii=c;
if(num(cc,i)==1)//若是数字则装填之。
{
do{j++;}
while(j='0'&&cc[j]<='9')||cc[j]=='.'));
ele[ei].n=Double.parseDouble(s.substring(i,j));
ele[ei++].sign='n';
}
else if(ch(cc,i)==1)
{
ele[ei].s=String.valueOf(cc[i]);
ele[ei++].sign='c';
j++;
}
else if(i { j=i;
do{j++;}
while(cc[j]!='(');
ele[ei].s=s.substring(i,j);
ele[ei++].sign='f';
}
else
{
System.out.println("i="+i+"该表达式有问题:"+s);
System.exit(1);
}
}//判断以s.charAt(i)为起点的元素之属性并装填之。
ele[0]=new element();
ele[0].s="";
//以下为加入元素之前后线索。
for(i=0;i {ele[i].u=i-1;ele[i].d=i+1;}
ele[0].u=ei-1;
ele[ei-1].d=0;
// show();
int find=0,findnn=0;
for(int nn=0;findnn!=nn-2;nn++)//求解表达式的值
{ find=0;
tidy_up(ele);
kkk=0;
for(i=f_mul(ele,ele[0].d);i>0;i=f_mul(ele,i))
{ //若下标p处为*或/,且前后为数,计算之,
//结果存于p处,改变p处属性为'n',并改变其前后线索。
ele[i].sign='n';find++;
ii=ele[i].u;jj=ele[i].d;
if(ele[i].s.equals("*")) ele[i].n=ele[ii].n*ele[jj].n;
else ele[i].n=ele[ii].n/ele[jj].n;
ele[i].s="$";//这样做有必要,从其它函数中可见原委
ii=ele[ii].u; ele[i].u=ii; ele[ii].d=i;
jj=ele[jj].d;ele[i].d=jj;ele[jj].u=i;
i=ele[i].d;
}
tidy_up(ele);
for(i=f_add(ele,ele[0].d);i>0;i=f_add(ele,i))
{
ele[i].sign='n';find++;
k=ele[i].u;j=ele[i].d;
if(ele[i].s.equals("+")) ele[i].n=ele[k].n+ele[j].n;
else ele[i].n=ele[k].n-ele[j].n;
ele[i].s="$";//这样做有必要,从其它函数中可见原委
k=ele[k].u; ele[i].u=k; ele[k].d=i;
j=ele[j].d; ele[i].d=j; ele[j].u=i;
i=ele[i].d;
}

tidy_up(ele);
for(i=f_fun(ele,ele[0].d);i>0;i=f_fun(ele,i))
{
// System.out.println(" is fun!i="+i);
find++;
j=ele[i].d;
ele[i].n=value_fun(ele,i);
while(!ele[j].s.equals(")"))
{
j=ele[j].d;
}
jj=ele[j].d;ele[i].d=jj;ele[jj].u=i;
ele[i].sign='n';
ele[i].s="$";
i=ele[i].d;
}
if(find!=0) findnn=nn;
} //求解表达式的值
//show();
//System.out.println(s+",d="+ele[ele[0].d].n);
return ele[ele[0].d].n;
}//doubleOf(s)
//下面为doubleOf()使用的各函数
static void tidy_up(element[] ele)
{
char c;
//System.out.print("\ntidy0: ");show();
for(i=ele[0].d;i>0;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<='9') return 1;
if(c=='-'&&cjj>='0'&&cjj<='9')
{
if(i==0||cii=='*'||cii=='/'||cii=='+'||cii=='-'||cii=='('||cii==',')
return 1;
}
return 0;
}
static int ch(char[] cc,int i)
{ c=cc[i];
if(c=='+'||c=='*'||c=='/'||c==','||c=='('||c==')')
return 1;
if(c=='-')
{
if(cjj>='0'&&cjj<='9'&&i!=0&&cii!='+'&&cii!='-'&&cii!='*'&&cii!='/'&&cii!=',')return 1;
if(cjj=='('||cjj=='-') return 1;/* deal with such: 2-(3+4)*/
if((cjj>='a'&&cjj<='z')||(cjj>='A'&&cjj<='Z')) /* deal with :2-pow(2,5)*/
return 1;
}
return 0;
}
static int fun(char[] cc,int i)
{
if((cc[i]>='a'&&cc[i]<='z')||cc[i]>='A'&&cc[i]<='Z')
{
return 1;
}
return 0;
}
static double value_fun(element[] ele ,int i)
{ int fi,j1,j2,j3;
for(fi=0;fi if(function[fi].equals(ele[i].s)) break;
if(fi==function.length)
{
System.out.println("不能识别的函数名!");
System.exit(0);
}
j1=ele[ele[i].d].d;
if(fi==0) return Math.abs(ele[j1].n);
else if(fi==1)
{
return Math.acos(ele[j1].n);
}
else if(fi==2)
{
return Math.asin(ele[j1].n);
}
else if(fi==3)
{
return Math.atan(ele[j1].n);
}
else if(fi==4)
{
j2=ele[ele[j1].d].d; return Math.atan2(ele[j1].n,ele[j2].n);
}
else if(fi==5)
{
return Math.ceil(ele[j1].n);
}
else if(fi==6)
{
return Math.cos(ele[j1].n);
}
else if(fi==7)
{
return Math.sin(ele[j1].n);
}
else if(fi==8)
{
return Math.abs(ele[j1].n);
}
else if(fi==9)
{
return Math.floor(ele[j1].n);
}
else if(fi==10)
{
return Math.exp(ele[j1].n);
}
else if(fi==11)
{
j2=ele[ele[j1].d].d; return Math.IEEEremainder(ele[j1].n,ele[j2].n);
}
else if(fi==12)
{
j2=ele[ele[j1].d].d;return Math.exp(ele[j1].n);
}
else if(fi==13)
{
return Math.log(ele[j1].n);
}
else if(fi==14)
{
return Math.log(ele[j1].n);
}
else if(fi==15)
{
j2=ele[ele[j1].d].d;
return Math.pow(ele[j1].n,ele[j2].n);
}
else if(fi==16)
{
return Math.sqrt(ele[j1].n);
}
else if(fi==17)
{
return Math.tan(ele[j1].n);
}
else return -1;
}//value_fun(element[] ele ,int i)
static int f_mul(element[] ele,int i)
{
for(;i>0;)
{
if(ele[i].s.equals("*")||ele[i].s.equals("/"))
{ ii=ele[i].u;jj=ele[i].d;
if(ele[ii].sign=='n'&&ele[jj].sign=='n')
{ return i;
}
}
i=ele[i].d;
}
return -1;
}
static int f_add(element ele[],int i)
{ for(;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
↑返回目录
前一篇: JDBC连接数据库经验集萃
后一篇: 删除java的注释信息