戦うパーサ

戦闘力表を元に戦って勝ったほうが結合するように書いてみました。

<script>
// 式
function Exp(l,op,r){this.l=l;this.op=op;this.r=r}
Exp.prototype.toString = function() {
	return "["+this.l+",\""+this.op+"\","+this.r+"]"
}
// 戦闘力表
var powers = {}
// 読み込み処理
function read(str) {
	var arr = str.split(/\s+/) // 文字列を配列にする
	// 戦闘処理
	function battle(power) {
		var result = arr.shift()// とりあえずの結果を取得
		while (powers[arr[0]] > power) {// きごうの力が強ければ勝ち抜く
			var name = arr.shift()// 名前取出し
			var nextpower = powers[name] // 次の戦いで使う力取得
			var nextresult = battle(nextpower) // 次の戦いを行う
			result = new Exp(result, name, nextresult)// 式作成
		}
		return result
	}
	return battle(0)// 力0で戦闘開始
}
// 戦闘力登録
powers["+"] = 10
powers["*"] = 20
alert(read("1 + 2 * 3 + 2 * 3"))// 読み込み
</script>
戦闘結果<br/>
[[1,"+",[2,"*",3]],"+",[2,"*",3]]