996
|
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 } |