from ast_parser.general_unparser import GeneralUnparser from ast_parser.python_unparser import PythonUnparser, to_python_type, to_python_op from constants import GAZ_TY_KEY, GAZ_TRUE_BLOCK_TAG, GAZ_FALSE_BLOCK_TAG import xml.etree.ElementTree as ET class TinyPyUnparser(GeneralUnparser): def __init__(self, ast: ET.Element, debug=False): super().__init__(ast, debug, endline='\n', outstream_begin_delimiter="gprint(", outstream_end_delimiter=", end='')", function_return_type_indicator_predicate="->", loop_start_delimiter="while ", loop_end_delimiter=":", conditional_case_delimiter="elif ", conditional_start_delimiter="if ", conditional_else_delimiter="else:", conditional_end_delimiter=":", block_start_delimiter="", block_end_delimiter="", # TODO can this contain the pass? strip_conditionals=True) def format_variable(self, mut, ty, name, declaration: bool = False): if declaration: return "{}: {}".format(name, ty) else: return "{}".format(name) def translate_value(self, val): return str(val) def translate_op(self, param, ty=None): return to_python_op(param, ty) def translate_type(self, ty): return to_python_type(ty) def function_declaration(self, xml_tag, args, name, return_type): return "def {}{} {}:".format( name, args, return_type, ) def format_single_arg(self, ty, name): return "{}: {}".format(name, ty) def unparse_block(self, node): # super().unparse_block(node) self.source += f"{self.block_delimiters[0]}\n" self.indentation += 4 for child in node: self.unparse_node(child) self.source += self.indentation_character * self.indentation + "pass\n" self.indentation -= 4 if node.get(GAZ_TY_KEY) is None: self.source += f"{self.block_delimiters[1]}\n\n" elif node.get(GAZ_TY_KEY) in [GAZ_TRUE_BLOCK_TAG, GAZ_FALSE_BLOCK_TAG]: self.source += f"{self.block_delimiters[1]}" def unparse(self): super().unparse() def setup(self): pass