summaryrefslogtreecommitdiff
path: root/base/src/bjc/dicelang/scl/StreamControlEngine.java
diff options
context:
space:
mode:
authorstudent <student@localhost>2018-02-12 12:01:53 -0500
committerstudent <student@localhost>2018-02-12 12:01:53 -0500
commitc25b68c6b24d86b7d1169ad4ec1e619d79a2b38d (patch)
treedc9579836d6856cf93ae7f682446a4e69a94e37f /base/src/bjc/dicelang/scl/StreamControlEngine.java
parentd7af27dab45dd6f82c27519e6b4fd2faa162f884 (diff)
Split SCLToken into subclasses.
Instead of one class with a lot of fields whose state varies based on an enum, we now have a hierarchy of classes that does the same in a more obvious manner.
Diffstat (limited to 'base/src/bjc/dicelang/scl/StreamControlEngine.java')
-rw-r--r--base/src/bjc/dicelang/scl/StreamControlEngine.java51
1 files changed, 26 insertions, 25 deletions
diff --git a/base/src/bjc/dicelang/scl/StreamControlEngine.java b/base/src/bjc/dicelang/scl/StreamControlEngine.java
index ec0f706..073f15e 100644
--- a/base/src/bjc/dicelang/scl/StreamControlEngine.java
+++ b/base/src/bjc/dicelang/scl/StreamControlEngine.java
@@ -12,6 +12,7 @@ import bjc.utils.parserutils.TokenUtils;
import static bjc.dicelang.Errors.ErrorKey.*;
import static bjc.dicelang.scl.SCLToken.Type.*;
+import static bjc.dicelang.scl.SCLToken.Word.*;
/*
* @TODO 10/08/17 Ben Culkin :SCLReorg
@@ -40,7 +41,7 @@ public class StreamControlEngine {
* Create a new stream control engine.
*
* @param engine
- * The engine to control.
+ * The engine to control.
*/
public StreamControlEngine(final StreamEngine engine) {
eng = engine;
@@ -53,7 +54,7 @@ public class StreamControlEngine {
* Run a SCL program.
*
* @param tokens
- * The program to run.
+ * The program to run.
*
* @return Whether the program executed successfully.
*/
@@ -61,7 +62,7 @@ public class StreamControlEngine {
for (int i = 0; i < tokens.length; i++) {
/* Tokenize each token. */
final String token = tokens[i];
- final SCLToken tok = SCLToken.tokenizeString(token);
+ final SCLToken tok = SCLToken.tokenizeString(token);
if (tok == null) {
System.out.printf("ERROR: Tokenization failed for '%s'\n", token);
@@ -91,12 +92,12 @@ public class StreamControlEngine {
return false;
}
final SCLToken brak = curStack.pop();
- curStack.push(new SCLToken(ARRAY, brak.tokenVals));
+ curStack.push(new WordsSCLToken(true, ((WordsSCLToken) brak).tokenVals));
break;
case WORD:
/* Handle words. */
- if(!handleWord(tok)) {
+ if (!handleWord((WordSCLToken) tok)) {
System.out.printf("WARNING: Execution of word '%s' failed\n", tok);
}
break;
@@ -110,16 +111,14 @@ public class StreamControlEngine {
return true;
}
- private boolean handleWord(final SCLToken tk) {
+ private boolean handleWord(final WordSCLToken tk) {
boolean succ = true;
/* Handle each type of word. */
- /*
- * @NOTE
- * This should probably use something other than a switch
- * statement.
+ /*
+ * @NOTE This should probably use something other than a switch statement.
*/
- switch (tk.tokenVal.type) {
+ switch (tk.wordVal) {
case NEWSTREAM:
eng.newStream();
break;
@@ -166,14 +165,14 @@ public class StreamControlEngine {
}
break;
case STACKCOUNT:
- curStack.push(new SCLToken(ILIT, curStack.size()));
+ curStack.push(new IntSCLToken(curStack.size()));
break;
case STACKEMPTY:
- curStack.push(new SCLToken(BLIT, curStack.empty()));
+ curStack.push(new BooleanSCLToken(curStack.empty()));
break;
case DROP:
if (curStack.size() == 0) {
- Errors.inst.printError(EK_SCL_SUNDERFLOW, tk.tokenVal.type.toString());
+ Errors.inst.printError(EK_SCL_SUNDERFLOW, tk.toString());
return false;
}
curStack.drop();
@@ -186,7 +185,7 @@ public class StreamControlEngine {
break;
case NIP:
if (curStack.size() < 2) {
- Errors.inst.printError(EK_SCL_SUNDERFLOW, tk.tokenVal.type.toString());
+ Errors.inst.printError(EK_SCL_SUNDERFLOW, tk.toString());
return false;
}
curStack.nip();
@@ -198,7 +197,7 @@ public class StreamControlEngine {
}
break;
default:
- Errors.inst.printError(EK_SCL_UNWORD, tk.tokenVal.type.toString());
+ Errors.inst.printError(EK_SCL_UNWORD, tk.toString());
return false;
}
@@ -214,7 +213,7 @@ public class StreamControlEngine {
return false;
}
- final int n = (int) num.intVal;
+ final int n = (int) ((IntSCLToken) num).intVal;
if (curStack.size() < n) {
Errors.inst.printError(EK_SCL_SUNDERFLOW, NNIP.toString());
@@ -234,7 +233,7 @@ public class StreamControlEngine {
return false;
}
- final int n = (int) num.intVal;
+ final int n = (int) ((IntSCLToken) num).intVal;
if (curStack.size() < n) {
Errors.inst.printError(EK_SCL_SUNDERFLOW, NDROP.toString());
@@ -278,11 +277,11 @@ public class StreamControlEngine {
final IList<SCLToken> arr = new FunctionalList<>();
- for (int i = 0; i < num.intVal; i++) {
+ for (int i = 0; i < ((IntSCLToken) num).intVal; i++) {
arr.add(curStack.pop());
}
- curStack.push(new SCLToken(ARRAY, arr));
+ curStack.push(new WordsSCLToken(true, arr));
return true;
}
@@ -324,7 +323,7 @@ public class StreamControlEngine {
return -1;
}
final SCLToken brak = curStack.pop();
- toks.add(new SCLToken(ARRAY, brak.tokenVals));
+ toks.add(new WordsSCLToken(true, ((WordsSCLToken) brak).tokenVals));
break;
default:
toks.add(ntok);
@@ -344,10 +343,10 @@ public class StreamControlEngine {
/* Skip the closing bracket */
n += 1;
- /* @NOTE
- * Instead of being hardcoded, this should be a parameter.
+ /*
+ * @NOTE Instead of being hardcoded, this should be a parameter.
*/
- curStack.push(new SCLToken(WORDS, toks));
+ curStack.push(new WordsSCLToken(false, toks));
return n;
}
@@ -389,7 +388,9 @@ public class StreamControlEngine {
*/
n += 1;
- curStack.push(new SCLToken(SLIT, TokenUtils.descapeString(sb.toString())));
+ String strang = TokenUtils.descapeString(sb.toString());
+
+ curStack.push(new StringSCLToken(false, strang));
return n;
}