From 36e0911c6ec27707a74f0b90b1052a16374243ea Mon Sep 17 00:00:00 2001 From: bjculkin Date: Wed, 1 Mar 2017 10:13:41 -0500 Subject: Package reorganization --- dice-lang/src/bjc/dicelang/StreamEngine.java | 118 +++++++++++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 dice-lang/src/bjc/dicelang/StreamEngine.java (limited to 'dice-lang/src/bjc/dicelang/StreamEngine.java') 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> streams; + private IList 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 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 stringLit = streams.remove(); + currStream = streams.item(); + currStream.add(ListUtils.collapseTokens(stringLit, " ")); + } + break; + default: + Errors.inst.printError(EK_STRM_INVCOM, tk); + return false; + } + } + + return true; + } +} -- cgit v1.2.3