diff options
| author | bjculkin <bjculkin@WIT-136XG42.wvu-ad.wvu.edu> | 2017-03-01 10:13:41 -0500 |
|---|---|---|
| committer | bjculkin <bjculkin@WIT-136XG42.wvu-ad.wvu.edu> | 2017-03-01 10:13:41 -0500 |
| commit | 36e0911c6ec27707a74f0b90b1052a16374243ea (patch) | |
| tree | 08ca7723b0c0a6a7f3ce1830c59e5211e46168b8 /dice-lang/src/bjc/dicelang/StreamEngine.java | |
| parent | 6ed83507953322c35a456d64d89f8f4f9cb0a6a1 (diff) | |
Package reorganization
Diffstat (limited to 'dice-lang/src/bjc/dicelang/StreamEngine.java')
| -rw-r--r-- | dice-lang/src/bjc/dicelang/StreamEngine.java | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/dice-lang/src/bjc/dicelang/StreamEngine.java b/dice-lang/src/bjc/dicelang/StreamEngine.java new file mode 100644 index 0000000..2971392 --- /dev/null +++ b/dice-lang/src/bjc/dicelang/StreamEngine.java @@ -0,0 +1,118 @@ +package bjc.dicelang; + +import bjc.utils.funcdata.FunctionalList; +import bjc.utils.funcdata.IList; +import bjc.utils.funcutils.ListUtils; + +import static bjc.dicelang.Errors.ErrorKey.*; + +import bjc.utils.esodata.SingleTape; +import bjc.utils.esodata.Tape; + +public class StreamEngine { + private DiceLangEngine eng; + + private Tape<IList<String>> streams; + private IList<String> currStream; + + public StreamEngine(DiceLangEngine engine) { + eng = engine; + } + + private void init() { + streams = new SingleTape<>(); + + currStream = new FunctionalList<>(); + streams.insertBefore(currStream); + } + + public boolean doStreams(String[] toks, IList<String> dest) { + init(); + + boolean quoteMode = false; + + for(String tk : toks) { + if(tk.startsWith("{@S") && !quoteMode) { + if(tk.equals("{@SQ}")) { + quoteMode = true; + } else if(!processCommand(tk)) { + return false; + } + // Command ran correctly, continue + } else { + if(tk.equals("{@SU}")) { + quoteMode = false; + } else if(tk.startsWith("\\") && tk.endsWith("{@SU}")) { + currStream.add(tk.substring(1)); + } else { + currStream.add(tk); + } + } + } + + for(String tk : currStream) { + dest.add(tk); + } + + return true; + } + + private boolean processCommand(String tk) { + char[] comms = null; + + if(tk.length() > 5) { + comms = tk.substring(3, tk.length() - 1).toCharArray(); + } else { + comms = new char[1]; + comms[0] = tk.charAt(3); + } + + for(char comm : comms) { + switch(comm) { + case '+': + streams.insertAfter(new FunctionalList<>()); + break; + case '>': + if(!streams.right()) { + Errors.inst.printError(EK_STRM_NONEX); + return false; + } + + currStream = streams.item(); + break; + case '<': + if(!streams.left()) { + Errors.inst.printError(EK_STRM_NONEX); + return false; + } + + currStream = streams.item(); + break; + case '-': + if(streams.size() == 1) { + Errors.inst.printError(EK_STRM_LAST); + return false; + } else { + streams.remove(); + currStream = streams.item(); + } + break; + case 'S': + 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, " ")); + } + break; + default: + Errors.inst.printError(EK_STRM_INVCOM, tk); + return false; + } + } + + return true; + } +} |
