declare_functions_visitor.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. import hutn_compiler.symbol_table as st
  2. import hutn_compiler.types_mv as types_mv
  3. from hutn_compiler.visitor import Visitor
  4. from hutn_compiler.hutnparser import Tree
  5. # Declare the function but do not visit its body
  6. class DeclareFunctionsVisitor(Visitor):
  7. def __init__(self, symbol_table, inputfiles):
  8. Visitor.__init__(self, [])
  9. self.symbol_table = symbol_table
  10. self.inputfiles = inputfiles
  11. def compute_parameter_types(self, tree):
  12. parameter_types = []
  13. for parameter in Tree.get_children(tree, 'parameter'):
  14. type_specifier = Tree.get_text(Tree.get_children(parameter, "type_specifier")[0])
  15. parameter_types.append(types_mv.string_to_type(type_specifier))
  16. return parameter_types
  17. def compute_func_type(self, tree):
  18. self.visit(Tree.get_tail(tree)[0])
  19. func_type = self.get_type(Tree.get_tail(tree)[0])
  20. return func_type
  21. def visit_funcdecl(self, tree):
  22. func_name = Tree.get_text(Tree.get_children(tree, "func_name")[0])
  23. func_type = self.compute_func_type(tree)
  24. parameter_types = self.compute_parameter_types(tree)
  25. self.set_type(tree, func_type)
  26. #TODO should check type compatibility if declared multiple times
  27. try:
  28. s = st.Symbol(func_name, func_type, is_global=True, params=parameter_types)
  29. self.symbol_table.add(s)
  30. except Exception:
  31. if "COLON" in Tree.get_tail(tree) or "ASSIGN" in Tree.get_tail(tree):
  32. raise RuntimeError(
  33. "{}:{}:{}: error: redeclaration of '{}'".format(
  34. self.inputfiles[0], tree['startpos']['line'],
  35. tree['startpos']['column'], func_name))
  36. self.set_symbol(tree, s)
  37. def visit_func_type(self, tree):
  38. self.set_type(tree, types_mv.string_to_type(Tree.get_text(tree)))