mirror of
https://github.com/Mercury-Language/mercury.git
synced 2026-04-15 01:13:30 +00:00
138 lines
4.4 KiB
Mathematica
138 lines
4.4 KiB
Mathematica
%---------------------------------------------------------------------------%
|
|
% vim: ft=mercury ts=4 sw=4 et
|
|
%---------------------------------------------------------------------------%
|
|
% Copyright (C) 2022 The Mercury team.
|
|
% This file may only be copied under the terms of the GNU General
|
|
% Public License - see the file COPYING in the Mercury distribution.
|
|
%---------------------------------------------------------------------------%
|
|
%
|
|
% This module's job is to make it possible for compiler passes to operate
|
|
% on variables using either
|
|
%
|
|
% - var_tables, which most of the compiler uses to represent information
|
|
% about variables, or
|
|
%
|
|
% - prog_varsets and/or vartypes, which a few compiler passes near the start
|
|
% of the compilation process use for the same purpose.
|
|
%
|
|
%---------------------------------------------------------------------------%
|
|
|
|
:- module parse_tree.var_db.
|
|
:- interface.
|
|
|
|
:- import_module parse_tree.prog_data.
|
|
:- import_module parse_tree.var_table.
|
|
:- import_module parse_tree.vartypes.
|
|
|
|
:- import_module list.
|
|
|
|
%---------------------------------------------------------------------------%
|
|
|
|
% A source for information about the types of variables.
|
|
%
|
|
:- type var_type_source
|
|
---> vts_vartypes(vartypes)
|
|
; vts_var_table(var_table).
|
|
|
|
:- pred lookup_var_type_in_source(var_type_source::in, prog_var::in,
|
|
mer_type::out) is det.
|
|
:- pred lookup_var_types_in_source(var_type_source::in, list(prog_var)::in,
|
|
list(mer_type)::out) is det.
|
|
|
|
%---------------------------------------------------------------------------%
|
|
|
|
% A source for information about the names of variables.
|
|
%
|
|
:- type var_name_source
|
|
---> vns_varset(prog_varset)
|
|
; vns_var_table(var_table).
|
|
|
|
:- pred search_var_name_in_source(var_name_source::in, prog_var::in,
|
|
string::out) is semidet.
|
|
:- pred lookup_var_name_in_source(var_name_source::in, prog_var::in,
|
|
string::out) is det.
|
|
|
|
%---------------------------------------------------------------------------%
|
|
|
|
% A source for information about both the names and types of variables.
|
|
%
|
|
:- type var_db
|
|
---> var_db_varset_vartypes(prog_var_set_types)
|
|
; var_db_var_table(var_table).
|
|
|
|
:- pred lookup_var_type_in_db(var_db::in, prog_var::in,
|
|
mer_type::out) is det.
|
|
:- pred lookup_var_types_in_db(var_db::in, list(prog_var)::in,
|
|
list(mer_type)::out) is det.
|
|
|
|
%---------------------------------------------------------------------------%
|
|
|
|
:- implementation.
|
|
|
|
:- import_module varset.
|
|
|
|
%---------------------------------------------------------------------------%
|
|
|
|
lookup_var_type_in_source(VarTypeSrc, Var, Type) :-
|
|
(
|
|
VarTypeSrc = vts_vartypes(VarTypes),
|
|
vartypes.lookup_var_type(VarTypes, Var, Type)
|
|
;
|
|
VarTypeSrc = vts_var_table(VarTable),
|
|
var_table.lookup_var_type(VarTable, Var, Type)
|
|
).
|
|
|
|
lookup_var_types_in_source(VarTypeSrc, Vars, Types) :-
|
|
(
|
|
VarTypeSrc = vts_vartypes(VarTypes),
|
|
vartypes.lookup_var_types(VarTypes, Vars, Types)
|
|
;
|
|
VarTypeSrc = vts_var_table(VarTable),
|
|
var_table.lookup_var_types(VarTable, Vars, Types)
|
|
).
|
|
|
|
%---------------------%
|
|
|
|
search_var_name_in_source(VarNameSrc, Var, Name) :-
|
|
(
|
|
VarNameSrc = vns_varset(VarSet),
|
|
varset.search_name(VarSet, Var, Name)
|
|
;
|
|
VarNameSrc = vns_var_table(VarTable),
|
|
var_table.search_var_name(VarTable, Var, Name)
|
|
).
|
|
|
|
lookup_var_name_in_source(VarNameSrc, Var, Name) :-
|
|
(
|
|
VarNameSrc = vns_varset(VarSet),
|
|
varset.lookup_name(VarSet, Var, Name)
|
|
;
|
|
VarNameSrc = vns_var_table(VarTable),
|
|
var_table.lookup_var_entry(VarTable, Var, Entry),
|
|
Name = var_entry_name(Var, Entry)
|
|
).
|
|
|
|
%---------------------%
|
|
|
|
lookup_var_type_in_db(VarDb, Var, Type) :-
|
|
(
|
|
VarDb = var_db_varset_vartypes(prog_var_set_types(_, VarTypes)),
|
|
vartypes.lookup_var_type(VarTypes, Var, Type)
|
|
;
|
|
VarDb = var_db_var_table(VarTable),
|
|
var_table.lookup_var_type(VarTable, Var, Type)
|
|
).
|
|
|
|
lookup_var_types_in_db(VarDb, Vars, Types) :-
|
|
(
|
|
VarDb = var_db_varset_vartypes(prog_var_set_types(_, VarTypes)),
|
|
vartypes.lookup_var_types(VarTypes, Vars, Types)
|
|
;
|
|
VarDb = var_db_var_table(VarTable),
|
|
var_table.lookup_var_types(VarTable, Vars, Types)
|
|
).
|
|
|
|
%---------------------------------------------------------------------------%
|
|
:- end_module parse_tree.var_db.
|
|
%---------------------------------------------------------------------------%
|