From a942b90f78c2b2043ae29cca59bc3798c7f2807d Mon Sep 17 00:00:00 2001 From: blueloveTH Date: Wed, 4 Jan 2023 02:27:05 +0800 Subject: [PATCH] add ''' --- src/compiler.h | 37 ++++++++++++++++++++++++++++++++++--- src/parser.h | 9 +++++++++ tests/_rawstring.py | 19 ++++++++++++++++++- 3 files changed, 61 insertions(+), 4 deletions(-) diff --git a/src/compiler.h b/src/compiler.h index c4647469..0d02c716 100644 --- a/src/compiler.h +++ b/src/compiler.h @@ -115,11 +115,43 @@ public: } _Str eatStringUntil(char quote, bool raw) { + bool quote3 = false; + std::string_view sv = parser->lookahead(2); + if(sv.size() == 2 && sv[0] == quote && sv[1] == quote) { + quote3 = true; + parser->eatChar(); + parser->eatChar(); + } + std::vector buff; while (true) { char c = parser->eatCharIncludeNewLine(); - if (c == quote) break; - if (c == '\0' || c == '\n') syntaxError("EOL while scanning string literal"); + if (c == quote){ + if(quote3){ + sv = parser->lookahead(2); + if(sv.size() == 2 && sv[0] == quote && sv[1] == quote) { + parser->eatChar(); + parser->eatChar(); + break; + } + buff.push_back(c); + } else { + break; + } + } + if (c == '\0'){ + if(quote3 && parser->src->mode == SINGLE_MODE){ + throw NeedMoreLines(false); + } + syntaxError("EOL while scanning string literal"); + } + if (c == '\n'){ + if(!quote3) syntaxError("EOL while scanning string literal"); + else{ + buff.push_back(c); + continue; + } + } if (!raw && c == '\\') { switch (parser->eatCharIncludeNewLine()) { case '"': buff.push_back('"'); break; @@ -128,7 +160,6 @@ public: case 'n': buff.push_back('\n'); break; case 'r': buff.push_back('\r'); break; case 't': buff.push_back('\t'); break; - case '\n': case '\r': break; default: syntaxError("invalid escape character"); } } else { diff --git a/src/parser.h b/src/parser.h index 48b92d06..3f54ef8f 100644 --- a/src/parser.h +++ b/src/parser.h @@ -124,6 +124,15 @@ struct Parser { return *current_char; } + std::string_view lookahead(int n){ + const char* c = current_char; + for(int i=0; i->{s}<-<- +{123} +''' + +assert s == '->->asdasd\nasds1321321321测试\\测试<-<-\n123\n' \ No newline at end of file