Update Lexer.java

This commit is contained in:
nora 2021-05-28 15:33:51 +02:00 committed by GitHub
parent 1e0c9c84c9
commit 9b51ff42a5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -71,6 +71,7 @@ public class Lexer {
case '&' -> add(AMPERSAND); case '&' -> add(AMPERSAND);
case '@' -> add(AT); case '@' -> add(AT);
case ':' -> add(COLUMN); case ':' -> add(COLUMN);
case '"' -> string();
case '\'' -> character(); case '\'' -> character();
case ' ', '\t', '\r', '\n' -> { case ' ', '\t', '\r', '\n' -> {
} }
@ -88,8 +89,29 @@ public class Lexer {
private void character() { private void character() {
char value = advance(); char value = advance();
if (value == '\\') { if (value == '\\') {
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(); char escaped = advance();
value = switch (escaped) { return switch (escaped) {
case 'n' -> '\n'; case 'n' -> '\n';
case 'r' -> '\r'; case 'r' -> '\r';
case '\\' -> '\\'; case '\\' -> '\\';
@ -97,12 +119,10 @@ public class Lexer {
case '\'' -> '\''; case '\'' -> '\'';
case 'b' -> '\b'; case 'b' -> '\b';
case 'f' -> '\f'; case 'f' -> '\f';
case '"' -> '"';
default -> throw new LexException("Invalid escape sequence: \\" + escaped, lineNumber, offsetLock, lineOffset - offsetLock); default -> throw new LexException("Invalid escape sequence: \\" + escaped, lineNumber, offsetLock, lineOffset - offsetLock);
}; };
} }
add(CHAR, value);
consume();
}
private void comment() { private void comment() {
while (true) { while (true) {