From 0b701d1643a38f69c037d5362b64e007ab315aed Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Mon, 9 May 2022 12:36:30 +0200 Subject: [PATCH] Berry allow multiple string literal --- lib/libesp32/berry/src/be_lexer.c | 39 +++++++++++++++++++++++++------ 1 file changed, 32 insertions(+), 7 deletions(-) diff --git a/lib/libesp32/berry/src/be_lexer.c b/lib/libesp32/berry/src/be_lexer.c index c4c736508..1803300fe 100644 --- a/lib/libesp32/berry/src/be_lexer.c +++ b/lib/libesp32/berry/src/be_lexer.c @@ -396,19 +396,44 @@ static btokentype scan_identifier(blexer *lexer) return TokenId; } +/* munch any delimeter and return 1 if any found */ +static int skip_delimiter(blexer *lexer) { + int c = lgetc(lexer); + int delimeter_present = 0; + while (1) { + if (c == '\r' || c == '\n') { + skip_newline(lexer); + } else if (c == ' ' || c == '\t' || c == '\f' || c == '\v') { + next(lexer); + } else { + break; + } + c = lgetc(lexer); + delimeter_present = 1; + } + return delimeter_present; +} + static btokentype scan_string(blexer *lexer) { - int c, end = lgetc(lexer); - next(lexer); /* skip '"' or '\'' */ - while ((c = lgetc(lexer)) != EOS && (c != end)) { - save(lexer); - if (c == '\\') { - save(lexer); /* skip '\\.' */ + while (1) { /* handle multiple string literals in a row */ + int c; + int end = lgetc(lexer); /* string delimiter, either '"' or '\'' */ + next(lexer); /* skip '"' or '\'' */ + while ((c = lgetc(lexer)) != EOS && (c != end)) { + save(lexer); + if (c == '\\') { + save(lexer); /* skip '\\.' */ + } } + c = next(lexer); /* skip '"' or '\'' */ + /* check if there's an additional string literal right after */ + skip_delimiter(lexer); + c = lgetc(lexer); + if (c != '"' && c != '\'') { break; } } tr_string(lexer); setstr(lexer, buf_tostr(lexer)); - next(lexer); /* skip '"' or '\'' */ return TokenString; }