summaryrefslogtreecommitdiff
path: root/src/main/java/no/eliashaugsbakk
diff options
context:
space:
mode:
authorElias Haugsbakk <[email protected]>2026-09-20 23:44:36 +0200
committerElias Haugsbakk <[email protected]>2026-09-20 23:44:36 +0200
commitc5009b0cf424b99ae6d27e14fdd21666500b21b8 (patch)
tree9c1305de4dc89859878d517cde18858a2bd41a78 /src/main/java/no/eliashaugsbakk
parent10e0580ca3e920a5c7c126abdd70683c6fe2188f (diff)
implement single and multi line comments
Diffstat (limited to 'src/main/java/no/eliashaugsbakk')
-rw-r--r--src/main/java/no/eliashaugsbakk/kompilator/tokenization/Lexer.java29
-rw-r--r--src/main/java/no/eliashaugsbakk/kompilator/tokenization/LexerState.java2
-rw-r--r--src/main/java/no/eliashaugsbakk/kompilator/tokenization/TokenType.java1
3 files changed, 31 insertions, 1 deletions
diff --git a/src/main/java/no/eliashaugsbakk/kompilator/tokenization/Lexer.java b/src/main/java/no/eliashaugsbakk/kompilator/tokenization/Lexer.java
index 1389c6b..149835d 100644
--- a/src/main/java/no/eliashaugsbakk/kompilator/tokenization/Lexer.java
+++ b/src/main/java/no/eliashaugsbakk/kompilator/tokenization/Lexer.java
@@ -1,6 +1,8 @@
package no.eliashaugsbakk.kompilator.tokenization;
import static java.lang.Character.isLetterOrDigit;
+import static no.eliashaugsbakk.kompilator.tokenization.LexerState.IN_MULTI_LINE_COMMENT;
+import static no.eliashaugsbakk.kompilator.tokenization.LexerState.IN_SINGLE_LINE_COMMENT;
import static no.eliashaugsbakk.kompilator.tokenization.LexerState.IN_STRING;
import static no.eliashaugsbakk.kompilator.tokenization.LexerState.IN_TYPE;
import static no.eliashaugsbakk.kompilator.tokenization.LexerState.IN_WORD;
@@ -57,6 +59,10 @@ public class Lexer {
inType();
} else if (state == IN_STRING) {
inString();
+ } else if (state == IN_SINGLE_LINE_COMMENT) {
+ inSingleLineComment();
+ } else if (state == IN_MULTI_LINE_COMMENT) {
+ inMultiLineComment();
}
if (state == NORMAL) {
@@ -75,12 +81,19 @@ public class Lexer {
return tokens;
}
+
private void normal() {
if (Character.isWhitespace(current)) {
return;
}
- if (current == '"') {
+ if (current == '/') {
+ if (position + 1 < input.length() && input.charAt(position + 1) == '/') {
+ state = IN_SINGLE_LINE_COMMENT;
+ } else if (input.charAt(position + 1) == '*') {
+ state = IN_MULTI_LINE_COMMENT;
+ }
+ } else if (current == '"') {
state = IN_STRING;
} else if (isWordCharacter(current)) {
state = IN_WORD;
@@ -175,4 +188,18 @@ public class Lexer {
private void clearWordBuffer() {
wordBuffer.delete(0, wordBuffer.length());
}
+
+ private void inSingleLineComment() {
+ if (current == '\n') {
+ state = NORMAL;
+ }
+ }
+
+ private void inMultiLineComment() {
+ if (current == '*') {
+ if (position + 1 < input.length() && input.charAt(position + 1) == '/') {
+ state = NORMAL;
+ }
+ }
+ }
}
diff --git a/src/main/java/no/eliashaugsbakk/kompilator/tokenization/LexerState.java b/src/main/java/no/eliashaugsbakk/kompilator/tokenization/LexerState.java
index 3d77df2..deac767 100644
--- a/src/main/java/no/eliashaugsbakk/kompilator/tokenization/LexerState.java
+++ b/src/main/java/no/eliashaugsbakk/kompilator/tokenization/LexerState.java
@@ -5,4 +5,6 @@ public enum LexerState {
IN_STRING, // inside a string (after ")
IN_WORD, // reading a keyword or identifier
IN_TYPE, // reading a type (i32, string, ...)
+ IN_SINGLE_LINE_COMMENT, // reading a single line comment
+ IN_MULTI_LINE_COMMENT, // reading a multi line comment
}
diff --git a/src/main/java/no/eliashaugsbakk/kompilator/tokenization/TokenType.java b/src/main/java/no/eliashaugsbakk/kompilator/tokenization/TokenType.java
index 40b9d2e..45815e0 100644
--- a/src/main/java/no/eliashaugsbakk/kompilator/tokenization/TokenType.java
+++ b/src/main/java/no/eliashaugsbakk/kompilator/tokenization/TokenType.java
@@ -1,6 +1,7 @@
package no.eliashaugsbakk.kompilator.tokenization;
public enum TokenType {
+ COMMENT, // // this is a comment
KEYWORD, // print, var, if, while, function, etc.
IDENTIFIER, // variable_1
STRING_LITERAL, // "Hello, World!"