101 lines
2.6 KiB
Python
101 lines
2.6 KiB
Python
import os
|
|
import shutil
|
|
import warnings
|
|
import xml.etree.ElementTree as ET
|
|
|
|
from ast_parser.general_unparser import GeneralUnparser
|
|
from constants import *
|
|
|
|
|
|
def to_gazprea_type(ty: str): # TODO implement the compound types
|
|
if ty == GAZ_INT_KEY:
|
|
return "integer"
|
|
elif ty == GAZ_BOOL_KEY:
|
|
return "boolean"
|
|
elif ty == GAZ_FLOAT_KEY:
|
|
return "real"
|
|
elif ty == GAZ_CHAR_KEY:
|
|
return "character"
|
|
elif ty == GAZ_STRING_KEY:
|
|
return "string[*]"
|
|
else:
|
|
raise Exception("Unknown type: " + ty)
|
|
|
|
|
|
def _unparse_arg(node):
|
|
return "{} {}".format(to_gazprea_type(node.get(GAZ_TY_KEY)), node.get(GAZ_NAME_KEY))
|
|
|
|
|
|
def to_gaz_value(val):
|
|
if val in ["True", "False"]:
|
|
return val.lower()
|
|
else:
|
|
return str(val)
|
|
|
|
|
|
def to_gaz_op(param):
|
|
if param == "negation" or param == "subtraction":
|
|
return "-"
|
|
elif param == "addition":
|
|
return "+"
|
|
elif param == "multiplication":
|
|
return "*"
|
|
elif param == "division":
|
|
return "/"
|
|
elif param == "modulus":
|
|
return "%"
|
|
elif param == "power":
|
|
return "^"
|
|
elif param == "equality":
|
|
return "=="
|
|
elif param == "inequality":
|
|
return "!="
|
|
elif param == "less-than":
|
|
return "<"
|
|
elif param == "less-than-or-equal":
|
|
return "<="
|
|
elif param == "greater-than":
|
|
return ">"
|
|
elif param == "greater-than-or-equal":
|
|
return ">="
|
|
else:
|
|
warnings.warn("Warning, unknown operator: " + param)
|
|
return param
|
|
|
|
|
|
class GazUnparser(GeneralUnparser):
|
|
def __init__(self, input_ast, from_xml: bool = False):
|
|
super().__init__(input=input_ast, from_xml=from_xml,
|
|
endline=";\n",
|
|
instream_end_delimiter=" <- std_input",
|
|
outstream_end_delimiter=" -> std_output", )
|
|
|
|
def format_variable(self, mut, ty, name, declaration: bool = False):
|
|
if declaration:
|
|
return "{} {} {}".format(mut, ty, name)
|
|
else:
|
|
return "{}".format(name)
|
|
|
|
def translate_value(self, val):
|
|
if val in ["True", "False"]:
|
|
return val.lower()
|
|
else:
|
|
return str(val)
|
|
|
|
def translate_op(self, param):
|
|
return to_gaz_op(param)
|
|
|
|
def translate_type(self, ty):
|
|
return to_gazprea_type(ty)
|
|
|
|
def function_declaration(self, xml_tag, args, name, return_type):
|
|
return "{} {}{} {} ".format(
|
|
xml_tag,
|
|
name,
|
|
args,
|
|
return_type,
|
|
)
|
|
|
|
def format_single_arg(self, ty, name):
|
|
return "{} {}".format(ty, name)
|