mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-31 17:00:17 +00:00
up
This commit is contained in:
parent
a942b90f78
commit
6488224a9b
@ -1,4 +1,4 @@
|
|||||||
## 0.6.1+3
|
## 0.6.1+4
|
||||||
|
|
||||||
+ Break change
|
+ Break change
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
name: pocketpy
|
name: pocketpy
|
||||||
description: A lightweight Python interpreter for game engines.
|
description: A lightweight Python interpreter for game engines.
|
||||||
version: 0.6.1+3
|
version: 0.6.1+4
|
||||||
homepage: https://pocketpy.dev
|
homepage: https://pocketpy.dev
|
||||||
repository: https://github.com/blueloveth/pocketpy
|
repository: https://github.com/blueloveth/pocketpy
|
||||||
|
|
||||||
|
|||||||
@ -3276,6 +3276,15 @@ struct Parser {
|
|||||||
return *current_char;
|
return *current_char;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string_view lookahead(int n){
|
||||||
|
const char* c = current_char;
|
||||||
|
for(int i=0; i<n; i++){
|
||||||
|
if(*c == '\0') return std::string_view(current_char, i);
|
||||||
|
c++;
|
||||||
|
}
|
||||||
|
return std::string_view(current_char, n);
|
||||||
|
}
|
||||||
|
|
||||||
char peekNextChar() {
|
char peekNextChar() {
|
||||||
if (peekChar() == '\0') return '\0';
|
if (peekChar() == '\0') return '\0';
|
||||||
return *(current_char + 1);
|
return *(current_char + 1);
|
||||||
@ -5102,6 +5111,8 @@ struct Loop {
|
|||||||
Loop(int start) : start(start) {}
|
Loop(int start) : start(start) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum StringType { NORMAL_STRING, RAW_STRING, F_STRING };
|
||||||
|
|
||||||
class Compiler {
|
class Compiler {
|
||||||
public:
|
public:
|
||||||
pkpy::unique_ptr<Parser> parser;
|
pkpy::unique_ptr<Parser> parser;
|
||||||
@ -5193,13 +5204,45 @@ public:
|
|||||||
#define EXPR_ANY() parsePrecedence(PREC_ASSIGNMENT)
|
#define EXPR_ANY() parsePrecedence(PREC_ASSIGNMENT)
|
||||||
}
|
}
|
||||||
|
|
||||||
_Str eatStringUntil(char quote) {
|
_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<char> buff;
|
std::vector<char> buff;
|
||||||
while (true) {
|
while (true) {
|
||||||
char c = parser->eatCharIncludeNewLine();
|
char c = parser->eatCharIncludeNewLine();
|
||||||
if (c == quote) break;
|
if (c == quote){
|
||||||
if (c == '\0' || c == '\n') syntaxError("EOL while scanning string literal");
|
if(quote3){
|
||||||
if (c == '\\') {
|
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()) {
|
switch (parser->eatCharIncludeNewLine()) {
|
||||||
case '"': buff.push_back('"'); break;
|
case '"': buff.push_back('"'); break;
|
||||||
case '\'': buff.push_back('\''); break;
|
case '\'': buff.push_back('\''); break;
|
||||||
@ -5207,7 +5250,6 @@ public:
|
|||||||
case 'n': buff.push_back('\n'); break;
|
case 'n': buff.push_back('\n'); break;
|
||||||
case 'r': buff.push_back('\r'); break;
|
case 'r': buff.push_back('\r'); break;
|
||||||
case 't': buff.push_back('\t'); break;
|
case 't': buff.push_back('\t'); break;
|
||||||
case '\n': case '\r': break;
|
|
||||||
default: syntaxError("invalid escape character");
|
default: syntaxError("invalid escape character");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -5217,9 +5259,9 @@ public:
|
|||||||
return _Str(buff.data(), buff.size());
|
return _Str(buff.data(), buff.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
void eatString(char quote, bool fstr) {
|
void eatString(char quote, StringType type) {
|
||||||
_Str s = eatStringUntil(quote);
|
_Str s = eatStringUntil(quote, type == RAW_STRING);
|
||||||
if(fstr){
|
if(type == F_STRING){
|
||||||
parser->setNextToken(TK("@fstr"), vm->PyStr(s));
|
parser->setNextToken(TK("@fstr"), vm->PyStr(s));
|
||||||
}else{
|
}else{
|
||||||
parser->setNextToken(TK("@str"), vm->PyStr(s));
|
parser->setNextToken(TK("@str"), vm->PyStr(s));
|
||||||
@ -5272,7 +5314,7 @@ public:
|
|||||||
parser->token_start = parser->current_char;
|
parser->token_start = parser->current_char;
|
||||||
char c = parser->eatCharIncludeNewLine();
|
char c = parser->eatCharIncludeNewLine();
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case '\'': case '"': eatString(c, false); return;
|
case '\'': case '"': eatString(c, NORMAL_STRING); return;
|
||||||
case '#': parser->skipLineComment(); break;
|
case '#': parser->skipLineComment(); break;
|
||||||
case '{': parser->setNextToken(TK("{")); return;
|
case '{': parser->setNextToken(TK("{")); return;
|
||||||
case '}': parser->setNextToken(TK("}")); return;
|
case '}': parser->setNextToken(TK("}")); return;
|
||||||
@ -5347,9 +5389,13 @@ public:
|
|||||||
}
|
}
|
||||||
default: {
|
default: {
|
||||||
if(c == 'f'){
|
if(c == 'f'){
|
||||||
if(parser->matchChar('\'')) {eatString('\'', true); return;}
|
if(parser->matchChar('\'')) {eatString('\'', F_STRING); return;}
|
||||||
if(parser->matchChar('"')) {eatString('"', true); return;}
|
if(parser->matchChar('"')) {eatString('"', F_STRING); return;}
|
||||||
|
}else if(c == 'r'){
|
||||||
|
if(parser->matchChar('\'')) {eatString('\'', RAW_STRING); return;}
|
||||||
|
if(parser->matchChar('"')) {eatString('"', RAW_STRING); return;}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (c >= '0' && c <= '9') {
|
if (c >= '0' && c <= '9') {
|
||||||
eatNumber();
|
eatNumber();
|
||||||
return;
|
return;
|
||||||
|
|||||||
@ -1 +1 @@
|
|||||||
Subproject commit 2ddb39495bb1078d5686b35a19645fd6ab4690ee
|
Subproject commit f79c819e0928bddb2714875db6ba142e04f6a4fd
|
||||||
Loading…
x
Reference in New Issue
Block a user