summaryrefslogtreecommitdiff
path: root/dice-lang/src/bjc/dicelang/v2/DiceLangEngine.java
diff options
context:
space:
mode:
Diffstat (limited to 'dice-lang/src/bjc/dicelang/v2/DiceLangEngine.java')
-rw-r--r--dice-lang/src/bjc/dicelang/v2/DiceLangEngine.java86
1 files changed, 44 insertions, 42 deletions
diff --git a/dice-lang/src/bjc/dicelang/v2/DiceLangEngine.java b/dice-lang/src/bjc/dicelang/v2/DiceLangEngine.java
index 5a4ff26..2ab5030 100644
--- a/dice-lang/src/bjc/dicelang/v2/DiceLangEngine.java
+++ b/dice-lang/src/bjc/dicelang/v2/DiceLangEngine.java
@@ -33,14 +33,20 @@ public class DiceLangEngine {
// Shunter for token postfixing
private Shunter shunt;
+ // Tables for symbols
private IMap<Integer, String> symTable;
private IMap<Integer, String> stringLits;
+ private IMap<String, Token.Type> litTokens;
+
private final int MATH_PREC = 20;
private final int DICE_PREC = 10;
private final int EXPR_PREC = 0;
public DiceLangEngine() {
+ symTable = new FunctionalMap<>();
+ stringLits = new FunctionalMap<>();
+
opExpansionTokens = new LinkedList<>();
opExpansionTokens.add(new Pair<>("+", "\\+"));
@@ -64,6 +70,19 @@ public class DiceLangEngine {
debugMode = true;
shunt = new Shunter();
+
+ litTokens = new FunctionalMap<>();
+
+ litTokens.put("+", ADD);
+ litTokens.put("-", SUBTRACT);
+ litTokens.put("*", MULTIPLY);
+ litTokens.put("/", DIVIDE);
+ litTokens.put("//", IDIVIDE);
+ litTokens.put("dg", DICEGROUP);
+ litTokens.put("dc", DICECONCAT);
+ litTokens.put("dl", DICELIST);
+ litTokens.put("=>", LET);
+ litTokens.put(":=", BIND);
}
public boolean runCommand(String command) {
@@ -136,45 +155,19 @@ public class DiceLangEngine {
Token tk = Token.NIL_TOKEN;
- switch(token) {
- case "+":
- tk = new Token(ADD);
- break;
- case "-":
- tk = new Token(SUBTRACT);
- break;
- case "*":
- tk = new Token(MULTIPLY);
- break;
- case "/":
- tk = new Token(DIVIDE);
- break;
- case "//":
- tk = new Token(IDIVIDE);
- break;
- case "dg":
- tk = new Token(DICEGROUP);
- break;
- case "dc":
- tk = new Token(DICECONCAT);
- break;
- case "dl":
- tk = new Token(DICELIST);
- break;
- case "=>":
- tk = new Token(LET);
- break;
- case ":=":
- tk = new Token(BIND);
- break;
- case "(":
- case ")":
- case "[":
- case "]":
- tk = tokenizeGrouping(token);
- break;
- default:
- tk = tokenizeLiteral(token, stringLts);
+ if(litTokens.containsKey(token)) {
+ tk = new Token(litTokens.get(token));
+ } else {
+ switch(token) {
+ case "(":
+ case ")":
+ case "[":
+ case "]":
+ tk = tokenizeGrouping(token);
+ break;
+ default:
+ tk = tokenizeLiteral(token, stringLts);
+ }
}
return tk;
@@ -203,14 +196,23 @@ public class DiceLangEngine {
return tk;
}
- private Pattern intMatcher = Pattern.compile("\\A[\\-\\+]?\\d+\\Z");
- private Pattern stringLitMatcher = Pattern.compile("\\AstringLiteral\\d+\\Z");
+ private Pattern intMatcher = Pattern.compile("\\A[\\-\\+]?\\d+\\Z");
+ private Pattern hexadecimalMatcher = Pattern.compile("\\A[\\-\\+]?0x[0-9A-Fa-f]+\\Z");
+ private Pattern flexadecimalMatcher = Pattern.compile("\\A[\\-\\+]?[0-9][0-9A-Za-z]+B\\d{1,2}\\Z");
+ private Pattern stringLitMatcher = Pattern.compile("\\AstringLiteral(\\d+)\\Z");
private Token tokenizeLiteral(String token, IMap<String, String> stringLts) {
Token tk = Token.NIL_TOKEN;
if(intMatcher.matcher(token).matches()) {
- tk = new Token(INT_LIT, Integer.parseInt(token));
+ tk = new Token(INT_LIT, Long.parseLong(token));
+ } else if(hexadecimalMatcher.matcher(token).matches()) {
+ String newToken = token.substring(0, 1) + token.substring(token.indexOf('x'));
+
+ tk = new Token(INT_LIT, Long.parseLong(newToken.substring(2).toUpperCase(), 16));
+ } else if(flexadecimalMatcher.matcher(token).matches()) {
+ tk = new Token(INT_LIT, Long.parseLong(token.substring(0, token.lastIndexOf('B')),
+ Integer.parseInt(token.substring(token.lastIndexOf('B') + 1))));
} else if(DoubleMatcher.floatingLiteral.matcher(token).matches()) {
tk = new Token(FLOAT_LIT, Double.parseDouble(token));
} else if(DiceBox.isValidExpression(token)) {