summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--base/src/bjc/dicelang/Tokenizer.java42
-rw-r--r--scl/src/main/java/bjc/dicelang/scl/tokens/SCLToken.java66
-rw-r--r--scl/src/main/java/bjc/dicelang/scl/tokens/StringLitSCLToken.java12
-rw-r--r--scl/src/main/java/bjc/dicelang/scl/tokens/StringSCLToken.java31
-rw-r--r--scl/src/main/java/bjc/dicelang/scl/tokens/SymbolSCLToken.java12
-rw-r--r--scl/src/main/java/bjc/dicelang/scl/tokens/WordListSCLToken.java31
-rw-r--r--scl/src/main/java/bjc/dicelang/scl/tokens/WordSCLToken.java114
-rw-r--r--scl/src/main/java/bjc/dicelang/scl/tokens/WordsSCLToken.java12
8 files changed, 278 insertions, 42 deletions
diff --git a/base/src/bjc/dicelang/Tokenizer.java b/base/src/bjc/dicelang/Tokenizer.java
index cd732ee..66a1505 100644
--- a/base/src/bjc/dicelang/Tokenizer.java
+++ b/base/src/bjc/dicelang/Tokenizer.java
@@ -47,21 +47,37 @@ public class Tokenizer {
litTokens.put("crc", COERCE);
}
+ /**
+ * Create a new tokenizer.
+ *
+ * @param engine
+ * The engine to use.
+ */
public Tokenizer(final DiceLangEngine engine) {
eng = engine;
}
+ /**
+ * Lex a token.
+ *
+ * @param token
+ * The string to lex.
+ * @param stringLts
+ * The set of string literals.
+ *
+ * @return A lexed token.
+ */
public Token lexToken(final String token, final IMap<String, String> stringLts) {
- if(token.equals("")) {
+ if (token.equals("")) {
return null;
}
Token tk = Token.NIL_TOKEN;
- if(litTokens.containsKey(token)) {
+ if (litTokens.containsKey(token)) {
tk = new Token(litTokens.get(token));
} else {
- switch(token.charAt(0)) {
+ switch (token.charAt(0)) {
case '(':
case ')':
case '[':
@@ -81,9 +97,9 @@ public class Tokenizer {
private static Token tokenizeGrouping(final String token) {
Token tk = Token.NIL_TOKEN;
- if(StringUtils.containsOnly(token, "\\" + token.charAt(0))) {
+ if (StringUtils.containsOnly(token, "\\" + token.charAt(0))) {
/* Handle multiple-grouped delimiters. */
- switch(token.charAt(0)) {
+ switch (token.charAt(0)) {
case '(':
tk = new Token(OPAREN, token.length());
break;
@@ -128,15 +144,15 @@ public class Tokenizer {
String token = rtoken.trim();
- if(TokenUtils.isInt(token)) {
+ if (TokenUtils.isInt(token)) {
tk = new Token(INT_LIT, Long.parseLong(token));
- } else if(hexadecimalMatcher.matcher(token).matches()) {
+ } else if (hexadecimalMatcher.matcher(token).matches()) {
final 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()) {
+ } else if (flexadecimalMatcher.matcher(token).matches()) {
final int parseBase = Integer.parseInt(token.substring(token.lastIndexOf('B') + 1));
- if(parseBase < Character.MIN_RADIX || parseBase > Character.MAX_RADIX) {
+ if (parseBase < Character.MIN_RADIX || parseBase > Character.MAX_RADIX) {
Errors.inst.printError(EK_TOK_INVBASE, Integer.toString(parseBase));
return Token.NIL_TOKEN;
}
@@ -145,18 +161,18 @@ public class Tokenizer {
try {
tk = new Token(INT_LIT, Long.parseLong(flexNum, parseBase));
- } catch(final NumberFormatException nfex) {
+ } catch (final NumberFormatException nfex) {
Errors.inst.printError(EK_TOK_INVFLEX, flexNum, Integer.toString(parseBase));
return Token.NIL_TOKEN;
}
- } else if(TokenUtils.isDouble(token)) {
+ } else if (TokenUtils.isDouble(token)) {
tk = new FloatToken(Double.parseDouble(token));
- } else if(DiceBox.isValidExpression(token)) {
+ } else if (DiceBox.isValidExpression(token)) {
tk = new DiceToken(DiceBox.parseExpression(token));
} else {
final Matcher stringLit = stringLitMatcher.matcher(token);
- if(stringLit.matches()) {
+ if (stringLit.matches()) {
final int litNum = Integer.parseInt(stringLit.group(1));
eng.addStringLiteral(litNum, stringLts.get(token));
diff --git a/scl/src/main/java/bjc/dicelang/scl/tokens/SCLToken.java b/scl/src/main/java/bjc/dicelang/scl/tokens/SCLToken.java
index 127756b..659f545 100644
--- a/scl/src/main/java/bjc/dicelang/scl/tokens/SCLToken.java
+++ b/scl/src/main/java/bjc/dicelang/scl/tokens/SCLToken.java
@@ -17,16 +17,78 @@ import static bjc.dicelang.scl.tokens.SCLToken.Type.*;
*/
public class SCLToken {
+ /**
+ * Represent all the types of a token.
+ *
+ * @author student
+ *
+ */
public static enum Type {
/* Natural tokens. These come directly from strings */
- ILIT, FLIT, BLIT, SQUOTE, DQUOTE, OBRACKET, OBRACE, SYMBOL, WORD,
+ /**
+ * Integer literal.
+ */
+ ILIT,
+ /**
+ * Floating-point literal.
+ */
+ FLIT,
+ /**
+ * Boolean literal.
+ */
+ BLIT,
+ /**
+ * Single-quote.
+ */
+ SQUOTE,
+ /**
+ * Double-quote.
+ */
+ DQUOTE,
+ /**
+ * Open-bracket.
+ */
+ OBRACKET,
+ /**
+ * Open-brace.
+ */
+ OBRACE,
+ /**
+ * Symbol.
+ */
+ SYMBOL,
+ /**
+ * Word.
+ */
+ WORD,
/* Synthetic tokens. These are produced from special tokens. */
- SLIT, WORDS, ARRAY,
+ /**
+ * String literal.
+ */
+ SLIT,
+ /**
+ * List of words.
+ */
+ WORDS,
+ /**
+ * List of data.
+ */
+ ARRAY,
}
+ /**
+ * The type of the token.
+ */
public SCLToken.Type type;
+ /**
+ * Convert a string into a token.
+ *
+ * @param token
+ * The string to convert into a token.
+ * @return The token.
+ */
public static SCLToken tokenizeString(final String token) {
if (litTokens.containsKey(token)) {
return new SCLToken(litTokens.get(token));
diff --git a/scl/src/main/java/bjc/dicelang/scl/tokens/StringLitSCLToken.java b/scl/src/main/java/bjc/dicelang/scl/tokens/StringLitSCLToken.java
index 85c6cb0..d2a10f9 100644
--- a/scl/src/main/java/bjc/dicelang/scl/tokens/StringLitSCLToken.java
+++ b/scl/src/main/java/bjc/dicelang/scl/tokens/StringLitSCLToken.java
@@ -1,7 +1,19 @@
package bjc.dicelang.scl.tokens;
+/**
+ * Represents a literal string token.
+ *
+ * @author student
+ *
+ */
public class StringLitSCLToken extends StringSCLToken {
+ /**
+ * Create a new literal string token.
+ *
+ * @param val
+ * The string value of the token.
+ */
public StringLitSCLToken(String val) {
super(false, val);
}
diff --git a/scl/src/main/java/bjc/dicelang/scl/tokens/StringSCLToken.java b/scl/src/main/java/bjc/dicelang/scl/tokens/StringSCLToken.java
index d4ed8ec..d026bdb 100644
--- a/scl/src/main/java/bjc/dicelang/scl/tokens/StringSCLToken.java
+++ b/scl/src/main/java/bjc/dicelang/scl/tokens/StringSCLToken.java
@@ -1,11 +1,19 @@
package bjc.dicelang.scl.tokens;
-public class StringSCLToken extends SCLToken {
- /* Used for SYMBOL & SLIT */
+/**
+ * Base class for tokens containing strings.
+ *
+ * @author student
+ *
+ */
+public abstract class StringSCLToken extends SCLToken {
+ /**
+ * String value of the token.
+ */
public String stringVal;
protected StringSCLToken(boolean isSymbol, String val) {
- if(isSymbol) {
+ if (isSymbol) {
type = Type.SYMBOL;
} else {
type = Type.SLIT;
@@ -24,13 +32,18 @@ public class StringSCLToken extends SCLToken {
@Override
public boolean equals(Object obj) {
- if(this == obj) return true;
- if(!super.equals(obj)) return false;
- if(getClass() != obj.getClass()) return false;
+ if (this == obj)
+ return true;
+ if (!super.equals(obj))
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
StringSCLToken other = (StringSCLToken) obj;
- if(stringVal == null) {
- if(other.stringVal != null) return false;
- } else if(!stringVal.equals(other.stringVal)) return false;
+ if (stringVal == null) {
+ if (other.stringVal != null)
+ return false;
+ } else if (!stringVal.equals(other.stringVal))
+ return false;
return true;
}
diff --git a/scl/src/main/java/bjc/dicelang/scl/tokens/SymbolSCLToken.java b/scl/src/main/java/bjc/dicelang/scl/tokens/SymbolSCLToken.java
index c9ba43a..d67be78 100644
--- a/scl/src/main/java/bjc/dicelang/scl/tokens/SymbolSCLToken.java
+++ b/scl/src/main/java/bjc/dicelang/scl/tokens/SymbolSCLToken.java
@@ -1,7 +1,19 @@
package bjc.dicelang.scl.tokens;
+/**
+ * Represents a symbol literal.
+ *
+ * @author student
+ *
+ */
public class SymbolSCLToken extends StringSCLToken {
+ /**
+ * Create a symbol literal
+ *
+ * @param val
+ * The value of the symbol.
+ */
public SymbolSCLToken(String val) {
super(true, val);
}
diff --git a/scl/src/main/java/bjc/dicelang/scl/tokens/WordListSCLToken.java b/scl/src/main/java/bjc/dicelang/scl/tokens/WordListSCLToken.java
index 8463b66..d5bf537 100644
--- a/scl/src/main/java/bjc/dicelang/scl/tokens/WordListSCLToken.java
+++ b/scl/src/main/java/bjc/dicelang/scl/tokens/WordListSCLToken.java
@@ -2,12 +2,20 @@ package bjc.dicelang.scl.tokens;
import bjc.utils.funcdata.IList;
-public class WordListSCLToken extends SCLToken {
- /* Used for WORDS & ARRAY */
+/**
+ * Represents a list of words.
+ *
+ * @author student
+ *
+ */
+public abstract class WordListSCLToken extends SCLToken {
+ /**
+ * The list of words.
+ */
public IList<SCLToken> tokenVals;
protected WordListSCLToken(boolean isArray, IList<SCLToken> tokens) {
- if(isArray) {
+ if (isArray) {
type = Type.ARRAY;
} else {
type = Type.WORDS;
@@ -26,13 +34,18 @@ public class WordListSCLToken extends SCLToken {
@Override
public boolean equals(Object obj) {
- if(this == obj) return true;
- if(!super.equals(obj)) return false;
- if(getClass() != obj.getClass()) return false;
+ if (this == obj)
+ return true;
+ if (!super.equals(obj))
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
WordListSCLToken other = (WordListSCLToken) obj;
- if(tokenVals == null) {
- if(other.tokenVals != null) return false;
- } else if(!tokenVals.equals(other.tokenVals)) return false;
+ if (tokenVals == null) {
+ if (other.tokenVals != null)
+ return false;
+ } else if (!tokenVals.equals(other.tokenVals))
+ return false;
return true;
}
diff --git a/scl/src/main/java/bjc/dicelang/scl/tokens/WordSCLToken.java b/scl/src/main/java/bjc/dicelang/scl/tokens/WordSCLToken.java
index 5c3c8cb..ae185de 100644
--- a/scl/src/main/java/bjc/dicelang/scl/tokens/WordSCLToken.java
+++ b/scl/src/main/java/bjc/dicelang/scl/tokens/WordSCLToken.java
@@ -5,22 +5,104 @@ import static bjc.dicelang.scl.tokens.WordSCLToken.Word.*;
import java.util.HashMap;
import java.util.Map;
+/**
+ * Represents a single word.
+ *
+ * @author student
+ *
+ */
public class WordSCLToken extends SCLToken {
+ /**
+ * Represents the word type.
+ *
+ * @author student
+ *
+ */
public static enum Word {
/* Array manipulation */
- MAKEARRAY, MAKEEXEC, MAKEUNEXEC,
+ /**
+ * Create an array
+ */
+ MAKEARRAY,
+ /**
+ * Make a token executable.
+ */
+ MAKEEXEC,
+ /**
+ * Make a token unexecutable.
+ */
+ MAKEUNEXEC,
+
/* Stream manipulation */
- NEWSTREAM, LEFTSTREAM, RIGHTSTREAM, DELETESTREAM, MERGESTREAM,
+ /**
+ * Create a new stream.
+ */
+ NEWSTREAM,
+ /**
+ * Swap to the left stream.
+ */
+ LEFTSTREAM,
+ /**
+ * Swap to the right stream.
+ */
+ RIGHTSTREAM,
+ /**
+ * Delete the current stream.
+ */
+ DELETESTREAM,
+ /**
+ * Merge the streams.
+ */
+ MERGESTREAM,
+
/* Stack manipulation */
- STACKCOUNT, STACKEMPTY, DROP, NDROP, NIP, NNIP,
+ /**
+ * Get the count of items on the stack.
+ */
+ STACKCOUNT,
+ /**
+ * Check if the stack is empty.
+ */
+ STACKEMPTY,
+ /**
+ * Drop an item from the top of the stack.
+ */
+ DROP,
+ /**
+ * Drop a number of items from the top of the stack.
+ */
+ NDROP,
+ /**
+ * Drop an item, leaving the top of the stack alone.
+ */
+ NIP,
+ /**
+ * Drop a number of items, leaving the top of the stack alone.
+ */
+ NNIP,
}
+ /**
+ * The value of the word.
+ */
public Word wordVal;
+ /**
+ * Create a new word token.
+ *
+ * @param wrd
+ * The value of the word.
+ */
public WordSCLToken(String wrd) {
this(builtinWords.get(wrd));
}
+ /**
+ * Create a new word token.
+ *
+ * @param wrd
+ * The value of the word.
+ */
public WordSCLToken(Word wrd) {
super(Type.WORD);
@@ -42,14 +124,26 @@ public class WordSCLToken extends SCLToken {
@Override
public boolean equals(Object obj) {
- if(this == obj) return true;
- if(!super.equals(obj)) return false;
- if(getClass() != obj.getClass()) return false;
+ if (this == obj)
+ return true;
+ if (!super.equals(obj))
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
WordSCLToken other = (WordSCLToken) obj;
- if(wordVal != other.wordVal) return false;
+ if (wordVal != other.wordVal)
+ return false;
return true;
}
+ /**
+ * Check if a word is built-in.
+ *
+ * @param wrd
+ * The word to check.
+ *
+ * @return Whether or not the word is builtin.
+ */
public static boolean isBuiltinWord(String wrd) {
return builtinWords.containsKey(wrd);
}
@@ -61,13 +155,15 @@ public class WordSCLToken extends SCLToken {
builtinWords = new HashMap<>();
builtinWords.put("makearray", MAKEARRAY);
+ builtinWords.put("cvx", MAKEEXEC);
+ builtinWords.put("cvux", MAKEUNEXEC);
+
builtinWords.put("+stream", NEWSTREAM);
builtinWords.put(">stream", LEFTSTREAM);
builtinWords.put("<stream", RIGHTSTREAM);
builtinWords.put("-stream", DELETESTREAM);
builtinWords.put("<-stream", MERGESTREAM);
- builtinWords.put("cvx", MAKEEXEC);
- builtinWords.put("cvux", MAKEUNEXEC);
+
builtinWords.put("#", STACKCOUNT);
builtinWords.put("empty?", STACKEMPTY);
builtinWords.put("drop", DROP);
diff --git a/scl/src/main/java/bjc/dicelang/scl/tokens/WordsSCLToken.java b/scl/src/main/java/bjc/dicelang/scl/tokens/WordsSCLToken.java
index 02d720c..40c4cd4 100644
--- a/scl/src/main/java/bjc/dicelang/scl/tokens/WordsSCLToken.java
+++ b/scl/src/main/java/bjc/dicelang/scl/tokens/WordsSCLToken.java
@@ -2,8 +2,20 @@ package bjc.dicelang.scl.tokens;
import bjc.utils.funcdata.IList;
+/**
+ * A token representing an executable bunch of words.
+ *
+ * @author student
+ *
+ */
public class WordsSCLToken extends WordListSCLToken {
+ /**
+ * Create a new executable words token.
+ *
+ * @param tokens
+ * The tokens to use.
+ */
public WordsSCLToken(IList<SCLToken> tokens) {
super(false, tokens);
}