summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--dice-lang/src/bjc/dicelang/CLIArgsParser.java140
-rw-r--r--dice-lang/src/bjc/dicelang/DiceLangConsole.java3
-rw-r--r--dice-lang/src/bjc/dicelang/Errors.java33
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);
}