comparison 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
comparison
equal deleted inserted replaced
995:6883f5911eb7 996:859f9b4339e6
1 // This software is Public Domain.
2
3 import java.util.Stack;
4 import java.io.*;
5
6 public class Operator {
7
8 char operator;
9 Operator nextOperator, loopOperator = null;
10 boolean jump = false;
11
12 public static InputStream in;
13 public static OutputStream out;
14 public static PrintStream err;
15
16 public static Stack loopStack = new Stack();
17 public static GlyphoStack stack = new GlyphoStack();
18
19 public Operator(char operator){
20 this.operator = operator;
21 if (operator == '[') loopStack.push(this);
22 if (operator == ']') {
23 loopOperator = (Operator)(loopStack.pop());
24 loopOperator.setLoopOperator(this);
25 }
26 }
27
28 public void execute() {
29 execute(operator);
30 }
31
32 protected void execute(char op) {
33 switch(op) {
34 case 'n': break;
35 case 'i': try {
36 int b = in.read();
37 if (b < 0) stack.push(0);
38 else stack.push(b);
39 }catch (IOException e) { err.println(e); }
40 break;
41 case 'o': try {
42 out.write(stack.pop());
43 out.flush();
44 }catch (IOException e) { err.println(e); }
45 break;
46 case 'd': stack.push(stack.peek());
47 break;
48 case '\\':int v1 = stack.pop();
49 int v2 = stack.pop();
50 stack.push(v1);
51 stack.push(v2);
52 break;
53 case '>': stack.pushBottom(stack.pop());
54 break;
55 case '<': stack.push(stack.popBottom());
56 break;
57 case '!': stack.pop();
58 break;
59 case '1': stack.push(1);
60 break;
61 case '+': stack.push(stack.pop() + stack.pop());
62 break;
63 case '-': stack.push(-stack.pop());
64 break;
65 case '*': stack.push(stack.pop() * stack.pop());
66 break;
67 case 'e': execute(GlyphoInterpreter.getOperator(new int[] {stack.pop(), stack.pop(), stack.pop(), stack.pop()}));
68 break;
69 case '[': jump = (stack.peek() == 0);
70 break;
71 case ']': jump = (stack.peek() != 0);
72 break;
73 //Debug operator which dumps the stack:
74 case '&': if (! stack.empty()) err.println(stack.toString());
75 break;
76 }
77 }
78
79 public void setLoopOperator(Operator loopOperator) {
80 this.loopOperator = loopOperator;
81 }
82
83 public Operator next() {
84 return nextOperator;
85 }
86
87 public void setNext(Operator next){
88 nextOperator = next;
89 }
90
91 public Operator conditionalNext(){
92 if ((loopOperator != null) && (jump)) {
93 return loopOperator;
94 }else{
95 return nextOperator;
96 }
97 }
98
99 }