diff options
Diffstat (limited to 'Tools/peg_generator/pegen/c_generator.py')
| -rw-r--r-- | Tools/peg_generator/pegen/c_generator.py | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/Tools/peg_generator/pegen/c_generator.py b/Tools/peg_generator/pegen/c_generator.py index 6af0d3f7a2..f5ef5d8d33 100644 --- a/Tools/peg_generator/pegen/c_generator.py +++ b/Tools/peg_generator/pegen/c_generator.py @@ -8,6 +8,7 @@ from pegen import grammar from pegen.grammar import ( Alt, Cut, + Forced, Gather, GrammarVisitor, Group, @@ -252,6 +253,24 @@ class CCallMakerVisitor(GrammarVisitor): def visit_NegativeLookahead(self, node: NegativeLookahead) -> FunctionCall: return self.lookahead_call_helper(node, 0) + def visit_Forced(self, node: Forced) -> FunctionCall: + call = self.generate_call(node.node) + if call.nodetype == NodeTypes.GENERIC_TOKEN: + val = ast.literal_eval(node.node.value) + assert val in self.exact_tokens, f"{node.value} is not a known literal" + type = self.exact_tokens[val] + return FunctionCall( + assigned_variable="_literal", + function=f"_PyPegen_expect_forced_token", + arguments=["p", type, f'"{val}"'], + nodetype=NodeTypes.GENERIC_TOKEN, + return_type="Token *", + comment=f"forced_token='{val}'", + ) + else: + raise NotImplementedError( + f"Forced tokens don't work with {call.nodetype} tokens") + def visit_Opt(self, node: Opt) -> FunctionCall: call = self.generate_call(node.node) return FunctionCall( |
