mirror of
https://github.com/python/cpython.git
synced 2025-07-28 21:55:21 +00:00
Add soft keywords (GH-20370)
These are like keywords but they only work in context; they are not reserved except when there is an exact match. This would enable things like match statements without reserving `match` (which would be bad for the `re.match()` function and probably lots of other places). Automerge-Triggered-By: @gvanrossum
This commit is contained in:
parent
578c3955e0
commit
b45af1a569
4 changed files with 75 additions and 4 deletions
|
@ -753,6 +753,30 @@ _PyPegen_expect_token(Parser *p, int type)
|
|||
return t;
|
||||
}
|
||||
|
||||
expr_ty
|
||||
_PyPegen_expect_soft_keyword(Parser *p, const char *keyword)
|
||||
{
|
||||
if (p->mark == p->fill) {
|
||||
if (_PyPegen_fill_token(p) < 0) {
|
||||
p->error_indicator = 1;
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
Token *t = p->tokens[p->mark];
|
||||
if (t->type != NAME) {
|
||||
return NULL;
|
||||
}
|
||||
char* s = PyBytes_AsString(t->bytes);
|
||||
if (!s) {
|
||||
return NULL;
|
||||
}
|
||||
if (strcmp(s, keyword) != 0) {
|
||||
return NULL;
|
||||
}
|
||||
expr_ty res = _PyPegen_name_token(p);
|
||||
return res;
|
||||
}
|
||||
|
||||
Token *
|
||||
_PyPegen_get_last_nonnwhitespace_token(Parser *p)
|
||||
{
|
||||
|
|
|
@ -122,6 +122,7 @@ int _PyPegen_lookahead_with_int(int, Token *(func)(Parser *, int), Parser *, int
|
|||
int _PyPegen_lookahead(int, void *(func)(Parser *), Parser *);
|
||||
|
||||
Token *_PyPegen_expect_token(Parser *p, int type);
|
||||
expr_ty _PyPegen_expect_soft_keyword(Parser *p, const char *keyword);
|
||||
Token *_PyPegen_get_last_nonnwhitespace_token(Parser *);
|
||||
int _PyPegen_fill_token(Parser *p);
|
||||
expr_ty _PyPegen_name_token(Parser *p);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue