diff options
Diffstat (limited to 'dice-lang/src/bjc/dicelang/scl')
| -rw-r--r-- | dice-lang/src/bjc/dicelang/scl/StreamControlEngine.java | 201 | ||||
| -rw-r--r-- | dice-lang/src/bjc/dicelang/scl/StreamEngine.java | 68 |
2 files changed, 149 insertions, 120 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; } diff --git a/dice-lang/src/bjc/dicelang/scl/StreamEngine.java b/dice-lang/src/bjc/dicelang/scl/StreamEngine.java index c79d054..4717eaa 100644 --- a/dice-lang/src/bjc/dicelang/scl/StreamEngine.java +++ b/dice-lang/src/bjc/dicelang/scl/StreamEngine.java @@ -1,5 +1,9 @@ package bjc.dicelang.scl; +import static bjc.dicelang.Errors.ErrorKey.EK_STRM_INVCOM; +import static bjc.dicelang.Errors.ErrorKey.EK_STRM_LAST; +import static bjc.dicelang.Errors.ErrorKey.EK_STRM_NONEX; + import bjc.dicelang.DiceLangEngine; import bjc.dicelang.Errors; import bjc.utils.esodata.SingleTape; @@ -9,10 +13,6 @@ import bjc.utils.funcdata.FunctionalList; import bjc.utils.funcdata.IList; import bjc.utils.funcutils.ListUtils; -import static bjc.dicelang.Errors.ErrorKey.EK_STRM_INVCOM; -import static bjc.dicelang.Errors.ErrorKey.EK_STRM_LAST; -import static bjc.dicelang.Errors.ErrorKey.EK_STRM_NONEX; - /** * Implements multiple interleaved parse streams, as well as a command language * for the streams. @@ -42,7 +42,7 @@ public class StreamEngine { /* * Handler for SCL programs */ - private StreamControlEngine scleng; + private final StreamControlEngine scleng; /** * Create a new stream engine. @@ -50,7 +50,7 @@ public class StreamEngine { * @param engine * The dice engine we're attached to. */ - public StreamEngine(DiceLangEngine engine) { + public StreamEngine(final DiceLangEngine engine) { eng = engine; savedStreams = new TapeLibrary<>(); @@ -81,7 +81,7 @@ public class StreamEngine { * * @return Whether or not the streams were successfully processed. */ - public boolean doStreams(String[] toks, IList<String> dest) { + public boolean doStreams(final String[] toks, final IList<String> dest) { /* * Initialize per-run state. */ @@ -95,18 +95,18 @@ public class StreamEngine { /* * Process each token. */ - for(String tk : toks) { + for (final String tk : toks) { /* * Process stream commands. */ - if(tk.startsWith("{@S") && !quoteMode) { - if(tk.equals("{@SQ}")) { + if (tk.startsWith("{@S") && !quoteMode) { + if (tk.equals("{@SQ}")) { quoteMode = true; - } else if(!processCommand(tk)) return false; + } else if (!processCommand(tk)) return false; } else { - if(tk.equals("{@SU}")) { + if (tk.equals("{@SU}")) { quoteMode = false; - } else if(tk.startsWith("\\") && tk.endsWith("{@SU}")) { + } else if (tk.startsWith("\\") && tk.endsWith("{@SU}")) { currStream.add(tk.substring(1)); } else { currStream.add(tk); @@ -114,7 +114,7 @@ public class StreamEngine { } } - for(String tk : currStream) { + for (final String tk : currStream) { dest.add(tk); } @@ -134,7 +134,7 @@ public class StreamEngine { * @return Whether or not the move was successful. */ public boolean rightStream() { - if(!streams.right()) { + if (!streams.right()) { Errors.inst.printError(EK_STRM_NONEX); return false; } @@ -149,7 +149,7 @@ public class StreamEngine { * @return Whether or not the move was successful. */ public boolean leftStream() { - if(!streams.left()) { + if (!streams.left()) { Errors.inst.printError(EK_STRM_NONEX); return false; } @@ -164,14 +164,14 @@ public class StreamEngine { * @return Whether or not the delete succeeded. */ public boolean deleteStream() { - if(streams.size() == 1) { + if (streams.size() == 1) { Errors.inst.printError(EK_STRM_LAST); return false; - } else { - streams.remove(); - currStream = streams.item(); } + streams.remove(); + currStream = streams.item(); + return true; } @@ -181,22 +181,22 @@ public class StreamEngine { * @return Whether or not the merge succeded. */ public boolean mergeStream() { - if(streams.size() == 1) { + if (streams.size() == 1) { Errors.inst.printError(EK_STRM_LAST); return false; - } else { - IList<String> stringLit = streams.remove(); - currStream = streams.item(); - currStream.add(ListUtils.collapseTokens(stringLit, " ")); } + final IList<String> stringLit = streams.remove(); + currStream = streams.item(); + currStream.add(ListUtils.collapseTokens(stringLit, " ")); + return true; } - private boolean processCommand(String tk) { + private boolean processCommand(final String tk) { char[] comms = null; - if(tk.length() > 5) { + if (tk.length() > 5) { comms = tk.substring(3, tk.length() - 1).toCharArray(); } else { comms = new char[1]; @@ -205,30 +205,30 @@ public class StreamEngine { boolean succ; - for(char comm : comms) { - switch(comm) { + for (final char comm : comms) { + switch (comm) { case '+': newStream(); break; case '>': succ = rightStream(); - if(!succ) return false; + if (!succ) return false; break; case '<': succ = leftStream(); - if(!succ) return false; + if (!succ) return false; break; case '-': succ = deleteStream(); - if(!succ) return false; + if (!succ) return false; break; case 'M': succ = mergeStream(); - if(!succ) return false; + if (!succ) return false; break; case 'L': succ = scleng.runProgram(currStream.toArray(new String[0])); - if(!succ) return false; + if (!succ) return false; break; default: Errors.inst.printError(EK_STRM_INVCOM, tk); |
