• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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