Mercurial > repo
diff interps/glypho/Operator.java @ 996:859f9b4339e6
<Gregor> tar xf egobot.tar.xz
author | HackBot |
---|---|
date | Sun, 09 Dec 2012 19:30:08 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/interps/glypho/Operator.java Sun Dec 09 19:30:08 2012 +0000 @@ -0,0 +1,99 @@ +// This software is Public Domain. + +import java.util.Stack; +import java.io.*; + +public class Operator { + + char operator; + Operator nextOperator, loopOperator = null; + boolean jump = false; + + public static InputStream in; + public static OutputStream out; + public static PrintStream err; + + public static Stack loopStack = new Stack(); + public static GlyphoStack stack = new GlyphoStack(); + + public Operator(char operator){ + this.operator = operator; + if (operator == '[') loopStack.push(this); + if (operator == ']') { + loopOperator = (Operator)(loopStack.pop()); + loopOperator.setLoopOperator(this); + } + } + + public void execute() { + execute(operator); + } + + protected void execute(char op) { + switch(op) { + case 'n': break; + case 'i': try { + int b = in.read(); + if (b < 0) stack.push(0); + else stack.push(b); + }catch (IOException e) { err.println(e); } + break; + case 'o': try { + out.write(stack.pop()); + out.flush(); + }catch (IOException e) { err.println(e); } + break; + case 'd': stack.push(stack.peek()); + break; + case '\\':int v1 = stack.pop(); + int v2 = stack.pop(); + stack.push(v1); + stack.push(v2); + break; + case '>': stack.pushBottom(stack.pop()); + break; + case '<': stack.push(stack.popBottom()); + break; + case '!': stack.pop(); + break; + case '1': stack.push(1); + break; + case '+': stack.push(stack.pop() + stack.pop()); + break; + case '-': stack.push(-stack.pop()); + break; + case '*': stack.push(stack.pop() * stack.pop()); + break; + case 'e': execute(GlyphoInterpreter.getOperator(new int[] {stack.pop(), stack.pop(), stack.pop(), stack.pop()})); + break; + case '[': jump = (stack.peek() == 0); + break; + case ']': jump = (stack.peek() != 0); + break; + //Debug operator which dumps the stack: + case '&': if (! stack.empty()) err.println(stack.toString()); + break; + } + } + + public void setLoopOperator(Operator loopOperator) { + this.loopOperator = loopOperator; + } + + public Operator next() { + return nextOperator; + } + + public void setNext(Operator next){ + nextOperator = next; + } + + public Operator conditionalNext(){ + if ((loopOperator != null) && (jump)) { + return loopOperator; + }else{ + return nextOperator; + } + } + +} \ No newline at end of file