2020-04-23 06:29:27 +08:00
|
|
|
#ifndef PEGEN_H
|
|
|
|
#define PEGEN_H
|
|
|
|
|
|
|
|
#include <Python.h>
|
2021-03-24 03:47:40 +08:00
|
|
|
#include <pycore_ast.h>
|
2022-05-12 05:22:50 +08:00
|
|
|
#include <pycore_token.h>
|
2020-04-23 06:29:27 +08:00
|
|
|
|
2020-04-28 01:02:07 +08:00
|
|
|
#if 0
|
|
|
|
#define PyPARSE_YIELD_IS_KEYWORD 0x0001
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#define PyPARSE_DONT_IMPLY_DEDENT 0x0002
|
|
|
|
|
|
|
|
#if 0
|
|
|
|
#define PyPARSE_WITH_IS_KEYWORD 0x0003
|
|
|
|
#define PyPARSE_PRINT_IS_FUNCTION 0x0004
|
|
|
|
#define PyPARSE_UNICODE_LITERALS 0x0008
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#define PyPARSE_IGNORE_COOKIE 0x0010
|
|
|
|
#define PyPARSE_BARRY_AS_BDFL 0x0020
|
|
|
|
#define PyPARSE_TYPE_COMMENTS 0x0040
|
2022-02-08 19:54:37 +08:00
|
|
|
#define PyPARSE_ALLOW_INCOMPLETE_INPUT 0x0100
|
2020-04-28 01:02:07 +08:00
|
|
|
|
2021-11-21 09:08:50 +08:00
|
|
|
#define CURRENT_POS (-5)
|
|
|
|
|
2020-04-23 06:29:27 +08:00
|
|
|
typedef struct _memo {
|
|
|
|
int type;
|
|
|
|
void *node;
|
|
|
|
int mark;
|
|
|
|
struct _memo *next;
|
|
|
|
} Memo;
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
int type;
|
|
|
|
PyObject *bytes;
|
2021-11-25 06:21:23 +08:00
|
|
|
int level;
|
2020-06-20 20:57:27 +08:00
|
|
|
int lineno, col_offset, end_lineno, end_col_offset;
|
2020-04-23 06:29:27 +08:00
|
|
|
Memo *memo;
|
2023-04-27 09:33:31 +08:00
|
|
|
PyObject *metadata;
|
2020-04-23 06:29:27 +08:00
|
|
|
} Token;
|
|
|
|
|
|
|
|
typedef struct {
|
2023-01-19 05:02:48 +08:00
|
|
|
const char *str;
|
2020-04-23 06:29:27 +08:00
|
|
|
int type;
|
|
|
|
} KeywordToken;
|
|
|
|
|
2020-05-01 03:12:19 +08:00
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
struct {
|
|
|
|
int lineno;
|
|
|
|
char *comment; // The " <tag>" in "# type: ignore <tag>"
|
|
|
|
} *items;
|
|
|
|
size_t size;
|
|
|
|
size_t num_items;
|
|
|
|
} growable_comment_array;
|
|
|
|
|
2020-04-23 06:29:27 +08:00
|
|
|
typedef struct {
|
|
|
|
struct tok_state *tok;
|
|
|
|
Token **tokens;
|
|
|
|
int mark;
|
|
|
|
int fill, size;
|
|
|
|
PyArena *arena;
|
|
|
|
KeywordToken **keywords;
|
2021-04-16 04:38:45 +08:00
|
|
|
char **soft_keywords;
|
2020-04-23 06:29:27 +08:00
|
|
|
int n_keyword_lists;
|
|
|
|
int start_rule;
|
|
|
|
int *errcode;
|
|
|
|
int parsing_started;
|
|
|
|
PyObject* normalize;
|
|
|
|
int starting_lineno;
|
|
|
|
int starting_col_offset;
|
|
|
|
int error_indicator;
|
2020-04-28 01:02:07 +08:00
|
|
|
int flags;
|
2020-05-01 11:27:52 +08:00
|
|
|
int feature_version;
|
2020-05-01 03:12:19 +08:00
|
|
|
growable_comment_array type_ignore_comments;
|
2020-05-07 18:37:51 +08:00
|
|
|
Token *known_err_token;
|
2020-05-26 01:38:45 +08:00
|
|
|
int level;
|
2020-10-27 06:42:04 +08:00
|
|
|
int call_invalid_rules;
|
2022-05-25 04:35:08 +08:00
|
|
|
int debug;
|
2020-04-23 06:29:27 +08:00
|
|
|
} Parser;
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
cmpop_ty cmpop;
|
|
|
|
expr_ty expr;
|
|
|
|
} CmpopExprPair;
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
expr_ty key;
|
|
|
|
expr_ty value;
|
|
|
|
} KeyValuePair;
|
|
|
|
|
2021-04-29 13:58:44 +08:00
|
|
|
typedef struct {
|
|
|
|
expr_ty key;
|
|
|
|
pattern_ty pattern;
|
|
|
|
} KeyPatternPair;
|
|
|
|
|
2020-04-23 06:29:27 +08:00
|
|
|
typedef struct {
|
|
|
|
arg_ty arg;
|
|
|
|
expr_ty value;
|
|
|
|
} NameDefaultPair;
|
|
|
|
|
|
|
|
typedef struct {
|
2020-09-17 02:42:00 +08:00
|
|
|
asdl_arg_seq *plain_names;
|
2020-04-23 06:29:27 +08:00
|
|
|
asdl_seq *names_with_defaults; // asdl_seq* of NameDefaultsPair's
|
|
|
|
} SlashWithDefault;
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
arg_ty vararg;
|
|
|
|
asdl_seq *kwonlyargs; // asdl_seq* of NameDefaultsPair's
|
|
|
|
arg_ty kwarg;
|
|
|
|
} StarEtc;
|
|
|
|
|
2021-03-24 03:47:40 +08:00
|
|
|
typedef struct { operator_ty kind; } AugOperator;
|
2020-04-23 06:29:27 +08:00
|
|
|
typedef struct {
|
|
|
|
void *element;
|
|
|
|
int is_keyword;
|
|
|
|
} KeywordOrStarred;
|
|
|
|
|
2023-04-27 09:33:31 +08:00
|
|
|
typedef struct {
|
|
|
|
void *result;
|
|
|
|
PyObject *metadata;
|
|
|
|
} ResultTokenWithMetadata;
|
|
|
|
|
2021-11-21 09:08:50 +08:00
|
|
|
// Internal parser functions
|
2021-04-09 08:17:31 +08:00
|
|
|
#if defined(Py_DEBUG)
|
2020-04-23 06:29:27 +08:00
|
|
|
void _PyPegen_clear_memo_statistics(void);
|
|
|
|
PyObject *_PyPegen_get_memo_statistics(void);
|
2021-04-09 08:17:31 +08:00
|
|
|
#endif
|
2020-04-23 06:29:27 +08:00
|
|
|
|
|
|
|
int _PyPegen_insert_memo(Parser *p, int mark, int type, void *node);
|
|
|
|
int _PyPegen_update_memo(Parser *p, int mark, int type, void *node);
|
|
|
|
int _PyPegen_is_memoized(Parser *p, int type, void *pres);
|
|
|
|
|
2020-04-23 19:42:13 +08:00
|
|
|
int _PyPegen_lookahead_with_name(int, expr_ty (func)(Parser *), Parser *);
|
2020-04-23 06:29:27 +08:00
|
|
|
int _PyPegen_lookahead_with_int(int, Token *(func)(Parser *, int), Parser *, int);
|
2020-05-27 07:15:52 +08:00
|
|
|
int _PyPegen_lookahead_with_string(int , expr_ty (func)(Parser *, const char*), Parser *, const char*);
|
2020-04-23 06:29:27 +08:00
|
|
|
int _PyPegen_lookahead(int, void *(func)(Parser *), Parser *);
|
|
|
|
|
|
|
|
Token *_PyPegen_expect_token(Parser *p, int type);
|
2021-08-13 00:37:30 +08:00
|
|
|
void* _PyPegen_expect_forced_result(Parser *p, void* result, const char* expected);
|
2021-02-03 03:54:22 +08:00
|
|
|
Token *_PyPegen_expect_forced_token(Parser *p, int type, const char* expected);
|
2020-05-27 01:58:44 +08:00
|
|
|
expr_ty _PyPegen_expect_soft_keyword(Parser *p, const char *keyword);
|
2021-04-16 04:38:45 +08:00
|
|
|
expr_ty _PyPegen_soft_keyword_token(Parser *p);
|
2023-04-20 00:18:16 +08:00
|
|
|
expr_ty _PyPegen_fstring_middle_token(Parser* p);
|
2020-04-23 06:29:27 +08:00
|
|
|
Token *_PyPegen_get_last_nonnwhitespace_token(Parser *);
|
|
|
|
int _PyPegen_fill_token(Parser *p);
|
|
|
|
expr_ty _PyPegen_name_token(Parser *p);
|
|
|
|
expr_ty _PyPegen_number_token(Parser *p);
|
|
|
|
void *_PyPegen_string_token(Parser *p);
|
2021-07-05 07:14:33 +08:00
|
|
|
Py_ssize_t _PyPegen_byte_offset_to_character_offset(PyObject *line, Py_ssize_t col_offset);
|
2021-11-21 09:08:50 +08:00
|
|
|
|
|
|
|
// Error handling functions and APIs
|
|
|
|
typedef enum {
|
|
|
|
STAR_TARGETS,
|
|
|
|
DEL_TARGETS,
|
|
|
|
FOR_TARGETS
|
|
|
|
} TARGETS_TYPE;
|
|
|
|
|
|
|
|
int _Pypegen_raise_decode_error(Parser *p);
|
|
|
|
void _PyPegen_raise_tokenizer_init_error(PyObject *filename);
|
|
|
|
int _Pypegen_tokenizer_error(Parser *p);
|
2023-04-20 00:18:16 +08:00
|
|
|
void *_PyPegen_raise_error(Parser *p, PyObject *errtype, int use_mark, const char *errmsg, ...);
|
2020-05-14 03:36:27 +08:00
|
|
|
void *_PyPegen_raise_error_known_location(Parser *p, PyObject *errtype,
|
2020-06-16 23:49:43 +08:00
|
|
|
Py_ssize_t lineno, Py_ssize_t col_offset,
|
bpo-43914: Highlight invalid ranges in SyntaxErrors (#25525)
To improve the user experience understanding what part of the error messages associated with SyntaxErrors is wrong, we can highlight the whole error range and not only place the caret at the first character. In this way:
>>> foo(x, z for z in range(10), t, w)
File "<stdin>", line 1
foo(x, z for z in range(10), t, w)
^
SyntaxError: Generator expression must be parenthesized
becomes
>>> foo(x, z for z in range(10), t, w)
File "<stdin>", line 1
foo(x, z for z in range(10), t, w)
^^^^^^^^^^^^^^^^^^^^
SyntaxError: Generator expression must be parenthesized
2021-04-23 21:27:05 +08:00
|
|
|
Py_ssize_t end_lineno, Py_ssize_t end_col_offset,
|
2020-05-14 03:36:27 +08:00
|
|
|
const char *errmsg, va_list va);
|
2021-11-21 09:08:50 +08:00
|
|
|
void _Pypegen_set_syntax_error(Parser* p, Token* last_token);
|
2020-05-14 03:36:27 +08:00
|
|
|
Py_LOCAL_INLINE(void *)
|
2021-03-23 01:28:11 +08:00
|
|
|
RAISE_ERROR_KNOWN_LOCATION(Parser *p, PyObject *errtype,
|
|
|
|
Py_ssize_t lineno, Py_ssize_t col_offset,
|
2021-04-30 08:19:28 +08:00
|
|
|
Py_ssize_t end_lineno, Py_ssize_t end_col_offset,
|
2021-03-23 01:28:11 +08:00
|
|
|
const char *errmsg, ...)
|
2020-05-14 03:36:27 +08:00
|
|
|
{
|
|
|
|
va_list va;
|
|
|
|
va_start(va, errmsg);
|
bpo-43914: Highlight invalid ranges in SyntaxErrors (#25525)
To improve the user experience understanding what part of the error messages associated with SyntaxErrors is wrong, we can highlight the whole error range and not only place the caret at the first character. In this way:
>>> foo(x, z for z in range(10), t, w)
File "<stdin>", line 1
foo(x, z for z in range(10), t, w)
^
SyntaxError: Generator expression must be parenthesized
becomes
>>> foo(x, z for z in range(10), t, w)
File "<stdin>", line 1
foo(x, z for z in range(10), t, w)
^^^^^^^^^^^^^^^^^^^^
SyntaxError: Generator expression must be parenthesized
2021-04-23 21:27:05 +08:00
|
|
|
Py_ssize_t _col_offset = (col_offset == CURRENT_POS ? CURRENT_POS : col_offset + 1);
|
|
|
|
Py_ssize_t _end_col_offset = (end_col_offset == CURRENT_POS ? CURRENT_POS : end_col_offset + 1);
|
|
|
|
_PyPegen_raise_error_known_location(p, errtype, lineno, _col_offset, end_lineno, _end_col_offset, errmsg, va);
|
2020-05-14 03:36:27 +08:00
|
|
|
va_end(va);
|
|
|
|
return NULL;
|
|
|
|
}
|
2023-04-20 00:18:16 +08:00
|
|
|
#define RAISE_SYNTAX_ERROR(msg, ...) _PyPegen_raise_error(p, PyExc_SyntaxError, 0, msg, ##__VA_ARGS__)
|
|
|
|
#define RAISE_INDENTATION_ERROR(msg, ...) _PyPegen_raise_error(p, PyExc_IndentationError, 0, msg, ##__VA_ARGS__)
|
|
|
|
#define RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN(msg, ...) _PyPegen_raise_error(p, PyExc_SyntaxError, 1, msg, ##__VA_ARGS__)
|
bpo-43914: Highlight invalid ranges in SyntaxErrors (#25525)
To improve the user experience understanding what part of the error messages associated with SyntaxErrors is wrong, we can highlight the whole error range and not only place the caret at the first character. In this way:
>>> foo(x, z for z in range(10), t, w)
File "<stdin>", line 1
foo(x, z for z in range(10), t, w)
^
SyntaxError: Generator expression must be parenthesized
becomes
>>> foo(x, z for z in range(10), t, w)
File "<stdin>", line 1
foo(x, z for z in range(10), t, w)
^^^^^^^^^^^^^^^^^^^^
SyntaxError: Generator expression must be parenthesized
2021-04-23 21:27:05 +08:00
|
|
|
#define RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, msg, ...) \
|
|
|
|
RAISE_ERROR_KNOWN_LOCATION(p, PyExc_SyntaxError, (a)->lineno, (a)->col_offset, (b)->end_lineno, (b)->end_col_offset, msg, ##__VA_ARGS__)
|
2020-05-14 03:36:27 +08:00
|
|
|
#define RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, msg, ...) \
|
bpo-43914: Highlight invalid ranges in SyntaxErrors (#25525)
To improve the user experience understanding what part of the error messages associated with SyntaxErrors is wrong, we can highlight the whole error range and not only place the caret at the first character. In this way:
>>> foo(x, z for z in range(10), t, w)
File "<stdin>", line 1
foo(x, z for z in range(10), t, w)
^
SyntaxError: Generator expression must be parenthesized
becomes
>>> foo(x, z for z in range(10), t, w)
File "<stdin>", line 1
foo(x, z for z in range(10), t, w)
^^^^^^^^^^^^^^^^^^^^
SyntaxError: Generator expression must be parenthesized
2021-04-23 21:27:05 +08:00
|
|
|
RAISE_ERROR_KNOWN_LOCATION(p, PyExc_SyntaxError, (a)->lineno, (a)->col_offset, (a)->end_lineno, (a)->end_col_offset, msg, ##__VA_ARGS__)
|
|
|
|
#define RAISE_SYNTAX_ERROR_STARTING_FROM(a, msg, ...) \
|
|
|
|
RAISE_ERROR_KNOWN_LOCATION(p, PyExc_SyntaxError, (a)->lineno, (a)->col_offset, CURRENT_POS, CURRENT_POS, msg, ##__VA_ARGS__)
|
2021-11-21 09:08:50 +08:00
|
|
|
#define RAISE_SYNTAX_ERROR_INVALID_TARGET(type, e) _RAISE_SYNTAX_ERROR_INVALID_TARGET(p, type, e)
|
2020-04-23 06:29:27 +08:00
|
|
|
|
|
|
|
Py_LOCAL_INLINE(void *)
|
|
|
|
CHECK_CALL(Parser *p, void *result)
|
|
|
|
{
|
|
|
|
if (result == NULL) {
|
|
|
|
assert(PyErr_Occurred());
|
|
|
|
p->error_indicator = 1;
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* This is needed for helper functions that are allowed to
|
|
|
|
return NULL without an error. Example: _PyPegen_seq_extract_starred_exprs */
|
|
|
|
Py_LOCAL_INLINE(void *)
|
|
|
|
CHECK_CALL_NULL_ALLOWED(Parser *p, void *result)
|
|
|
|
{
|
|
|
|
if (result == NULL && PyErr_Occurred()) {
|
|
|
|
p->error_indicator = 1;
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2020-10-22 03:53:14 +08:00
|
|
|
#define CHECK(type, result) ((type) CHECK_CALL(p, result))
|
|
|
|
#define CHECK_NULL_ALLOWED(type, result) ((type) CHECK_CALL_NULL_ALLOWED(p, result))
|
2020-04-23 06:29:27 +08:00
|
|
|
|
2021-11-21 09:08:50 +08:00
|
|
|
expr_ty _PyPegen_get_invalid_target(expr_ty e, TARGETS_TYPE targets_type);
|
|
|
|
const char *_PyPegen_get_expr_name(expr_ty);
|
|
|
|
Py_LOCAL_INLINE(void *)
|
|
|
|
_RAISE_SYNTAX_ERROR_INVALID_TARGET(Parser *p, TARGETS_TYPE type, void *e)
|
|
|
|
{
|
|
|
|
expr_ty invalid_target = CHECK_NULL_ALLOWED(expr_ty, _PyPegen_get_invalid_target(e, type));
|
|
|
|
if (invalid_target != NULL) {
|
|
|
|
const char *msg;
|
|
|
|
if (type == STAR_TARGETS || type == FOR_TARGETS) {
|
|
|
|
msg = "cannot assign to %s";
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
msg = "cannot delete %s";
|
|
|
|
}
|
|
|
|
return RAISE_SYNTAX_ERROR_KNOWN_LOCATION(
|
|
|
|
invalid_target,
|
|
|
|
msg,
|
|
|
|
_PyPegen_get_expr_name(invalid_target)
|
|
|
|
);
|
2021-12-07 21:02:15 +08:00
|
|
|
return RAISE_SYNTAX_ERROR_KNOWN_LOCATION(invalid_target, "invalid syntax");
|
2021-11-21 09:08:50 +08:00
|
|
|
}
|
2021-12-07 21:02:15 +08:00
|
|
|
return NULL;
|
2021-11-21 09:08:50 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// Action utility functions
|
|
|
|
|
|
|
|
void *_PyPegen_dummy_name(Parser *p, ...);
|
|
|
|
void * _PyPegen_seq_last_item(asdl_seq *seq);
|
|
|
|
#define PyPegen_last_item(seq, type) ((type)_PyPegen_seq_last_item((asdl_seq*)seq))
|
|
|
|
void * _PyPegen_seq_first_item(asdl_seq *seq);
|
|
|
|
#define PyPegen_first_item(seq, type) ((type)_PyPegen_seq_first_item((asdl_seq*)seq))
|
|
|
|
#define UNUSED(expr) do { (void)(expr); } while (0)
|
|
|
|
#define EXTRA_EXPR(head, tail) head->lineno, (head)->col_offset, (tail)->end_lineno, (tail)->end_col_offset, p->arena
|
|
|
|
#define EXTRA _start_lineno, _start_col_offset, _end_lineno, _end_col_offset, p->arena
|
2021-06-12 21:11:59 +08:00
|
|
|
PyObject *_PyPegen_new_type_comment(Parser *, const char *);
|
2020-05-01 03:12:19 +08:00
|
|
|
|
|
|
|
Py_LOCAL_INLINE(PyObject *)
|
|
|
|
NEW_TYPE_COMMENT(Parser *p, Token *tc)
|
|
|
|
{
|
|
|
|
if (tc == NULL) {
|
|
|
|
return NULL;
|
|
|
|
}
|
2021-06-12 21:11:59 +08:00
|
|
|
const char *bytes = PyBytes_AsString(tc->bytes);
|
2020-05-01 03:12:19 +08:00
|
|
|
if (bytes == NULL) {
|
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
PyObject *tco = _PyPegen_new_type_comment(p, bytes);
|
|
|
|
if (tco == NULL) {
|
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
return tco;
|
|
|
|
error:
|
|
|
|
p->error_indicator = 1; // Inline CHECK_CALL
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2020-05-01 11:27:52 +08:00
|
|
|
Py_LOCAL_INLINE(void *)
|
|
|
|
INVALID_VERSION_CHECK(Parser *p, int version, char *msg, void *node)
|
|
|
|
{
|
|
|
|
if (node == NULL) {
|
|
|
|
p->error_indicator = 1; // Inline CHECK_CALL
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
if (p->feature_version < version) {
|
|
|
|
p->error_indicator = 1;
|
2020-05-01 21:13:43 +08:00
|
|
|
return RAISE_SYNTAX_ERROR("%s only supported in Python 3.%i and greater",
|
|
|
|
msg, version);
|
2020-05-01 11:27:52 +08:00
|
|
|
}
|
|
|
|
return node;
|
|
|
|
}
|
|
|
|
|
2020-10-22 03:53:14 +08:00
|
|
|
#define CHECK_VERSION(type, version, msg, node) ((type) INVALID_VERSION_CHECK(p, version, msg, node))
|
2020-05-01 11:27:52 +08:00
|
|
|
|
2020-05-01 03:12:19 +08:00
|
|
|
arg_ty _PyPegen_add_type_comment_to_arg(Parser *, arg_ty, Token *);
|
2021-06-12 21:11:59 +08:00
|
|
|
PyObject *_PyPegen_new_identifier(Parser *, const char *);
|
2020-04-23 06:29:27 +08:00
|
|
|
asdl_seq *_PyPegen_singleton_seq(Parser *, void *);
|
|
|
|
asdl_seq *_PyPegen_seq_insert_in_front(Parser *, void *, asdl_seq *);
|
2020-05-01 03:12:19 +08:00
|
|
|
asdl_seq *_PyPegen_seq_append_to_end(Parser *, asdl_seq *, void *);
|
2020-04-23 06:29:27 +08:00
|
|
|
asdl_seq *_PyPegen_seq_flatten(Parser *, asdl_seq *);
|
|
|
|
expr_ty _PyPegen_join_names_with_dot(Parser *, expr_ty, expr_ty);
|
|
|
|
int _PyPegen_seq_count_dots(asdl_seq *);
|
2021-04-11 04:56:28 +08:00
|
|
|
alias_ty _PyPegen_alias_for_star(Parser *, int, int, int, int, PyArena *);
|
2020-09-17 02:42:00 +08:00
|
|
|
asdl_identifier_seq *_PyPegen_map_names_to_ids(Parser *, asdl_expr_seq *);
|
2020-04-23 06:29:27 +08:00
|
|
|
CmpopExprPair *_PyPegen_cmpop_expr_pair(Parser *, cmpop_ty, expr_ty);
|
|
|
|
asdl_int_seq *_PyPegen_get_cmpops(Parser *p, asdl_seq *);
|
2020-09-17 02:42:00 +08:00
|
|
|
asdl_expr_seq *_PyPegen_get_exprs(Parser *, asdl_seq *);
|
2020-04-23 06:29:27 +08:00
|
|
|
expr_ty _PyPegen_set_expr_context(Parser *, expr_ty, expr_context_ty);
|
|
|
|
KeyValuePair *_PyPegen_key_value_pair(Parser *, expr_ty, expr_ty);
|
2020-09-17 02:42:00 +08:00
|
|
|
asdl_expr_seq *_PyPegen_get_keys(Parser *, asdl_seq *);
|
|
|
|
asdl_expr_seq *_PyPegen_get_values(Parser *, asdl_seq *);
|
2021-04-29 13:58:44 +08:00
|
|
|
KeyPatternPair *_PyPegen_key_pattern_pair(Parser *, expr_ty, pattern_ty);
|
|
|
|
asdl_expr_seq *_PyPegen_get_pattern_keys(Parser *, asdl_seq *);
|
|
|
|
asdl_pattern_seq *_PyPegen_get_patterns(Parser *, asdl_seq *);
|
2020-05-01 03:12:19 +08:00
|
|
|
NameDefaultPair *_PyPegen_name_default_pair(Parser *, arg_ty, expr_ty, Token *);
|
2020-09-17 02:42:00 +08:00
|
|
|
SlashWithDefault *_PyPegen_slash_with_default(Parser *, asdl_arg_seq *, asdl_seq *);
|
2020-04-23 06:29:27 +08:00
|
|
|
StarEtc *_PyPegen_star_etc(Parser *, arg_ty, asdl_seq *, arg_ty);
|
2020-09-17 02:42:00 +08:00
|
|
|
arguments_ty _PyPegen_make_arguments(Parser *, asdl_arg_seq *, SlashWithDefault *,
|
|
|
|
asdl_arg_seq *, asdl_seq *, StarEtc *);
|
2020-04-23 06:29:27 +08:00
|
|
|
arguments_ty _PyPegen_empty_arguments(Parser *);
|
2023-04-27 09:33:31 +08:00
|
|
|
expr_ty _PyPegen_formatted_value(Parser *, expr_ty, Token *, ResultTokenWithMetadata *, ResultTokenWithMetadata *, Token *,
|
|
|
|
int, int, int, int, PyArena *);
|
2020-04-23 06:29:27 +08:00
|
|
|
AugOperator *_PyPegen_augoperator(Parser*, operator_ty type);
|
2020-09-17 02:42:00 +08:00
|
|
|
stmt_ty _PyPegen_function_def_decorators(Parser *, asdl_expr_seq *, stmt_ty);
|
|
|
|
stmt_ty _PyPegen_class_def_decorators(Parser *, asdl_expr_seq *, stmt_ty);
|
2020-04-23 06:29:27 +08:00
|
|
|
KeywordOrStarred *_PyPegen_keyword_or_starred(Parser *, void *, int);
|
2020-09-17 02:42:00 +08:00
|
|
|
asdl_expr_seq *_PyPegen_seq_extract_starred_exprs(Parser *, asdl_seq *);
|
|
|
|
asdl_keyword_seq *_PyPegen_seq_delete_starred_exprs(Parser *, asdl_seq *);
|
|
|
|
expr_ty _PyPegen_collect_call_seqs(Parser *, asdl_expr_seq *, asdl_seq *,
|
2020-09-03 22:29:32 +08:00
|
|
|
int lineno, int col_offset, int end_lineno,
|
|
|
|
int end_col_offset, PyArena *arena);
|
2023-04-20 00:18:16 +08:00
|
|
|
expr_ty _PyPegen_constant_from_token(Parser* p, Token* tok);
|
2023-06-02 19:33:26 +08:00
|
|
|
expr_ty _PyPegen_decoded_constant_from_token(Parser* p, Token* tok);
|
2023-04-20 00:18:16 +08:00
|
|
|
expr_ty _PyPegen_constant_from_string(Parser* p, Token* tok);
|
|
|
|
expr_ty _PyPegen_concatenate_strings(Parser *p, asdl_expr_seq *, int, int, int, int, PyArena *);
|
|
|
|
expr_ty _PyPegen_FetchRawForm(Parser *p, int, int, int, int);
|
2021-04-29 13:58:44 +08:00
|
|
|
expr_ty _PyPegen_ensure_imaginary(Parser *p, expr_ty);
|
2021-04-30 08:19:28 +08:00
|
|
|
expr_ty _PyPegen_ensure_real(Parser *p, expr_ty);
|
2020-04-23 06:29:27 +08:00
|
|
|
asdl_seq *_PyPegen_join_sequences(Parser *, asdl_seq *, asdl_seq *);
|
2020-10-31 07:48:42 +08:00
|
|
|
int _PyPegen_check_barry_as_flufl(Parser *, Token *);
|
2021-07-28 00:19:22 +08:00
|
|
|
int _PyPegen_check_legacy_stmt(Parser *p, expr_ty t);
|
2023-04-27 09:33:31 +08:00
|
|
|
ResultTokenWithMetadata *_PyPegen_check_fstring_conversion(Parser *p, Token *, expr_ty t);
|
|
|
|
ResultTokenWithMetadata *_PyPegen_setup_full_format_spec(Parser *, Token *, asdl_expr_seq *, int, int,
|
|
|
|
int, int, PyArena *);
|
2020-09-17 02:42:00 +08:00
|
|
|
mod_ty _PyPegen_make_module(Parser *, asdl_stmt_seq *);
|
2020-05-19 03:14:47 +08:00
|
|
|
void *_PyPegen_arguments_parsing_error(Parser *, expr_ty);
|
2022-04-05 21:47:13 +08:00
|
|
|
expr_ty _PyPegen_get_last_comprehension_item(comprehension_ty comprehension);
|
2021-09-27 21:37:43 +08:00
|
|
|
void *_PyPegen_nonparen_genexp_in_call(Parser *p, expr_ty args, asdl_comprehension_seq *comprehensions);
|
2020-05-19 03:14:47 +08:00
|
|
|
|
2021-11-21 09:08:50 +08:00
|
|
|
// Parser API
|
|
|
|
|
|
|
|
Parser *_PyPegen_Parser_New(struct tok_state *, int, int, int, int *, PyArena *);
|
|
|
|
void _PyPegen_Parser_Free(Parser *);
|
|
|
|
mod_ty _PyPegen_run_parser_from_file_pointer(FILE *, int, PyObject *, const char *,
|
|
|
|
const char *, const char *, PyCompilerFlags *, int *, PyArena *);
|
|
|
|
void *_PyPegen_run_parser(Parser *);
|
|
|
|
mod_ty _PyPegen_run_parser_from_string(const char *, int, PyObject *, PyCompilerFlags *, PyArena *);
|
|
|
|
asdl_stmt_seq *_PyPegen_interactive_exit(Parser *);
|
2020-05-15 09:04:52 +08:00
|
|
|
|
2023-04-20 00:18:16 +08:00
|
|
|
// TODO: move to the correct place in this file
|
|
|
|
expr_ty _PyPegen_joined_str(Parser *p, Token* a, asdl_expr_seq* expr, Token*b);
|
|
|
|
|
2020-06-19 07:10:43 +08:00
|
|
|
// Generated function in parse.c - function definition in python.gram
|
2020-04-23 06:29:27 +08:00
|
|
|
void *_PyPegen_parse(Parser *);
|
|
|
|
|
|
|
|
#endif
|