Mercurial > repo
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 } |