diff options
Diffstat (limited to 'dice-lang/src')
| -rw-r--r-- | dice-lang/src/bjc/dicelang/CLIArgsParser.java | 140 | ||||
| -rw-r--r-- | dice-lang/src/bjc/dicelang/DiceLangConsole.java | 3 | ||||
| -rw-r--r-- | dice-lang/src/bjc/dicelang/Errors.java | 33 |
3 files changed, 174 insertions, 2 deletions
diff --git a/dice-lang/src/bjc/dicelang/CLIArgsParser.java b/dice-lang/src/bjc/dicelang/CLIArgsParser.java index b8e0baf..02762cb 100644 --- a/dice-lang/src/bjc/dicelang/CLIArgsParser.java +++ b/dice-lang/src/bjc/dicelang/CLIArgsParser.java @@ -1,5 +1,145 @@ package bjc.dicelang; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Arrays; +import java.util.Scanner; + +import static bjc.dicelang.Errors.ErrorKey.*; + public class CLIArgsParser { + public static boolean parseArgs(String[] args, DiceLangEngine eng) { + if(args.length < 0) return true; + + if(args.length == 1 && (args[0].equals("--help") || args[0].equals("-h"))) { + /* + * @TODO show help + */ + System.exit(0); + } + + for(int i = 0; i < args.length; i++) { + String arg = args[i]; + + boolean succ = true; + + switch(arg) { + case "-d": + case "--debug": + if(!eng.toggleDebug()) eng.toggleDebug(); + break; + case "-nd": + case "--no-debug": + if(eng.toggleDebug()) eng.toggleDebug(); + break; + case "-po": + case "--postfix": + if(!eng.togglePostfix()) eng.togglePostfix(); + break; + case "-npo": + case "--no-postfix": + if(eng.togglePostfix()) eng.togglePostfix(); + break; + case "-pr": + case "--prefix": + if(!eng.togglePrefix()) eng.togglePrefix(); + break; + case "-npr": + case "--no-prefix": + if(eng.togglePrefix()) eng.togglePrefix(); + break; + case "-se": + case "--stepeval": + if(!eng.toggleStepEval()) eng.toggleStepEval(); + break; + case "-nse": + case "--no-stepeval": + if(eng.toggleStepEval()) eng.toggleStepEval(); + break; + case "-D": + case "--define": + i = simpleDefine(i, args, eng); + if(i == -1) return false; + break; + case "-df": + case "--define-file": + i = defineFile(i, args, eng); + if(i == -1) return false; + break; + default: + Errors.inst.printError(EK_CLI_UNARG, arg); + return false; + } + } + + return true; + } + + private static int simpleDefine(int i, String[] args, DiceLangEngine eng) { + if(i >= (args.length - 1)) { + Errors.inst.printError(EK_CLI_MISARG, "define"); + return -1; + } + + if(i >= (args.length - 2)) { + Define dfn = new Define(5, false, false, false, null, args[i + 1], Arrays.asList("")); + + if(dfn.inError) return -1; + eng.addLineDefine(dfn); + return i + 1; + } + + Define dfn = new Define(5, false, false, false, null, args[i + 1], Arrays.asList(args[i + 2])); + if(dfn.inError) return -1; + eng.addLineDefine(dfn); + return i + 2; + } + + private static int defineFile(int i, String[] args, DiceLangEngine eng) { + if(i >= (args.length - 1)) { + Errors.inst.printError(EK_CLI_MISARG, "define-file"); + return -1; + } + + String fName = args[i + 1]; + + try(FileInputStream fis = new FileInputStream(fName)) { + Scanner scan = new Scanner(fis); + + while(scan.hasNextLine()) { + String ln = scan.nextLine(); + + Define dfn = parseDefine(ln.substring(ln.indexOf(' '))); + if(dfn == null || dfn.inError) return -1; + + if(ln.startsWith("line")) { + eng.addLineDefine(dfn); + } else if(ln.startsWith("token")) { + eng.addTokenDefine(dfn); + } else { + Errors.inst.printError(EK_CLI_INVDFNTYPE, ln.substring(0, ln.indexOf(' '))); + return -1; + } + } + + scan.close(); + } catch (FileNotFoundException fnfex) { + Errors.inst.printError(EK_CLI_NOFILE, fName); + return -1; + } catch (IOException ioex) { + Errors.inst.printError(EK_CLI_IOEX); + return -1; + } + + return i + 1; + } + + private static Define parseDefine(String ln) { + Define res = null; + // @TODO move this functionality from DiceLangConsole to some + // common ground where it can be used by both functions + return res; + } } diff --git a/dice-lang/src/bjc/dicelang/DiceLangConsole.java b/dice-lang/src/bjc/dicelang/DiceLangConsole.java index d9d9288..ff6fe45 100644 --- a/dice-lang/src/bjc/dicelang/DiceLangConsole.java +++ b/dice-lang/src/bjc/dicelang/DiceLangConsole.java @@ -19,11 +19,12 @@ public class DiceLangConsole { private ConsoleReader read; public DiceLangConsole(String[] args) { - // @TODO do something with the args commandNumber = 0; eng = new DiceLangEngine(); + if(!CLIArgsParser.parseArgs(args, eng)) System.exit(1); + Terminal.setupTerminal(); } diff --git a/dice-lang/src/bjc/dicelang/Errors.java b/dice-lang/src/bjc/dicelang/Errors.java index 201a6c4..c4ecfc4 100644 --- a/dice-lang/src/bjc/dicelang/Errors.java +++ b/dice-lang/src/bjc/dicelang/Errors.java @@ -105,6 +105,18 @@ public class Errors { EK_SCL_UNWORD, // Invalid argument to SCL command EK_SCL_INVARG, + + // CLI Argument Erros + // Unknown CLI argument + EK_CLI_UNARG, + // Missing subargument to argument + EK_CLI_MISARG, + // Invalid define type + EK_CLI_INVDFNTYPE, + // File not found + EK_CLI_NOFILE, + // Unknown I/O problem + EK_CLI_IOEX, } public static enum ErrorMode { @@ -116,7 +128,11 @@ public class Errors { public void printError(ErrorKey key, String... args) { switch(mode) { case WIZARD: - System.out.println("\t? " + key.ordinal()); + if(key == ErrorKey.EK_CLI_NOFILE) { + System.out.println("\t? 404"); + } else { + System.out.println("\t? " + key.ordinal()); + } break; case DEV: devError(key, args); @@ -259,6 +275,21 @@ public class Errors { case EK_SCL_UNWORD: System.out.printf("\tERROR: Unknown word %s\n", args[0]); break; + case EK_CLI_UNARG: + System.out.printf("\tERROR: Unknown argument %s\n", args[0]); + break; + case EK_CLI_MISARG: + System.out.printf("\tERROR: Missing subargument to command %s", args[0]); + break; + case EK_CLI_INVDFNTYPE: + System.out.printf("\tERROR: Invalid define type %s\n", args[0]); + break; + case EK_CLI_NOFILE: + System.out.printf("\tERROR: No such file %s\n", args[0]); + break; + case EK_CLI_IOEX: + System.out.printf("\tERROR: I/O problem with file"); + break; default: System.out.printf("\tERROR ERROR: Unknown error key %s\n", key); } |
