MCPcopy Index your code
hub / github.com/python/cpython / CParserGenerator

Class CParserGenerator

Tools/peg_generator/pegen/c_generator.py:378–894  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

376
377
378class CParserGenerator(ParserGenerator, GrammarVisitor):
379 def __init__(
380 self,
381 grammar: grammar.Grammar,
382 tokens: dict[int, str],
383 exact_tokens: dict[str, int],
384 non_exact_tokens: set[str],
385 file: IO[str] | None,
386 debug: bool = False,
387 skip_actions: bool = False,
388 ):
389 super().__init__(grammar, set(tokens.values()), file)
390 self.callmakervisitor: CCallMakerVisitor = CCallMakerVisitor(
391 self, exact_tokens, non_exact_tokens
392 )
393 self._varname_counter = 0
394 self.debug = debug
395 self.skip_actions = skip_actions
396 self.cleanup_statements: list[str] = []
397
398 def add_level(self) -> None:
399 self.print("if (p->level++ == MAXSTACK || _Py_ReachedRecursionLimitWithMargin(PyThreadState_Get(), 1)) {")
400 with self.indent():
401 self.print("_Pypegen_stack_overflow(p);")
402 self.print("}")
403
404 def remove_level(self) -> None:
405 self.print("p->level--;")
406
407 def add_return(self, ret_val: str) -> None:
408 for stmt in self.cleanup_statements:
409 self.print(stmt)
410 self.remove_level()
411 self.print(f"return {ret_val};")
412
413 def unique_varname(self, name: str = "tmpvar") -> str:
414 new_var = name + "_" + str(self._varname_counter)
415 self._varname_counter += 1
416 return new_var
417
418 def call_with_errorcheck_return(self, call_text: str, returnval: str) -> None:
419 error_var = self.unique_varname()
420 self.print(f"int {error_var} = {call_text};")
421 self.print(f"if ({error_var}) {{")
422 with self.indent():
423 self.add_return(returnval)
424 self.print("}")
425
426 def call_with_errorcheck_goto(self, call_text: str, goto_target: str) -> None:
427 error_var = self.unique_varname()
428 self.print(f"int {error_var} = {call_text};")
429 self.print(f"if ({error_var}) {{")
430 with self.indent():
431 self.print(f"goto {goto_target};")
432 self.print("}")
433
434 def out_of_memory_return(
435 self,

Callers 4

generate_c_parser_sourceFunction · 0.90
build_c_generatorFunction · 0.90
mainFunction · 0.85

Calls

no outgoing calls

Tested by 2

generate_c_parser_sourceFunction · 0.72

Used in the wild real call sites across dependent graphs

searching dependent graphs…