diff options
Diffstat (limited to 'dice-lang/src/bjc/dicelang/scl/StreamControlEngine.java')
| -rw-r--r-- | dice-lang/src/bjc/dicelang/scl/StreamControlEngine.java | 201 |
1 files changed, 115 insertions, 86 deletions
diff --git a/dice-lang/src/bjc/dicelang/scl/StreamControlEngine.java b/dice-lang/src/bjc/dicelang/scl/StreamControlEngine.java index 76133e7..ac9e880 100644 --- a/dice-lang/src/bjc/dicelang/scl/StreamControlEngine.java +++ b/dice-lang/src/bjc/dicelang/scl/StreamControlEngine.java @@ -1,5 +1,40 @@ package bjc.dicelang.scl; +import static bjc.dicelang.Errors.ErrorKey.EK_SCL_INVARG; +import static bjc.dicelang.Errors.ErrorKey.EK_SCL_INVTOKEN; +import static bjc.dicelang.Errors.ErrorKey.EK_SCL_MMQUOTE; +import static bjc.dicelang.Errors.ErrorKey.EK_SCL_SUNDERFLOW; +import static bjc.dicelang.Errors.ErrorKey.EK_SCL_UNWORD; +import static bjc.dicelang.scl.StreamControlEngine.Token.Type.ARRAY; +import static bjc.dicelang.scl.StreamControlEngine.Token.Type.BLIT; +import static bjc.dicelang.scl.StreamControlEngine.Token.Type.DELETESTREAM; +import static bjc.dicelang.scl.StreamControlEngine.Token.Type.DQUOTE; +import static bjc.dicelang.scl.StreamControlEngine.Token.Type.DROP; +import static bjc.dicelang.scl.StreamControlEngine.Token.Type.FLIT; +import static bjc.dicelang.scl.StreamControlEngine.Token.Type.ILIT; +import static bjc.dicelang.scl.StreamControlEngine.Token.Type.LEFTSTREAM; +import static bjc.dicelang.scl.StreamControlEngine.Token.Type.MAKEARRAY; +import static bjc.dicelang.scl.StreamControlEngine.Token.Type.MAKEEXEC; +import static bjc.dicelang.scl.StreamControlEngine.Token.Type.MAKEUNEXEC; +import static bjc.dicelang.scl.StreamControlEngine.Token.Type.MERGESTREAM; +import static bjc.dicelang.scl.StreamControlEngine.Token.Type.NDROP; +import static bjc.dicelang.scl.StreamControlEngine.Token.Type.NEWSTREAM; +import static bjc.dicelang.scl.StreamControlEngine.Token.Type.NIP; +import static bjc.dicelang.scl.StreamControlEngine.Token.Type.NNIP; +import static bjc.dicelang.scl.StreamControlEngine.Token.Type.OBRACE; +import static bjc.dicelang.scl.StreamControlEngine.Token.Type.OBRACKET; +import static bjc.dicelang.scl.StreamControlEngine.Token.Type.RIGHTSTREAM; +import static bjc.dicelang.scl.StreamControlEngine.Token.Type.SLIT; +import static bjc.dicelang.scl.StreamControlEngine.Token.Type.SQUOTE; +import static bjc.dicelang.scl.StreamControlEngine.Token.Type.STACKCOUNT; +import static bjc.dicelang.scl.StreamControlEngine.Token.Type.STACKEMPTY; +import static bjc.dicelang.scl.StreamControlEngine.Token.Type.SYMBOL; +import static bjc.dicelang.scl.StreamControlEngine.Token.Type.WORD; +import static bjc.dicelang.scl.StreamControlEngine.Token.Type.WORDS; + +import java.util.HashMap; +import java.util.Map; + import bjc.dicelang.Errors; import bjc.utils.esodata.SimpleStack; import bjc.utils.esodata.Stack; @@ -7,12 +42,6 @@ import bjc.utils.funcdata.FunctionalList; import bjc.utils.funcdata.IList; import bjc.utils.parserutils.TokenUtils; -import java.util.HashMap; -import java.util.Map; - -import static bjc.dicelang.Errors.ErrorKey.*; -import static bjc.dicelang.scl.StreamControlEngine.Token.Type.*; - /** * Runs a Stream Control Language (SCL) program. * @@ -80,64 +109,64 @@ public class StreamControlEngine { */ public IList<Token> tokenVals; - public Token(Type typ) { + public Token(final Type typ) { type = typ; } - public Token(Type typ, long iVal) { + public Token(final Type typ, final long iVal) { this(typ); intVal = iVal; } - public Token(Type typ, double dVal) { + public Token(final Type typ, final double dVal) { this(typ); floatVal = dVal; } - public Token(Type typ, boolean bVal) { + public Token(final Type typ, final boolean bVal) { this(typ); boolVal = bVal; } - public Token(Type typ, String sVal) { + public Token(final Type typ, final String sVal) { this(typ); stringVal = sVal; } - public Token(Type typ, Token tVal) { + public Token(final Type typ, final Token tVal) { this(typ); tokenVal = tVal; } - public Token(Type typ, Token.Type tVal) { + public Token(final Type typ, final Token.Type tVal) { this(typ, new Token(tVal)); } - public Token(Type typ, IList<Token> tVals) { + public Token(final Type typ, final IList<Token> tVals) { this(typ); tokenVals = tVals; } - public static Token tokenizeString(String token) { - if(litTokens.containsKey(token)) + public static Token tokenizeString(final String token) { + if (litTokens.containsKey(token)) return new Token(litTokens.get(token)); - else if(token.startsWith("\\")) + else if (token.startsWith("\\")) return new Token(SYMBOL, token.substring(1)); - else if(builtinWords.containsKey(token)) + else if (builtinWords.containsKey(token)) return new Token(WORD, builtinWords.get(token)); - else if(token.equals("true")) + else if (token.equals("true")) return new Token(BLIT, true); - else if(token.equals("false")) + else if (token.equals("false")) return new Token(BLIT, false); - else if(TokenUtils.isInt(token)) + else if (TokenUtils.isInt(token)) return new Token(ILIT, Long.parseLong(token)); - else if(TokenUtils.isDouble(token)) + else if (TokenUtils.isDouble(token)) return new Token(FLIT, Double.parseDouble(token)); else { Errors.inst.printError(EK_SCL_INVTOKEN, token); @@ -175,21 +204,21 @@ public class StreamControlEngine { } } - private StreamEngine eng; + private final StreamEngine eng; - private Stack<Token> curStack; + private final Stack<Token> curStack; @SuppressWarnings("unused") - private Map<String, Token> words; + private final Map<String, Token> words; /** * Create a new stream control engine. * - * @param eng + * @param engine * The engine to control. */ - public StreamControlEngine(StreamEngine eng) { - this.eng = eng; + public StreamControlEngine(final StreamEngine engine) { + eng = engine; words = new HashMap<>(); curStack = new SimpleStack<>(); @@ -203,26 +232,26 @@ public class StreamControlEngine { * * @return Whether the program executed successfully. */ - public boolean runProgram(String[] tokens) { - for(int i = 0; i < tokens.length; i++) { - String token = tokens[i]; - Token tok = Token.tokenizeString(token); + public boolean runProgram(final String[] tokens) { + for (int i = 0; i < tokens.length; i++) { + final String token = tokens[i]; + final Token tok = Token.tokenizeString(token); - if(tok == null) return false; + if (tok == null) return false; - switch(tok.type) { + switch (tok.type) { case SQUOTE: i = handleSingleQuote(i, tokens); - if(i == -1) return false; + if (i == -1) return false; break; case OBRACKET: i = handleDelim(i, tokens, "]"); - if(i == -1) return false; + if (i == -1) return false; break; case OBRACE: i = handleDelim(i, tokens, "}"); - if(i == -1) return false; - Token brak = curStack.pop(); + if (i == -1) return false; + final Token brak = curStack.pop(); curStack.push(new Token(ARRAY, brak.tokenVals)); break; case WORD: @@ -237,40 +266,40 @@ public class StreamControlEngine { return true; } - private boolean handleWord(Token tk) { + private boolean handleWord(final Token tk) { boolean succ = true; - switch(tk.tokenVal.type) { + switch (tk.tokenVal.type) { case NEWSTREAM: eng.newStream(); break; case LEFTSTREAM: succ = eng.leftStream(); - if(!succ) return false; + if (!succ) return false; break; case RIGHTSTREAM: succ = eng.rightStream(); - if(!succ) return false; + if (!succ) return false; break; case DELETESTREAM: succ = eng.deleteStream(); - if(!succ) return false; + if (!succ) return false; break; case MERGESTREAM: succ = eng.mergeStream(); - if(!succ) return false; + if (!succ) return false; break; case MAKEARRAY: succ = makeArray(); - if(!succ) return false; + if (!succ) return false; break; case MAKEEXEC: succ = toggleExec(true); - if(!succ) return false; + if (!succ) return false; break; case MAKEUNEXEC: succ = toggleExec(false); - if(!succ) return false; + if (!succ) return false; break; case STACKCOUNT: curStack.push(new Token(ILIT, curStack.size())); @@ -279,7 +308,7 @@ public class StreamControlEngine { curStack.push(new Token(BLIT, curStack.empty())); break; case DROP: - if(curStack.size() == 0) { + if (curStack.size() == 0) { Errors.inst.printError(EK_SCL_SUNDERFLOW, tk.tokenVal.type.toString()); return false; } @@ -287,10 +316,10 @@ public class StreamControlEngine { break; case NDROP: succ = handleNDrop(); - if(!succ) return false; + if (!succ) return false; break; case NIP: - if(curStack.size() < 2) { + if (curStack.size() < 2) { Errors.inst.printError(EK_SCL_SUNDERFLOW, tk.tokenVal.type.toString()); return false; } @@ -299,7 +328,7 @@ public class StreamControlEngine { break; case NNIP: succ = handleNNip(); - if(!succ) return false; + if (!succ) return false; break; default: Errors.inst.printError(EK_SCL_UNWORD, tk.tokenVal.type.toString()); @@ -310,16 +339,16 @@ public class StreamControlEngine { } private boolean handleNNip() { - Token num = curStack.pop(); + final Token num = curStack.pop(); - if(num.type != ILIT) { + if (num.type != ILIT) { Errors.inst.printError(EK_SCL_INVARG, num.type.toString()); return false; } - int n = (int) num.intVal; + final int n = (int) num.intVal; - if(curStack.size() < n) { + if (curStack.size() < n) { Errors.inst.printError(EK_SCL_SUNDERFLOW, NNIP.toString()); return false; } @@ -329,16 +358,16 @@ public class StreamControlEngine { } private boolean handleNDrop() { - Token num = curStack.pop(); + final Token num = curStack.pop(); - if(num.type != ILIT) { + if (num.type != ILIT) { Errors.inst.printError(EK_SCL_INVARG, num.type.toString()); return false; } - int n = (int) num.intVal; + final int n = (int) num.intVal; - if(curStack.size() < n) { + if (curStack.size() < n) { Errors.inst.printError(EK_SCL_SUNDERFLOW, NDROP.toString()); return false; } @@ -347,18 +376,18 @@ public class StreamControlEngine { return true; } - private boolean toggleExec(boolean exec) { - Token top = curStack.top(); + private boolean toggleExec(final boolean exec) { + final Token top = curStack.top(); - if(exec) { - if(top.type != ARRAY) { + if (exec) { + if (top.type != ARRAY) { Errors.inst.printError(EK_SCL_INVARG, top.toString()); return false; } top.type = WORDS; } else { - if(top.type != WORDS) { + if (top.type != WORDS) { Errors.inst.printError(EK_SCL_INVARG, top.toString()); return false; } @@ -370,15 +399,15 @@ public class StreamControlEngine { } private boolean makeArray() { - Token num = curStack.pop(); + final Token num = curStack.pop(); - if(num.type != ILIT) { + if (num.type != ILIT) { Errors.inst.printError(EK_SCL_INVARG, num.type.toString()); } - IList<Token> arr = new FunctionalList<>(); + final IList<Token> arr = new FunctionalList<>(); - for(int i = 0; i < num.intVal; i++) { + for (int i = 0; i < num.intVal; i++) { arr.add(curStack.pop()); } @@ -387,34 +416,34 @@ public class StreamControlEngine { return true; } - private int handleDelim(int i, String[] tokens, String delim) { - IList<Token> toks = new FunctionalList<>(); + private int handleDelim(final int i, final String[] tokens, final String delim) { + final IList<Token> toks = new FunctionalList<>(); int n = i + 1; - if(n >= tokens.length) { + if (n >= tokens.length) { Errors.inst.printError(EK_SCL_MMQUOTE); return -1; } String tok = tokens[n]; - while(!tok.equals(delim)) { - Token ntok = Token.tokenizeString(tok); + while (!tok.equals(delim)) { + final Token ntok = Token.tokenizeString(tok); - switch(ntok.type) { + switch (ntok.type) { case SQUOTE: n = handleSingleQuote(n, tokens); - if(n == -1) return -1; + if (n == -1) return -1; toks.add(curStack.pop()); break; case OBRACKET: n = handleDelim(n, tokens, "]"); - if(n == -1) return -1; + if (n == -1) return -1; toks.add(curStack.pop()); break; case OBRACE: - i = handleDelim(i, tokens, "}"); - if(i == -1) return -1; - Token brak = curStack.pop(); + n = handleDelim(i, tokens, "}"); + if (n == -1) return -1; + final Token brak = curStack.pop(); toks.add(new Token(ARRAY, brak.tokenVals)); break; default: @@ -424,7 +453,7 @@ public class StreamControlEngine { * Move to the next token */ n += 1; - if(n >= tokens.length) { + if (n >= tokens.length) { Errors.inst.printError(EK_SCL_MMQUOTE); return -1; } @@ -441,18 +470,18 @@ public class StreamControlEngine { return n; } - private int handleSingleQuote(int i, String[] tokens) { - StringBuilder sb = new StringBuilder(); + private int handleSingleQuote(final int i, final String[] tokens) { + final StringBuilder sb = new StringBuilder(); int n = i + 1; - if(n >= tokens.length) { + if (n >= tokens.length) { Errors.inst.printError(EK_SCL_MMQUOTE); return -1; } String tok = tokens[n]; - while(!tok.equals("'")) { - if(tok.matches("\\\\+'")) { + while (!tok.equals("'")) { + if (tok.matches("\\\\+'")) { /* * Handle escaped quotes. */ @@ -465,7 +494,7 @@ public class StreamControlEngine { * Move to the next token */ n += 1; - if(n >= tokens.length) { + if (n >= tokens.length) { Errors.inst.printError(EK_SCL_MMQUOTE); return -1; } |
