您的位置:首页 > 其它

前缀表达式转函数表达式

2016-01-21 20:51 239 查看

简介



算法非常简单。状态机模式,逐个扫描字符,将字符串转换成树,再将树转换回字符串。

复用性还可以,只是输出的代码很丑。要把转换出的代码拿到Eigenmath上运行,可能要写几个函数包装中缀运算符(plus,minus,pow……)。

源码

<meta charset='utf-8'>
<style type="text/css">
table, textarea {
width: 100%;
height: 100%;
}
</style>

<table>
<tr>
<td>
<textarea onkeydown='if(event.keyCode==13)enter(this.value, document.getElementById("o"))'>前缀表达式转函数表达式。在这里输入表达式,按回车,结果会出现在右边。21Jau2016</textarea>
</td>
<td>
<textarea id='o' disabled='disabled'></textarea>
</td>
</tr>
</table>

<script type="text/javascript">
function enter(r, o) {
var root='me';
function Node(m) {
this.ma = m;
this.v = [];
this.toString = function(){
var s = this.v.shift();
s += '(';
for (var i in this.v) {
if (i != 0) s += ',';
s += this.v[i].toString();
}
s += ')';
return s;
};
}

var node=new Node(root);
var s='';
r=r.split('');

for (var i in r) {
switch (r[i]) {
case '(':
var n = new Node(node);
node.v.push(n);
node = n;
break;
case ')':
if (s != '') {
node.v.push(s);
s = '';
}
node = node.ma;
break;
case '\n':
case '\t':
case ' ':
if (s != '') {
node.v.push(s);
s = '';
}
break;
default:
s = s + r[i];
}
}
node = node.v[0];

o.value = node.toString();
}
</script>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: