flash on 2009-12-29
@see http://ja.wikipedia.org/wiki/Interpreter_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3
♥0 |
Line 88 |
Modified 2009-12-29 22:36:01 |
MIT License
archived:2017-03-20 02:51:44
ActionScript3 source code
/**
* Copyright foo9 ( http://wonderfl.net/user/foo9 )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/rmXu
*/
package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
/**
* @see http://ja.wikipedia.org/wiki/Interpreter_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3
*/
public class InterpreterPatternSample2 extends Sprite
{
private static const EXPRESSION:String = "42 4 2 - +";
private var _parser:Parser;
private var _textField:TextField;
public function InterpreterPatternSample2():void
{
_parser = new Parser(EXPRESSION);
_textField = new TextField();
addChild(_textField);
_textField.autoSize = TextFieldAutoSize.LEFT;
_textField.text = "\'" + EXPRESSION + "\'" + " equals " + _parser.evaluate();
}
}
}
interface IExpression
{
function interpret(s:Vector.<Number>):void;
}
class NumberExpression implements IExpression
{
private var _number:Number;
public function NumberExpression(number:Number)
{
_number = number;
}
public function interpret(s:Vector.<Number>):void
{
s.push(_number);
}
}
class PlusExpression implements IExpression
{
public function PlusExpression()
{
}
public function interpret(s:Vector.<Number>):void
{
s.push(s.pop() + s.pop());
}
}
class MinusExpression implements IExpression
{
public function MinusExpression()
{
}
public function interpret(s:Vector.<Number>):void
{
s.push(-s.pop() + s.pop());
}
}
class Parser
{
private var _parseTree:Vector.<IExpression> = new Vector.<IExpression>();
public function Parser(s:String)
{
var arr:Array = s.split(" ");
for each (var token:String in arr)
{
switch(token)
{
case "+":
_parseTree.push(new PlusExpression());
break;
case "-":
_parseTree.push(new MinusExpression());
break;
default:
_parseTree.push(new NumberExpression(Number(token)));
}
}
}
public function evaluate():int
{
var _context:Vector.<Number> = new Vector.<Number>();
for each(var e:IExpression in _parseTree)
{
e.interpret(_context);
}
return _context.pop();
}
}