b(a(c(2,3),1,2),c(a(c(3,7),1,2),4))a+,b-,c*,d/b(a(c(2,3),1,2),c(a(c(3,7),1,2),4))
= a(c(2,3),1,2) - c(a(c(3,7),1,2),4)
= c(2,3)+1+2 - a(c(3,7),1,2) * 4
= 2*3+1+2 - (c(3,7)+1+2) * 4
= 2*3+1+2 - (3*7+1+2) * 4这样?
= a(c(2,3),1,2) - c(a(c(3,7),1,2),4)
= c(2,3)+1+2 - a(c(3,7),1,2) * 4
= 2*3+1+2 - (c(3,7)+1+2) * 4
= 2*3+1+2 - (3*7+1+2) * 4这样?
function a(){//参数可以任意个
var len=arguments.length;
var returnValue=0;
for(var i=0;i<len;i++){
returnValue+=arguments[i];
}
return returnValue;
}
function b(i,j){
return i-j;
}
function c(i,j){
return i*j;
}
function d(i,j){
return i/j;
}
var value=b(a(c(2,3),1,2),c(a(c(3,7),1,2),4));
alert(value);
</script>
----------------------------
答:a('Text1','Text2','Text3')这个没问题,返回值是'Text1Text2Text3'
接着是b('Text1Text2Text3','Text4')
'Text1Text2Text3'-'Text4'这肯定要出错的我整个表达式是通过别的地方传过来的,把它当一串字符来处理的,如果照你的想法,那我应该怎样才能把"b(a(c(2,3),1,2),c(a(c(3,7),1,2),4))"这个双引号""去掉呢?
----------------------------
答:把我程序里的var value=b(a(c(2,3),1,2),c(a(c(3,7),1,2),4));
改成var str="b(a(c(2,3),1,2),c(a(c(3,7),1,2),4))";
var value=eval(str);
<head>
<meta http-equiv="content-type" content="text/html; charset=gb2312"/>
<link rel="stylesheet" href=".css"/>
<title>New Document</title>
<style type="text/css">
<!---->
</style>
<script type="text/javascript">
<!--var exp = "b(a(c(2,3),1,2),c(a(c(3,d(28,4)),1,2),4))";function Node(opcode,pNode){
this.opcode = opcode;
this.pNode = pNode;
this.childNodes = [];
}
var rn = new Node("a",null);
var stack = [];
stack.push(rn);
function parseExp(s){
s = s.replace(/\s/g,"");
while(s.length > 0){
if(/^(a|b|c|d)/.test(s)){
var pn = stack.getLast();
var n = new Node(s.charAt(0),stack.getLast());
if(pn) pn.childNodes.push(n);
s = s.substring(RegExp.lastIndex);
}
else if(/^\(/.test(s)){
stack.push(n);
s = s.substring(1);
}
else if(/^\)/.test(s)){
stack.pop();
s = s.substring(1);
}
else if(/^\d+/.test(s)){
var pn = stack.getLast();
var n = new Node(RegExp.lastMatch,pn);
pn.childNodes.push(n);
s = s.substring(RegExp.lastIndex);
}
else{
s = s.substring(1);
}
}
}
function cal(n){
var code = n.opcode;
var rslt = 0;
if(/^\d+$/.test(code)) return parseInt(code,10);
else{
switch(code){
case "a":
for(var i=0,l=n.childNodes.length;i<l;i++)
rslt += cal(n.childNodes[i]);
break;
case "b":
rslt = cal(n.childNodes[0]);
for(var i=1,l=n.childNodes.length;i<l;i++)
rslt -= cal(n.childNodes[i]);
break;
case "c":
rslt = 1;
for(var i=0,l=n.childNodes.length;i<l;i++)
rslt *= cal(n.childNodes[i]);
break;
case "d":
rslt = cal(n.childNodes[0]);
for(var i=1,l=n.childNodes.length;i<l;i++)
rslt /= cal(n.childNodes[i]);
break;
default: alert("错啦!code: " + code); break;
}
}
/*
var str = "opcode : " + n.opcode + "\n";
for(var i=0;i<n.childNodes.length;i++)
str += n.childNodes[i].opcode + ",";
str += "\n" + rslt;
alert(str);*/
return rslt;
}
Array.prototype.getLast=function(){
if(this.length == 0) return null;
return this[this.length-1];
}function wr(){
var a = arguments;
for(var i=0,l=a.length;i<l;i++)
document.write(a[i]);
}
parseExp(exp);
wr(exp,"<br>")
wr(cal(rn))
//-->
</script>
<body></body>
</html>