简介

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

复用性还可以,只是输出的代码很丑。要把转换出的代码拿到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>
posted on 2016-01-21 20:51  yanhh  阅读(294)  评论(0编辑  收藏  举报