8000 gh-124889: Remove redundant artificial rules, some refactoring (#124893) · python/cpython@0a8f197 · GitHub
[go: up one dir, main page]

Skip to content

Commit 0a8f197

Browse files
gh-124889: Remove redundant artificial rules, some refactoring (#124893)
Auxiliary method CCallMakerVisitor._generate_artificial_rule_call is added. Its purpose is abstracting work with artificial rules cache.
1 parent b9f82de commit 0a8f197

File tree

1 file changed

+39
-52
lines changed

1 file changed

+39
-52
lines changed

Tools/peg_generator/pegen/c_generator.py

Lines changed: 39 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import re
44
from dataclasses import dataclass, field
55
from enum import Enum
6-
from typing import IO, Any, Dict, List, Optional, Set, Text, Tuple
6+
from typing import IO, Any, Callable, Dict, List, Optional, Set, Text, Tuple
77

88
from pegen import grammar
99
from pegen.grammar import (
@@ -206,25 +206,6 @@ def visit_StringLeaf(self, node: StringLeaf) -> FunctionCall:
206206
comment=f"token='{val}'",
207207
)
208208

209-
def visit_Rhs(self, node: Rhs) -> FunctionCall:
210-
if node.can_be_inlined:
211-
return self.generate_call(node.alts[0].items[0])
212-
213-
node_str = f"{node}"
214-
key = f"rhs_{node_str}"
215-
if key in self.cache:
216-
name = self.cache[key]
217-
else:
218-
name = self.gen.artificial_rule_from_rhs(node)
219-
self.cache[key] = name
220-
221-
return FunctionCall(
222-
assigned_variable=f"{name}_var",
223-
function=f"{name}_rule",
224-
arguments=["p"],
225-
comment=node_str,
226-
)
227-
228209
def visit_NamedItem(self, node: NamedItem) -> FunctionCall:
229210
call = self.generate_call(node.item)
230211
if node.name:
@@ -306,55 +287,61 @@ def visit_Opt(self, node: Opt) -> FunctionCall:
306287
comment=f"{node}",
307288
)
308289

309-
def visit_Repeat0(self, node: Repeat0) -> FunctionCall:
290+
def _generate_artificial_rule_call(
291+
self,
292+
node: Any,
293+
prefix: str,
294+
rule_generation_func: Callable[[], str],
295+
return_type: Optional[str] = None,
296+
) -> FunctionCall:
310297
node_str = f"{node}"
311-
key = f"repeat0_{node_str}"
298+
key = f"{prefix}_{node_str}"
312299
if key in self.cache:
313300
name = self.cache[key]
314301
else:
315-
name = self.gen.artificial_rule_from_repeat(node.node, False)
302+
name = rule_generation_func()
316303
self.cache[key] = name
317304

318305
return FunctionCall(
319306
assigned_variable=f"{name}_var",
320307
function=f"{name}_rule",
321308
arguments=["p"],
322-
return_type="asdl_seq *",
309+
return_type=return_type,
323310
comment=node_str,
324311
)
325312

326-
def visit_Repeat1(self, node: Repeat1) -> FunctionCall:
327-
node_str = f"{node}"
328-
key = f"repeat1_{node_str}"
329-
if key in self.cache:
330-
name = self.cache[key]
331-
else:
332-
name = self.gen.artificial_rule_from_repeat(node.node, True)
333-
self.cache[key] = name
313+
def visit_Rhs(self, node: Rhs) -> FunctionCall:
314+
if node.can_be_inlined:
315+
return self.generate_call(node.alts[0].items[0])
334316

335-
return FunctionCall(
336-
assigned_variable=f"{name}_var",
337-
function=f"{name}_rule",
338-
arguments=["p"],
339-
return_type="asdl_seq *",
340-
comment=node_str,
317+
return self._generate_artificial_rule_call(
318+
node,
319+
"rhs",
320+
lambda: self.gen.artificial_rule_from_rhs(node),
341321
)
342322

343-
def visit_Gather(self, node: Gather) -> FunctionCall:
344-
node_str = f"{node}"
345-
key = f"gather_{node_str}"
346-
if key in self.cache:
347-
name = self.cache[key]
348-
else:
349-
name = self.gen.artificial_rule_from_gather(node)
350-
self.cache[key] = name
323+
def visit_Repeat0(self, node: Repeat0) -> FunctionCall:
324+
return self._generate_artificial_rule_call(
325+
node,
326+
"repeat0",
327+
lambda: self.gen.artificial_rule_from_repeat(node.node, False),
328+
"asdl_seq *",
329+
)
351330

352-
return FunctionCall(
353-
assigned_variable=f"{name}_var",
354-
function=f"{name}_rule",
355-
arguments=["p"],
356-
return_type="asdl_seq *",
357-
comment=node_str,
331+
def visit_Repeat1(self, node: Repeat1) -> FunctionCall:
332+
return self._generate_artificial_rule_call(
333+
node,
334+
"repeat1",
335+
lambda: self.gen.artificial_rule_from_repeat(node.node, True),
336+
"asdl_seq *",
337+
)
338+
339+
def visit_Gather(self, node: Gather) -> FunctionCall:
340+
return self._generate_artificial_rule_call(
341+
node,
342+
"gather",
343+
lambda: self.gen.artificial_rule_from_gather(node),
344+
"asdl_seq *",
358345
)
359346

360347
def visit_Group(self, node: Group) -> FunctionCall:

0 commit comments

Comments
 (0)
0