top down precedence operator parser tournament version

by h_sakurai
top down precedence operator parser tournament version
♥0 | Line 39 | Modified 2010-06-13 01:52:49 | MIT License
play

ActionScript3 source code

/**
 * Copyright h_sakurai ( http://wonderfl.net/user/h_sakurai )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/cK2B
 */

// top down precedence operator parser tournament version
package {
    import flash.display.Sprite;
    import flash.text.*;
    public class FlashTest extends Sprite {
    		private var tf:TextField;
        public function FlashTest() {
            tf = new TextField();
            addChild(tf);
            var aloha:Object = read("1 + 2 * 3");
            tf.text = ""+aloha;   
        }
    }
}

// 愛の結合
class Aloha {
	public var guy:String;// 
	public var l:Object;// 左の人
	public var r:Object;// 右の人

	// コンストラクタ
	public function Aloha(guy:String,l:Object,r:Object) {
		this.guy = guy;
		this.l = l;
		this.r = r;
	}
	// 文字列取得
	public function toString():String {
		return guy+"("+l+","+r+")";
	}
}

// 読み込み
function read(str:String):Object {
	// 文字列から人の列を作ります。
	var guys:Array = str.split(/\s+/)
	// 戦う人の力の表です
	var powers:Object = {"+":10,"-":10,"*":20,"/":20};

	// トーナメントで戦います
	// @param p:int 場の力です。
	function tournament(p:int):Object {
		// 1人でまずチームを作ります。
		var team:Object = guys.shift();
		// 次の人は場の力と戦います。
		while(powers[guys[0]] > p) {
			// 勝ったらその人を取り出します。
			var guy:String = guys.shift();
			// 勝った人主催でトーナメントを行い、新しいチームを作ります。
			// 新しいチームはAloha(愛)の結合で形作られます。
			team = new Aloha(guy, team, tournament(powers[guy]));
		}
		// 勝ち残ったチームが返ります。		
		return team;
	}
	// 力0でトーナメントを開催し結果を返します。
	return tournament(0);
}