diff options
-rw-r--r-- | Parser/pegen/pegen.c | 12 | ||||
-rw-r--r-- | Parser/pegen/pegen.h | 1 | ||||
-rw-r--r-- | Tools/peg_generator/pegen/build.py | 2 | ||||
-rw-r--r-- | Tools/peg_generator/pegen/c_generator.py | 4 |
4 files changed, 17 insertions, 2 deletions
diff --git a/Parser/pegen/pegen.c b/Parser/pegen/pegen.c index 44198ab67b..0b70c950d8 100644 --- a/Parser/pegen/pegen.c +++ b/Parser/pegen/pegen.c @@ -640,6 +640,16 @@ _PyPegen_is_memoized(Parser *p, int type, void *pres) return 0; } + +int +_PyPegen_lookahead_with_name(int positive, expr_ty (func)(Parser *), Parser *p) +{ + int mark = p->mark; + void *res = func(p); + p->mark = mark; + return (res != NULL) == positive; +} + int _PyPegen_lookahead_with_string(int positive, void *(func)(Parser *, const char *), Parser *p, const char *arg) @@ -663,7 +673,7 @@ int _PyPegen_lookahead(int positive, void *(func)(Parser *), Parser *p) { int mark = p->mark; - void *res = func(p); + void *res = (void*)func(p); p->mark = mark; return (res != NULL) == positive; } diff --git a/Parser/pegen/pegen.h b/Parser/pegen/pegen.h index 5acd9883f3..a20ec4a0e4 100644 --- a/Parser/pegen/pegen.h +++ b/Parser/pegen/pegen.h @@ -85,6 +85,7 @@ 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); +int _PyPegen_lookahead_with_name(int, expr_ty (func)(Parser *), Parser *); int _PyPegen_lookahead_with_string(int, void *(func)(Parser *, const char *), Parser *, const char *); int _PyPegen_lookahead_with_int(int, Token *(func)(Parser *, int), Parser *, int); int _PyPegen_lookahead(int, void *(func)(Parser *), Parser *); diff --git a/Tools/peg_generator/pegen/build.py b/Tools/peg_generator/pegen/build.py index c66dc7ed4b..bd792d6607 100644 --- a/Tools/peg_generator/pegen/build.py +++ b/Tools/peg_generator/pegen/build.py @@ -9,6 +9,7 @@ import distutils.log from distutils.core import Distribution, Extension from distutils.command.clean import clean # type: ignore from distutils.command.build_ext import build_ext # type: ignore +from distutils.tests.support import fixup_build_ext from pegen.c_generator import CParserGenerator from pegen.grammar import Grammar @@ -69,6 +70,7 @@ def compile_c_extension( ] dist = Distribution({"name": extension_name, "ext_modules": extension}) cmd = build_ext(dist) + fixup_build_ext(cmd) cmd.inplace = True if build_dir: cmd.build_temp = build_dir diff --git a/Tools/peg_generator/pegen/c_generator.py b/Tools/peg_generator/pegen/c_generator.py index ce732a09f0..5b9d80453c 100644 --- a/Tools/peg_generator/pegen/c_generator.py +++ b/Tools/peg_generator/pegen/c_generator.py @@ -93,7 +93,9 @@ class CCallMakerVisitor(GrammarVisitor): func, args = call.split("(", 1) assert args[-1] == ")" args = args[:-1] - if not args.startswith("p,"): + if "name_token" in call: + return None, f"_PyPegen_lookahead_with_name({positive}, {func}, {args})" + elif not args.startswith("p,"): return None, f"_PyPegen_lookahead({positive}, {func}, {args})" elif args[2:].strip().isalnum(): return None, f"_PyPegen_lookahead_with_int({positive}, {func}, {args})" |