mirror of
				https://github.com/pocketpy/pocketpy
				synced 2025-10-31 08:50: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