summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Parser/pegen/pegen.c12
-rw-r--r--Parser/pegen/pegen.h1
-rw-r--r--Tools/peg_generator/pegen/build.py2
-rw-r--r--Tools/peg_generator/pegen/c_generator.py4
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})"