view interps/glypho/Operator.java @ 5674:91d4a5b788c9

<tswett> echo \'[11,11,11,15,15,23,12],[5,5,5,3,53,45,16,26,00,20,15,16,22,25,45,91,32,11,15,27,06,01,11,01,47,22,30,13,43,21,11,13,29,61,65,17,19,12,28,17,11,01,23,20,16,20,81,18,32,25,58,22.,1985,10.301350435,1555466973690094680980000956080767,13720946704494913791885940266665466978579582015128512190078...\' > wisdom/code
author HackBot
date Wed, 24 Jun 2015 14:47:46 +0000
parents 859f9b4339e6
children
line wrap: on
line source

// 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;
    }
  }

}