From 9b51ff42a5ac8943a10a0d467682f9f8908dc6e1 Mon Sep 17 00:00:00 2001 From: nils <48135649+Nilstrieb@users.noreply.github.com> Date: Fri, 28 May 2021 15:33:51 +0200 Subject: [PATCH] Update Lexer.java --- .../nilstrieb/grsbpl/language/Lexer.java | 42 ++++++++++++++----- 1 file changed, 31 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/github/nilstrieb/grsbpl/language/Lexer.java b/src/main/java/com/github/nilstrieb/grsbpl/language/Lexer.java index 49f1292..fc78f5f 100644 --- a/src/main/java/com/github/nilstrieb/grsbpl/language/Lexer.java +++ b/src/main/java/com/github/nilstrieb/grsbpl/language/Lexer.java @@ -71,6 +71,7 @@ public class Lexer { case '&' -> add(AMPERSAND); case '@' -> add(AT); case ':' -> add(COLUMN); + case '"' -> string(); case '\'' -> character(); case ' ', '\t', '\r', '\n' -> { } @@ -88,22 +89,41 @@ public class Lexer { private void character() { char value = advance(); if (value == '\\') { - char escaped = advance(); - value = switch (escaped) { - case 'n' -> '\n'; - case 'r' -> '\r'; - case '\\' -> '\\'; - case '0' -> '\0'; - case '\'' -> '\''; - case 'b' -> '\b'; - case 'f' -> '\f'; - default -> throw new LexException("Invalid escape sequence: \\" + escaped, lineNumber, offsetLock, lineOffset - offsetLock); - }; + value = escape(); } add(CHAR, value); consume(); } + private void string() { + StringBuilder stringBuilder = new StringBuilder(); + while (true) { + char next = advance(); + if (next == '\\') { + next = escape(); + } else if (next == '"') { + break; + } + stringBuilder.append(next); + } + add(STRING, stringBuilder.toString()); + } + + private char escape() { + char escaped = advance(); + return switch (escaped) { + case 'n' -> '\n'; + case 'r' -> '\r'; + case '\\' -> '\\'; + case '0' -> '\0'; + case '\'' -> '\''; + case 'b' -> '\b'; + case 'f' -> '\f'; + case '"' -> '"'; + default -> throw new LexException("Invalid escape sequence: \\" + escaped, lineNumber, offsetLock, lineOffset - offsetLock); + }; + } + private void comment() { while (true) { char next = advance();