diff options
| author | Elias Haugsbakk <[email protected]> | 2026-09-20 23:44:36 +0200 |
|---|---|---|
| committer | Elias Haugsbakk <[email protected]> | 2026-09-20 23:44:36 +0200 |
| commit | c5009b0cf424b99ae6d27e14fdd21666500b21b8 (patch) | |
| tree | 9c1305de4dc89859878d517cde18858a2bd41a78 /src/main/java/no/eliashaugsbakk/kompilator | |
| parent | 10e0580ca3e920a5c7c126abdd70683c6fe2188f (diff) | |
implement single and multi line comments
Diffstat (limited to 'src/main/java/no/eliashaugsbakk/kompilator')
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!" |
