summaryrefslogtreecommitdiff
path: root/src/main/java/no/eliashaugsbakk/kompilator/tokenization/Lexer.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/no/eliashaugsbakk/kompilator/tokenization/Lexer.java')
-rw-r--r--src/main/java/no/eliashaugsbakk/kompilator/tokenization/Lexer.java29
1 files changed, 18 insertions, 11 deletions
diff --git a/src/main/java/no/eliashaugsbakk/kompilator/tokenization/Lexer.java b/src/main/java/no/eliashaugsbakk/kompilator/tokenization/Lexer.java
index c185650..53c7b53 100644
--- a/src/main/java/no/eliashaugsbakk/kompilator/tokenization/Lexer.java
+++ b/src/main/java/no/eliashaugsbakk/kompilator/tokenization/Lexer.java
@@ -6,15 +6,17 @@ import static no.eliashaugsbakk.kompilator.tokenization.LexerState.IN_TYPE;
import static no.eliashaugsbakk.kompilator.tokenization.LexerState.IN_WORD;
import static no.eliashaugsbakk.kompilator.tokenization.LexerState.NORMAL;
import static no.eliashaugsbakk.kompilator.tokenization.TokenType.ASSIGN;
+import static no.eliashaugsbakk.kompilator.tokenization.TokenType.COMMA;
import static no.eliashaugsbakk.kompilator.tokenization.TokenType.EOF;
import static no.eliashaugsbakk.kompilator.tokenization.TokenType.IDENTIFIER;
import static no.eliashaugsbakk.kompilator.tokenization.TokenType.KEYWORD;
import static no.eliashaugsbakk.kompilator.tokenization.TokenType.LPAREN;
+import static no.eliashaugsbakk.kompilator.tokenization.TokenType.NULLABLE;
import static no.eliashaugsbakk.kompilator.tokenization.TokenType.RPAREN;
import static no.eliashaugsbakk.kompilator.tokenization.TokenType.SEMICOLON;
-import static no.eliashaugsbakk.kompilator.tokenization.TokenType.STRING;
+import static no.eliashaugsbakk.kompilator.tokenization.TokenType.STRING_LITERAL;
import static no.eliashaugsbakk.kompilator.tokenization.TokenType.TYPE;
-import static no.eliashaugsbakk.kompilator.tokenization.TokenType.TYPE_DECLARATION;
+import static no.eliashaugsbakk.kompilator.tokenization.TokenType.COLON;
import java.util.ArrayList;
import java.util.List;
@@ -47,12 +49,11 @@ public class Lexer {
}
current = input.charAt(position);
- if (!Character.isWhitespace(current)) {
-
+ if (state == IN_STRING) {
+ inString();
+ } else if (!Character.isWhitespace(current)) {
if (state == IN_WORD) {
inWord();
- } else if (state == IN_STRING) {
- inString();
} else if (state == IN_TYPE) {
inType();
}
@@ -76,7 +77,7 @@ public class Lexer {
wordBuffer.append(current);
} else if (current == ':') {
- tokens.add(new Token(TYPE_DECLARATION, ":", line, column));
+ tokens.add(new Token(COLON, ":", line, column));
state = IN_TYPE;
} else if (current == '=') {
@@ -87,11 +88,18 @@ public class Lexer {
tokens.add(new Token(RPAREN, Character.toString(current), line, column));
} else if (current == ';') {
tokens.add(new Token(SEMICOLON, Character.toString(current), line, column));
+ } else if (current == ',') {
+ tokens.add(new Token(COMMA, Character.toString(current), line, column));
}
}
private void inType() {
- if (current == '=' || current == ';') {
+ if (current == '?') {
+ state = NORMAL;
+ tokens.add(new Token(TYPE, wordBuffer.toString(), line, column - wordBuffer.length()));
+ tokens.add(new Token(NULLABLE, "?", line, column));
+ clearWordBuffer();
+ } else if (current == '=' || current == ';') {
state = NORMAL;
tokens.add(new Token(TYPE, wordBuffer.toString(), line, column - wordBuffer.length()));
clearWordBuffer();
@@ -101,11 +109,10 @@ public class Lexer {
}
private void inString() {
- if (current == '"') {
- position++; // skip closing "
+ if (current == '"') { // closing " gets skipped implicitly
current = input.charAt(position);
state = NORMAL;
- tokens.add(new Token(STRING, wordBuffer.toString(), line, column));
+ tokens.add(new Token(STRING_LITERAL, wordBuffer.toString(), line, column));
wordBuffer.delete(0, wordBuffer.length());
} else {
wordBuffer.append(current);