diff options
Diffstat (limited to 'code/Interpreter/TokenScanner.java')
-rw-r--r-- | code/Interpreter/TokenScanner.java | 47 |
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); + } } |