summaryrefslogtreecommitdiffstats
path: root/code/Interpreter/TokenScanner.java
diff options
context:
space:
mode:
Diffstat (limited to 'code/Interpreter/TokenScanner.java')
-rw-r--r--code/Interpreter/TokenScanner.java47
1 files changed, 47 insertions, 0 deletions
diff --git a/code/Interpreter/TokenScanner.java b/code/Interpreter/TokenScanner.java
index 87f1e4b..c9249a4 100644
--- a/code/Interpreter/TokenScanner.java
+++ b/code/Interpreter/TokenScanner.java
@@ -1,7 +1,9 @@
package Interpreter;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
public class TokenScanner {
private String sourceCode;
@@ -16,6 +18,7 @@ public class TokenScanner {
tokenStart=currentLoc;
readToken();
}
+ tokens.add(new Token(TokenType.EOF, "", null));
return tokens;
}
@@ -23,12 +26,20 @@ public class TokenScanner {
private void readToken(){
char checkChar = sourceCode.charAt(currentLoc);
switch(checkChar){
+
+ case ' ':break;
+ case '\n':break;
+ case '\r':break;
+ case '\t':
+ break;
+
case '(': createTokenNull(TokenType.LEFT_PAREN); break;
case ')': createTokenNull(TokenType.RIGHT_PAREN); break;
case '+': createTokenNull(TokenType.PLUS); break;
case '-': createTokenNull(TokenType.MINUS); break;
case '*': createTokenNull(TokenType.STAR); break;
case '/': createTokenNull(TokenType.SLASH); break;
+ case ';': createTokenNull(TokenType.SEMI_COLON); break;
//Some tokens are multiple characters long (==, <=) etc
//so need to check next char as well
@@ -40,6 +51,14 @@ public class TokenScanner {
createTokenNull(TokenType.EQUALS);
break;
}
+ case ':':
+ if (checkNextChar(':')){
+ createTokenNull(TokenType.DEFINE);
+ break;
+ } else {
+ createTokenNull(TokenType.COLON);
+ break;
+ }
case '<':
if (checkNextChar('=')){
createTokenNull(TokenType.LESS_EQUAL);
@@ -72,6 +91,21 @@ public class TokenScanner {
}
createToken(TokenType.NUMBER, Double.parseDouble(sourceCode.substring(tokenStart, currentLoc+1)));
}
+ else if (checkIsAlpha(checkChar)){
+ while (checkIsAlpha(lookAhead())){
+ currentLoc++;
+ }
+ String text = sourceCode.substring(tokenStart, currentLoc+1);
+ TokenType type = keywords.get(text);
+ if(type == null){
+ createToken(TokenType.IDENTIFIER, text);
+ } else{
+ createToken(type, text);
+ }
+
+ } else {
+ Language.displayError("Unexpected Character");
+ }
}
currentLoc++;
@@ -129,4 +163,17 @@ public class TokenScanner {
private boolean checkIsDigit(char checkChar){
return checkChar>='0' && checkChar<='9';
}
+
+ private boolean checkIsAlpha(char checkChar){
+ return ('a'<=checkChar && checkChar<='z')||
+ ('A'<=checkChar && checkChar<='Z');
+ }
+
+ private static final Map<String, TokenType> keywords;
+
+ static {
+ keywords = new HashMap<>();
+ keywords.put("var", TokenType.VAR);
+ keywords.put("print", TokenType.PRINT);
+ }
}