Esempio n. 1
0
 def semantic_check(self, scope: IdentScope) -> None:
     func = scope.get_ident(self.func.name)
     if func is None:
         self.semantic_error('Функция {} не найдена'.format(self.func.name))
     if not func.type.func:
         self.semantic_error('Идентификатор {} не является функцией'.format(
             func.name))
     if len(func.type.params) != len(self.params):
         self.semantic_error(
             'Кол-во аргументов {} не совпадает (ожидалось {}, передано {})'
             .format(func.name, len(func.type.params), len(self.params)))
     params = []
     error = False
     decl_params_str = fact_params_str = ''
     for i in range(len(self.params)):
         param: ExprNode = self.params[i]
         param.semantic_check(scope)
         if (len(decl_params_str) > 0):
             decl_params_str += ', '
         decl_params_str += str(func.type.params[i])
         if (len(fact_params_str) > 0):
             fact_params_str += ', '
         fact_params_str += str(param.node_type)
         try:
             params.append(type_convert(param, func.type.params[i]))
         except:
             error = True
     if error:
         self.semantic_error(
             'Фактические типы ({1}) аргументов функции {0} не совпадают с формальными ({2})\
                                 и не приводимы'.format(
                 func.name, fact_params_str, decl_params_str))
     else:
         self.params = tuple(params)
         self.func.node_type = func.type
         self.func.node_ident = func
         self.node_type = func.type.return_type
Esempio n. 2
0
 def semantic_check(self, scope: IdentScope) -> None:
     ident = scope.get_ident(self.name)
     if ident is None:
         self.semantic_error('Идентификатор {} не найден'.format(self.name))
     self.node_type = ident.type
     self.node_ident = ident