1 #ifndef STRINGS_H 2 #define STRINGS_H 3 4 #include <Python.h> 5 #include <Python-ast.h> 6 #include "pegen.h" 7 8 #define EXPRLIST_N_CACHED 64 9 10 typedef struct { 11 /* Incrementally build an array of expr_ty, so be used in an 12 asdl_seq. Cache some small but reasonably sized number of 13 expr_ty's, and then after that start dynamically allocating, 14 doubling the number allocated each time. Note that the f-string 15 f'{0}a{1}' contains 3 expr_ty's: 2 FormattedValue's, and one 16 Constant for the literal 'a'. So you add expr_ty's about twice as 17 fast as you add expressions in an f-string. */ 18 19 Py_ssize_t allocated; /* Number we've allocated. */ 20 Py_ssize_t size; /* Number we've used. */ 21 expr_ty *p; /* Pointer to the memory we're actually 22 using. Will point to 'data' until we 23 start dynamically allocating. */ 24 expr_ty data[EXPRLIST_N_CACHED]; 25 } ExprList; 26 27 /* The FstringParser is designed to add a mix of strings and 28 f-strings, and concat them together as needed. Ultimately, it 29 generates an expr_ty. */ 30 typedef struct { 31 PyObject *last_str; 32 ExprList expr_list; 33 int fmode; 34 } FstringParser; 35 36 void _PyPegen_FstringParser_Init(FstringParser *); 37 int _PyPegen_parsestr(Parser *, int *, int *, PyObject **, 38 const char **, Py_ssize_t *, Token *); 39 int _PyPegen_FstringParser_ConcatFstring(Parser *, FstringParser *, const char **, 40 const char *, int, int, Token *, Token *, 41 Token *); 42 int _PyPegen_FstringParser_ConcatAndDel(FstringParser *, PyObject *); 43 expr_ty _PyPegen_FstringParser_Finish(Parser *, FstringParser *, Token *, Token *); 44 void _PyPegen_FstringParser_Dealloc(FstringParser *); 45 46 #endif 47