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
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