diff options
| author | Benjamin J. Culkin <bjculkin@mix.wvu.edu> | 2019-07-27 00:17:09 -0300 |
|---|---|---|
| committer | Benjamin J. Culkin <bjculkin@mix.wvu.edu> | 2019-07-27 00:17:09 -0300 |
| commit | 818dea12c0c71650171b27994ce69de655d840c6 (patch) | |
| tree | d0919cfa37de178e6b1a80bee87dd280ba01aca4 /clformat/src/main/java/bjc/utils/ioutils/format | |
| parent | d317469f2063e7e57f97df9381d23a94bbc43bb0 (diff) | |
Progress on compilation
Made more progress on compilation. LiteralDirectives are now always
compiled.
Diffstat (limited to 'clformat/src/main/java/bjc/utils/ioutils/format')
7 files changed, 91 insertions, 30 deletions
diff --git a/clformat/src/main/java/bjc/utils/ioutils/format/CLParameters.java b/clformat/src/main/java/bjc/utils/ioutils/format/CLParameters.java index b89a706..3ed7e2e 100644 --- a/clformat/src/main/java/bjc/utils/ioutils/format/CLParameters.java +++ b/clformat/src/main/java/bjc/utils/ioutils/format/CLParameters.java @@ -1,15 +1,9 @@ package bjc.utils.ioutils.format; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import bjc.utils.esodata.AbbrevMap; -import bjc.utils.esodata.Tape; -import bjc.utils.parserutils.TokenUtils; +import java.util.*; + +import bjc.utils.esodata.*; +import bjc.utils.parserutils.*; /** * Represents a set of parameters to a CL format directive. diff --git a/clformat/src/main/java/bjc/utils/ioutils/format/CLValue.java b/clformat/src/main/java/bjc/utils/ioutils/format/CLValue.java index 50aa681..595eee5 100644 --- a/clformat/src/main/java/bjc/utils/ioutils/format/CLValue.java +++ b/clformat/src/main/java/bjc/utils/ioutils/format/CLValue.java @@ -40,6 +40,27 @@ public interface CLValue { * The parameters passed to the directive. */ public String getValue(Tape<Object> params); + + static String MSG_FMT = "Invalid %s \"%s\" to %s directive"; + + public default int asInt(Tape<Object> params, String paramName, String directive, int def) { + String param = getValue(params); + + if (!param.equals("")) { + try { + return Integer.parseInt(param); + } catch(NumberFormatException nfex) { + String msg = String.format(MSG_FMT, paramName, param, directive); + + IllegalArgumentException iaex = new IllegalArgumentException(msg); + iaex.initCause(nfex); + + throw iaex; + } + } + + return def; + } } class PercValue implements CLValue { diff --git a/clformat/src/main/java/bjc/utils/ioutils/format/directives/CompileContext.java b/clformat/src/main/java/bjc/utils/ioutils/format/directives/CompileContext.java index 34c3c0b..1cfae14 100644 --- a/clformat/src/main/java/bjc/utils/ioutils/format/directives/CompileContext.java +++ b/clformat/src/main/java/bjc/utils/ioutils/format/directives/CompileContext.java @@ -1,10 +1,35 @@ package bjc.utils.ioutils.format.directives; +import java.util.*; + +import bjc.utils.esodata.*; +import bjc.utils.ioutils.format.*; + /** * Encapsulates the state necessary for compiling Directives into Edicts. * * @author Ben Culkin */ public class CompileContext { + /** + * The stream of parsed directives. + */ + public Iterator<Decree> directives; + + /** + * The configured formatter instance we are using. + */ + public CLFormatter formatter; + + /** + * The decree that is currently being parsed. + */ + public Decree decr; + public CompileContext(Iterator<Decree> dirs, CLFormatter fmt, Decree dcr) { + directives = dirs; + formatter = fmt; + + decr = dcr; + } } diff --git a/clformat/src/main/java/bjc/utils/ioutils/format/directives/Edict.java b/clformat/src/main/java/bjc/utils/ioutils/format/directives/Edict.java index 50134b2..e037f06 100644 --- a/clformat/src/main/java/bjc/utils/ioutils/format/directives/Edict.java +++ b/clformat/src/main/java/bjc/utils/ioutils/format/directives/Edict.java @@ -1,5 +1,7 @@ package bjc.utils.ioutils.format.directives; +import java.io.*; + /** * * The compiled equivalent of {@link Directive}. @@ -14,5 +16,5 @@ public interface Edict { * @param formCTX * The state needed for this invocation. */ - public void format(FormatContext formCTX); + public void format(FormatContext formCTX) throws IOException; } diff --git a/clformat/src/main/java/bjc/utils/ioutils/format/directives/FormatContext.java b/clformat/src/main/java/bjc/utils/ioutils/format/directives/FormatContext.java index 95c984b..e17a655 100644 --- a/clformat/src/main/java/bjc/utils/ioutils/format/directives/FormatContext.java +++ b/clformat/src/main/java/bjc/utils/ioutils/format/directives/FormatContext.java @@ -20,4 +20,10 @@ public class FormatContext { * The parameters passed into invocation of formatting. */ public Tape<Object> items; + + public FormatContext(ReportWriter rw, Tape<Object> itms) { + writer = rw; + + items = itms; + } } diff --git a/clformat/src/main/java/bjc/utils/ioutils/format/directives/FormatParameters.java b/clformat/src/main/java/bjc/utils/ioutils/format/directives/FormatParameters.java index b641cde..7604c77 100644 --- a/clformat/src/main/java/bjc/utils/ioutils/format/directives/FormatParameters.java +++ b/clformat/src/main/java/bjc/utils/ioutils/format/directives/FormatParameters.java @@ -41,4 +41,12 @@ public class FormatParameters { public CLModifiers getMods() { return decr.modifiers; } + + public CompileContext toCompileCTX() { + return new CompileContext(dirIter, fmt, decr); + } + + public FormatContext toFormatCTX() { + return new FormatContext(rw, tParams); + } } diff --git a/clformat/src/main/java/bjc/utils/ioutils/format/directives/LiteralDirective.java b/clformat/src/main/java/bjc/utils/ioutils/format/directives/LiteralDirective.java index 7a53d90..be7dbd7 100644 --- a/clformat/src/main/java/bjc/utils/ioutils/format/directives/LiteralDirective.java +++ b/clformat/src/main/java/bjc/utils/ioutils/format/directives/LiteralDirective.java @@ -29,29 +29,24 @@ public class LiteralDirective implements Directive { @Override public void format(FormatParameters dirParams) throws IOException { - int nTimes = 1; - - CLParameters params = dirParams.getParams(); - - if (params.length() >= 1) { - params.mapIndices("count"); - - nTimes = params.getInt(dirParams.tParams, "count", "occurance count", directive, 1); - } - - for (int i = 0; i < nTimes; i++) { - dirParams.rw.write(lit); - } + Edict edt = compile(dirParams.toCompileCTX()); + edt.format(dirParams.toFormatCTX()); } @Override public Edict compile(CompileContext compCTX) { - int nTimes = 1; + CLValue nTimes = null; - LiteralEdict edict = new LiteralEdict(lit, nTimes); + CLParameters params = compCTX.decr.parameters; - return edict; + if (params.length() >= 1) { + params.mapIndices("count"); + + nTimes = params.resolveKey("count"); + } + + return new LiteralEdict(lit, nTimes); } } @@ -60,14 +55,24 @@ public class LiteralDirective implements Directive { */ class LiteralEdict implements Edict { private String lit; - private int nTimes; + private CLValue nTimes; - public LiteralEdict(String lit, int nTimes) { + public LiteralEdict(String lit, CLValue nTimes) { + this.lit = lit; + this.nTimes = nTimes; } @Override - public void format(FormatContext formCTX) { + public void format(FormatContext formCTX) throws IOException { + int num = 1; + + if (nTimes != null) { + num = nTimes.asInt(formCTX.items, "occurance count", "literal", 1); + } + for (int i = 0; i < num; i++) { + formCTX.writer.write(lit); + } } } |
