简介
算法非常简单。状态机模式,逐个扫描字符,将字符串转换成树,再将树转换回字符串。
复用性还可以,只是输出的代码很丑。要把转换出的代码拿到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>