|
3 | 3 | import re
|
4 | 4 | from dataclasses import dataclass, field
|
5 | 5 | 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 |
7 | 7 |
|
8 | 8 | from pegen import grammar
|
9 | 9 | from pegen.grammar import (
|
@@ -206,25 +206,6 @@ def visit_StringLeaf(self, node: StringLeaf) -> FunctionCall:
|
206 | 206 | comment=f"token='{val}'",
|
207 | 207 | )
|
208 | 208 |
|
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 |
| - |
228 | 209 | def visit_NamedItem(self, node: NamedItem) -> FunctionCall:
|
229 | 210 | call = self.generate_call(node.item)
|
230 | 211 | if node.name:
|
@@ -306,55 +287,61 @@ def visit_Opt(self, node: Opt) -> FunctionCall:
|
306 | 287 | comment=f"{node}",
|
307 | 288 | )
|
308 | 289 |
|
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: |
310 | 297 | node_str = f"{node}"
|
311 |
| - key = f"repeat0_{node_str}" |
| 298 | + key = f"{prefix}_{node_str}" |
312 | 299 | if key in self.cache:
|
313 | 300 | name = self.cache[key]
|
314 | 301 | else:
|
315 |
| - name = self.gen.artificial_rule_from_repeat(node.node, False) |
| 302 | + name = rule_generation_func() |
316 | 303 | self.cache[key] = name
|
317 | 304 |
|
318 | 305 | return FunctionCall(
|
319 | 306 | assigned_variable=f"{name}_var",
|
320 | 307 | function=f"{name}_rule",
|
321 | 308 | arguments=["p"],
|
322 |
| - return_type="asdl_seq *", |
| 309 | + return_type=return_type, |
323 | 310 | comment=node_str,
|
324 | 311 | )
|
325 | 312 |
|
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]) |
334 | 316 |
|
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), |
341 | 321 | )
|
342 | 322 |
|
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 | + ) |
351 | 330 |
|
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 *", |
358 | 345 | )
|
359 | 346 |
|
360 | 347 | def visit_Group(self, node: Group) -> FunctionCall:
|
|
0 commit comments