Module:bg-verb/full
Jump to navigation
Jump to search
- The following documentation is located at Module:bg-verb/full/documentation. [edit]
- Useful links: root page • root page’s subpages • links • transclusions • testcases • sandbox
local export = {}
local iut = require("Module:inflection utilities")
--[=[
Authorship: Ben Wing <benwing2>
]=]
-- Person/number suffixes for non-gendered slot prefixes.
local pers_num_suffixes = {"1sg", "2sg", "3sg", "1pl", "2pl", "3pl"}
-- Person/number/gender suffixes for gendered slot prefixes.
local gendered_pers_num_suffixes = {
"m_1sg", "f_1sg", "n_1sg", "m_2sg", "f_2sg", "n_2sg", "m_3sg", "f_3sg", "n_3sg",
"1pl", "2pl", "3pl"
}
-- Non-gendered slot prefixes.
local pers_num_prefixes = {
-- indicative
"fut_pos", "fut_neg", "futip_pos", "futip_neg",
"ren_fut_neg", "dub_fut_neg", "conc_fut_neg",
}
-- Gendered slot prefixes.
local gendered_pers_num_prefixes = {
-- indicative
"prespf", "pastpf", "futpf_pos", "futpf_neg", "futpfip_pos", "futpfip_neg",
"ren_pres", "ren_aor", "ren_fut_pos", "ren_prespf", "ren_futpf_pos", "ren_futpf_neg",
"dub_pres", "dub_aor", "dub_fut_pos", "dub_futpf_pos", "dub_futpf_neg", -- no dub_prespf
"conc_pres", "conc_aor", "conc_fut_pos", "conc_prespf", "conc_futpf_pos", "conc_futpf_neg",
"cond",
}
export.verb_compound_slots = {}
for _, non_gendered_prefix in ipairs(pers_num_prefixes) do
for _, suffix in ipairs(pers_num_suffixes) do
table.insert(export.verb_compound_slots, non_gendered_prefix .. "_" .. suffix)
end
end
for _, gendered_prefix in ipairs(gendered_pers_num_prefixes) do
for _, suffix in ipairs(gendered_pers_num_suffixes) do
table.insert(export.verb_compound_slots, gendered_prefix .. "_" .. suffix)
end
end
local function concat(prefix, suffix)
if not prefix then
return suffix
elseif not suffix then
return prefix
else
return prefix .. " " .. suffix
end
end
local function concn(a, b, c, d)
local vals = {}
if a then
table.insert(vals, a)
end
if b then
table.insert(vals, b)
end
if c then
table.insert(vals, c)
end
if d then
table.insert(vals, d)
end
return table.concat(vals, " ")
end
local function concat_tables(prefixes, suffixes, combine)
combine = combine or concat
if type(prefixes) == "string" and type(suffixes) == "string" then
error("Either prefixes or suffixes should be a table")
end
local len
if type(prefixes) == "table" and type(suffixes) == "table" then
len = #prefixes
if len ~= #suffixes then
error("Length of prefixes is " .. len .. " but length of suffixes is " .. #suffixes ..
", they should be equal")
end
elseif type(prefixes) == "table" then
len = #prefixes
else
len = #suffixes
end
local retval = {}
for i=1,len do
local prefix = type(prefixes) == "table" and prefixes[i] or prefixes
local suffix = type(suffixes) == "table" and suffixes[i] or suffixes
if (type(prefix) == "table" and not prefix.form) or
(type(suffix) == "table" and not suffix.form) then
table.insert(retval, concat_tables(prefix, suffix))
else
table.insert(retval, combine(prefix, suffix))
end
end
return retval
end
local function gender_cross_person(fn)
local retval = {}
for person=1,3 do
for gender=1,3 do
table.insert(retval, fn(gender, person, (person - 1) * 3 + gender))
end
end
for person=4,6 do
table.insert(retval, fn(4, person, person + 6))
end
return retval
end
local sam_pres = {"[[съм]]", "[[си]]", "[[е]]", "[[сме]]", "[[сте]]", "[[са]]"}
local sam_pres_no3 = {"[[съм]]", "[[си]]", false, "[[сме]]", "[[сте]]", false}
local sam_impf = {"[[бях]]", {"[[бе]]", "[[бе́ше]]"}, {"[[бе]]", "[[бе́ше]]"}, "[[бя́хме]]", "[[бя́хте]]", "[[бя́ха]]"}
local sam_paip = {"[[бил]]", "[[била́]]", "[[било́]]", "[[били́]]"}
local shta_impf = {"[[щях]]", "[[ще́ше]]", "[[ще́ше]]", "[[щя́хме]]", "[[щя́хте]]", "[[щя́ха]]"}
local shta_paip = {"[[щял]]", "[[щя́ла]]", "[[щя́ло]]", "[[ще́ли]]"}
-- local bada_pres = {"[[бъ́да]]", "[[бъ́деш]]", "[[бъ́де]]", "[[бъ́дем]]", "[[бъ́дете]]", "[[бъ́дат]]"}
local bada_aor1 = {"[[бих]]", "[[би]]", "[[би]]", "[[би́хме]]", "[[би́хте]]", "[[би́ха]]"}
function export.conjugate_all_compound(base)
local forms = base.forms
local function addpref(dest_slot, pref, source_slot)
if type(pref) ~= "table" then
pref = {pref}
end
for _, p in ipairs(pref) do
iut.insert_forms(forms, dest_slot,
iut.map_forms(forms[source_slot], function(form) return concat(p, "[[" .. form .. "]]") end)
)
end
end
local function addsuf(dest_slot, suf, source_slot)
if type(suf) ~= "table" then
suf = {suf}
end
for _, s in ipairs(suf) do
iut.insert_forms(forms, dest_slot,
iut.map_forms(forms[source_slot], function(form) return concat("[[" .. form .. "]]", s) end)
)
end
end
-- Add non-gendered PREFIXTEXT to the forms in the non-gendered source slot row identified by
-- SOURCE_SLOT_PREFIX and store the results in the (non-gendered) destination slot row identified
-- by DEST_SLOT_PREFIX. A "non-gendered slot row" is a row of slots that differ in person and
-- number, with no gender differences. For example, the present indicative (slot prefix "pres")
-- is a non-gendered slot row. "Non-gendered PREFIXTEXT" can be either a string (the same for all
-- slots) or a 6-element table corresponding to 1sg, 2sg, 3sg, 1pl, 2pl, 3pl respectively, where
-- each element of the table is either a string or a table of alternants, each of which is a
-- string. A case where PREFIXTEXT should be a string is the negative future-in-the-past
-- indicative, which prefixes "ня́маше да" to the present indicative. A case where PREFIXTEXT
-- should be a table is the positive future-in-the-past indicative, which prefixes the imperfect
-- of ща + "да" to the present indicative.
local function ngen_prefix_to_ngen(dest_slot_prefix, prefixtext, source_slot_prefix)
local x1sg, x2sg, x3sg, x1pl, x2pl, x3pl
if type(prefixtext) == "string" then
x1sg, x2sg, x3sg, x1pl, x2pl, x3pl = prefixtext, prefixtext, prefixtext, prefixtext, prefixtext, prefixtext
else
x1sg, x2sg, x3sg, x1pl, x2pl, x3pl = unpack(prefixtext)
end
addpref(dest_slot_prefix .. "_1sg", x1sg, source_slot_prefix .. "_1sg")
addpref(dest_slot_prefix .. "_2sg", x2sg, source_slot_prefix .. "_2sg")
addpref(dest_slot_prefix .. "_3sg", x3sg, source_slot_prefix .. "_3sg")
addpref(dest_slot_prefix .. "_1pl", x1pl, source_slot_prefix .. "_1pl")
addpref(dest_slot_prefix .. "_2pl", x2pl, source_slot_prefix .. "_2pl")
addpref(dest_slot_prefix .. "_3pl", x3pl, source_slot_prefix .. "_3pl")
end
-- Add non-gendered PREFIXTEXT to the forms in the gendered source slot row identified by
-- SOURCE_SLOT_PREFIX and store the results in the (gendered) destination slot row identified
-- by DEST_SLOT_PREFIX. See ngen_prefix_to_ngen() for definition of "slot row" and
-- "non-gendered PREFIXTEXT". Here, the gendered source slot row is assumed to differ only
-- in gender and number, not in person (i.e. it's a participle), while the gendered destination
-- slot row differs in person, gender and number.
local function ngen_prefix_to_gen(dest_slot_prefix, prefixtext, source_slot_prefix)
local x1sg, x2sg, x3sg, x1pl, x2pl, x3pl = unpack(prefixtext)
addpref(dest_slot_prefix .. "_m_1sg", x1sg, source_slot_prefix .. "_m_sg")
addpref(dest_slot_prefix .. "_f_1sg", x1sg, source_slot_prefix .. "_f_sg")
addpref(dest_slot_prefix .. "_n_1sg", x1sg, source_slot_prefix .. "_n_sg")
addpref(dest_slot_prefix .. "_m_2sg", x2sg, source_slot_prefix .. "_m_sg")
addpref(dest_slot_prefix .. "_f_2sg", x2sg, source_slot_prefix .. "_f_sg")
addpref(dest_slot_prefix .. "_n_2sg", x2sg, source_slot_prefix .. "_n_sg")
addpref(dest_slot_prefix .. "_m_3sg", x3sg, source_slot_prefix .. "_m_sg")
addpref(dest_slot_prefix .. "_f_3sg", x3sg, source_slot_prefix .. "_f_sg")
addpref(dest_slot_prefix .. "_n_3sg", x3sg, source_slot_prefix .. "_n_sg")
addpref(dest_slot_prefix .. "_1pl", x1pl, source_slot_prefix .. "_pl")
addpref(dest_slot_prefix .. "_2pl", x2pl, source_slot_prefix .. "_pl")
addpref(dest_slot_prefix .. "_3pl", x3pl, source_slot_prefix .. "_pl")
end
-- Identical to ngen_prefix_to_gen() but adds suffix text (possibly differing by person/number)
-- to a gendered source slot row instead of adding prefix text.
local function ngen_suffix_to_gen(dest_slot_prefix, source_slot_prefix, suffixtext)
local x1sg, x2sg, x3sg, x1pl, x2pl, x3pl = unpack(suffixtext)
addsuf(dest_slot_prefix .. "_m_1sg", x1sg, source_slot_prefix .. "_m_sg")
addsuf(dest_slot_prefix .. "_f_1sg", x1sg, source_slot_prefix .. "_f_sg")
addsuf(dest_slot_prefix .. "_n_1sg", x1sg, source_slot_prefix .. "_n_sg")
addsuf(dest_slot_prefix .. "_m_2sg", x2sg, source_slot_prefix .. "_m_sg")
addsuf(dest_slot_prefix .. "_f_2sg", x2sg, source_slot_prefix .. "_f_sg")
addsuf(dest_slot_prefix .. "_n_2sg", x2sg, source_slot_prefix .. "_n_sg")
addsuf(dest_slot_prefix .. "_m_3sg", x3sg, source_slot_prefix .. "_m_sg")
addsuf(dest_slot_prefix .. "_f_3sg", x3sg, source_slot_prefix .. "_f_sg")
addsuf(dest_slot_prefix .. "_n_3sg", x3sg, source_slot_prefix .. "_n_sg")
addsuf(dest_slot_prefix .. "_1pl", x1pl, source_slot_prefix .. "_pl")
addsuf(dest_slot_prefix .. "_2pl", x2pl, source_slot_prefix .. "_pl")
addsuf(dest_slot_prefix .. "_3pl", x3pl, source_slot_prefix .. "_pl")
end
-- Add gendered PREFIXTEXT to the forms in the non-gendered source slot row identified by
-- SOURCE_SLOT_PREFIX and store the results in the (gendered) destination slot row identified
-- by DEST_SLOT_PREFIX. See ngen_prefix_to_ngen() for definition of "slot row". Here,
-- "gendered PREFIXTEXT" is a 12-element table corresponding to m_1sg, f_1sg, n_1sg,
-- m_2sg, f_2sg, n_2sg, m_3sg, f_3sg, n_3sg, 1pl, 2pl, 3pl respectively, where each element
-- of the table is either a string or a table of alternants, each of which is a string.
local function gen_prefix_to_ngen(dest_slot_prefix, prefixtext, source_slot_prefix)
local m_1sg, f_1sg, n_1sg, m_2sg, f_2sg, n_2sg, m_3sg, f_3sg, n_3sg, x1pl, x2pl, x3pl = unpack(prefixtext)
addpref(dest_slot_prefix .. "_m_1sg", m_1sg, source_slot_prefix .. "_1sg")
addpref(dest_slot_prefix .. "_f_1sg", f_1sg, source_slot_prefix .. "_1sg")
addpref(dest_slot_prefix .. "_n_1sg", n_1sg, source_slot_prefix .. "_1sg")
addpref(dest_slot_prefix .. "_m_2sg", m_2sg, source_slot_prefix .. "_2sg")
addpref(dest_slot_prefix .. "_f_2sg", f_2sg, source_slot_prefix .. "_2sg")
addpref(dest_slot_prefix .. "_n_2sg", n_2sg, source_slot_prefix .. "_2sg")
addpref(dest_slot_prefix .. "_m_3sg", m_3sg, source_slot_prefix .. "_3sg")
addpref(dest_slot_prefix .. "_f_3sg", f_3sg, source_slot_prefix .. "_3sg")
addpref(dest_slot_prefix .. "_n_3sg", n_3sg, source_slot_prefix .. "_3sg")
addpref(dest_slot_prefix .. "_1pl", x1pl, source_slot_prefix .. "_1pl")
addpref(dest_slot_prefix .. "_2pl", x2pl, source_slot_prefix .. "_2pl")
addpref(dest_slot_prefix .. "_3pl", x3pl, source_slot_prefix .. "_3pl")
end
-- Add gendered PREFIXTEXT to the forms in the gendered source slot row identified by
-- SOURCE_SLOT_PREFIX and store the results in the (gendered) destination slot row identified
-- by DEST_SLOT_PREFIX. See ngen_prefix_to_ngen() for definition of "slot row",
-- gen_prefix_to_ngen() for the definition of "gendered PREFIXTEXT" and ngen_prefix_to_gen()
-- for the definition of "gendered source slot row".
local function gen_prefix_to_gen(dest_slot_prefix, prefixtext, source_slot_prefix)
local m_1sg, f_1sg, n_1sg, m_2sg, f_2sg, n_2sg, m_3sg, f_3sg, n_3sg, x1pl, x2pl, x3pl = unpack(prefixtext)
addpref(dest_slot_prefix .. "_m_1sg", m_1sg, source_slot_prefix .. "_m_sg")
addpref(dest_slot_prefix .. "_f_1sg", f_1sg, source_slot_prefix .. "_f_sg")
addpref(dest_slot_prefix .. "_n_1sg", n_1sg, source_slot_prefix .. "_n_sg")
addpref(dest_slot_prefix .. "_m_2sg", m_2sg, source_slot_prefix .. "_m_sg")
addpref(dest_slot_prefix .. "_f_2sg", f_2sg, source_slot_prefix .. "_f_sg")
addpref(dest_slot_prefix .. "_n_2sg", n_2sg, source_slot_prefix .. "_n_sg")
addpref(dest_slot_prefix .. "_m_3sg", m_3sg, source_slot_prefix .. "_m_sg")
addpref(dest_slot_prefix .. "_f_3sg", f_3sg, source_slot_prefix .. "_f_sg")
addpref(dest_slot_prefix .. "_n_3sg", n_3sg, source_slot_prefix .. "_n_sg")
addpref(dest_slot_prefix .. "_1pl", x1pl, source_slot_prefix .. "_pl")
addpref(dest_slot_prefix .. "_2pl", x2pl, source_slot_prefix .. "_pl")
addpref(dest_slot_prefix .. "_3pl", x3pl, source_slot_prefix .. "_pl")
end
-- indicative
local futip_prefixtext = concat_tables(shta_impf, "[[да]]")
ngen_prefix_to_ngen("fut_pos", "[[ще]]", "pres")
ngen_prefix_to_ngen("fut_neg", "[[ня́ма]] [[да]]", "pres")
ngen_prefix_to_ngen("futip_pos", futip_prefixtext, "pres")
ngen_prefix_to_ngen("futip_neg", "[[ня́маше]] [[да]]", "pres")
ngen_suffix_to_gen("prespf", "paap_ind", sam_pres)
ngen_prefix_to_gen("pastpf", sam_impf, "paap_ind")
ngen_prefix_to_gen("futpf_pos", concat_tables("[[ще]]", sam_pres), "paap_ind")
ngen_prefix_to_gen("futpf_neg", concat_tables("[[няма]] [[да]]", sam_pres), "paap_ind")
ngen_prefix_to_gen("futpfip_pos", concat_tables(futip_prefixtext, sam_pres), "paap_ind")
ngen_prefix_to_gen("futpfip_neg", concat_tables("[[ня́маше]] [[да]]", sam_pres), "paap_ind")
-- renarrative
ngen_suffix_to_gen("ren_pres", "paip", sam_pres_no3)
ngen_suffix_to_gen("ren_aor", "paap_ind", sam_pres_no3)
local ren_fut_pos = gender_cross_person(
function(gender, person) return concn(shta_paip[gender], sam_pres_no3[person], "[[да]]") end
)
gen_prefix_to_ngen("ren_fut_pos", ren_fut_pos, "pres")
ngen_prefix_to_ngen("ren_fut_neg", "[[ня́мало]] [[да]]", "pres")
local ren_prespf = gender_cross_person(
function(gender, person) return concat(sam_paip[gender], sam_pres_no3[person]) end
)
gen_prefix_to_gen("ren_prespf", ren_prespf, "paap_ind")
local ren_futpf_pos = gender_cross_person(
function(gender, person, index) return concat(ren_fut_pos[index], sam_pres[person]) end
)
gen_prefix_to_gen("ren_futpf_pos", ren_futpf_pos, "paap_ind")
ngen_prefix_to_gen("ren_futpf_neg", concat_tables("[[ня́мало]] [[да]]", sam_pres), "paap_ind")
-- dubitative
gen_prefix_to_gen("dub_pres", ren_prespf, "paip")
gen_prefix_to_gen("dub_aor", ren_prespf, "paap_ind")
local dub_fut_pos = gender_cross_person(
function(gender, person) return concn(shta_paip[gender], sam_pres_no3[person], sam_paip[gender], "[[да]]") end
)
gen_prefix_to_ngen("dub_fut_pos", dub_fut_pos, "pres")
ngen_prefix_to_ngen("dub_fut_neg", "[[ня́мало]] [[било́]] [[да]]", "pres")
-- no dubitative present and past perfect
local dub_futpf_pos = gender_cross_person(
function(gender, person, index) return concat(dub_fut_pos[index], sam_pres[person]) end
)
gen_prefix_to_gen("dub_futpf_pos", dub_futpf_pos, "paap_ind")
ngen_prefix_to_gen("dub_futpf_neg", concat_tables("[[ня́мало]] [[било́]] [[да]]", sam_pres), "paap_ind")
-- conclusive
ngen_suffix_to_gen("conc_pres", "paip", sam_pres)
ngen_suffix_to_gen("conc_aor", "paap_ind", sam_pres)
local conc_fut_pos = gender_cross_person(
function(gender, person) return concn(shta_paip[gender], sam_pres[person], "[[да]]") end
)
gen_prefix_to_ngen("conc_fut_pos", conc_fut_pos, "pres")
ngen_prefix_to_ngen("conc_fut_neg", "[[ня́мало]] [[е]] [[да]]", "pres")
local conc_prespf = gender_cross_person(
function(gender, person) return concat(sam_paip[gender], sam_pres[person]) end
)
gen_prefix_to_gen("conc_prespf", conc_prespf, "paap_ind")
local conc_futpf_pos = gender_cross_person(
function(gender, person, index) return concat(conc_fut_pos[index], sam_pres[person]) end
)
gen_prefix_to_gen("conc_futpf_pos", conc_futpf_pos, "paap_ind")
ngen_prefix_to_gen("conc_futpf_neg", concat_tables("[[ня́мало]] [[е]] [[да]]", sam_pres), "paap_ind")
-- conditional
ngen_prefix_to_gen("cond", bada_aor1, "paap_ind")
end
export.table_spec_compound_full = [=[
! rowspan="2" style="background:#c0cfe4" | future
! colspan="2" style="background:#c0cfe4" | pos.
| {fut_pos_1sg}
| {fut_pos_2sg}
| {fut_pos_3sg}
| {fut_pos_1pl}
| {fut_pos_2pl}
| {fut_pos_3pl}
|-
! colspan="2" style="background:#c0cfe4" | neg.
| {fut_neg_1sg}
| {fut_neg_2sg}
| {fut_neg_3sg}
| {fut_neg_1pl}
| {fut_neg_2pl}
| {fut_neg_3pl}
|-
! rowspan= "2" style="background:#c0cfe4" | future in the past
! colspan="2" style="background:#c0cfe4" | pos.
| {futip_pos_1sg}
| {futip_pos_2sg}
| {futip_pos_3sg}
| {futip_pos_1pl}
| {futip_pos_2pl}
| {futip_pos_3pl}
|-
! colspan="2" style="background:#c0cfe4" | neg.
| {futip_neg_1sg}
| {futip_neg_2sg}
| {futip_neg_3sg}
| {futip_neg_1pl}
| {futip_neg_2pl}
| {futip_neg_3pl}
|-
! rowspan="3" style="background:#c0cfe4" | present perfect
! colspan="2" style="background:#c0cfe4" | masc.
| {prespf_m_1sg}
| {prespf_m_2sg}
| {prespf_m_3sg}
|rowspan="3"| {prespf_1pl}
|rowspan="3"| {prespf_2pl}
|rowspan="3"| {prespf_3pl}
|-
! colspan="2" style="background:#c0cfe4" | fem.
| {prespf_f_1sg}
| {prespf_f_2sg}
| {prespf_f_3sg}
|-
! colspan="2" style="background:#c0cfe4" | neut.
| {prespf_n_1sg}
| {prespf_n_2sg}
| {prespf_n_3sg}
|-
! rowspan="3" style="background:#c0cfe4" | past perfect
! colspan="2" style="background:#c0cfe4" | masc.
| {pastpf_m_1sg}
| {pastpf_m_2sg}
| {pastpf_m_3sg}
|rowspan="3"| {pastpf_1pl}
|rowspan="3"| {pastpf_2pl}
|rowspan="3"| {pastpf_3pl}
|-
! colspan="2" style="background:#c0cfe4" | fem.
| {pastpf_f_1sg}
| {pastpf_f_2sg}
| {pastpf_f_3sg}
|-
! colspan="2" style="background:#c0cfe4" | neut.
| {pastpf_n_1sg}
| {pastpf_n_2sg}
| {pastpf_n_3sg}
|-
! rowspan="6" style="background:#c0cfe4" | future perfect
! rowspan="3" style="background:#c0cfe4" | pos.
! style="background:#c0cfe4" | masc.
| {futpf_pos_m_1sg}
| {futpf_pos_m_2sg}
| {futpf_pos_m_3sg}
|rowspan="3"| {futpf_pos_1pl}
|rowspan="3"| {futpf_pos_2pl}
|rowspan="3"| {futpf_pos_3pl}
|-
! style="background:#c0cfe4" | fem.
| {futpf_pos_f_1sg}
| {futpf_pos_f_2sg}
| {futpf_pos_f_3sg}
|-
! style="background:#c0cfe4" | neut.
| {futpf_pos_n_1sg}
| {futpf_pos_n_2sg}
| {futpf_pos_n_3sg}
|-
! rowspan="3" style="background:#c0cfe4" | neg.
! style="background:#c0cfe4" | masc.
| {futpf_neg_m_1sg}
| {futpf_neg_m_2sg}
| {futpf_neg_m_3sg}
|rowspan="3"| {futpf_neg_1pl}
|rowspan="3"| {futpf_neg_2pl}
|rowspan="3"| {futpf_neg_3pl}
|-
! style="background:#c0cfe4" | fem.
| {futpf_neg_f_1sg}
| {futpf_neg_f_2sg}
| {futpf_neg_f_3sg}
|-
! style="background:#c0cfe4" | neut.
| {futpf_neg_n_1sg}
| {futpf_neg_n_2sg}
| {futpf_neg_n_3sg}
|-
! rowspan="6" style="background:#c0cfe4" | future perfect in the past
! rowspan="3" style="background:#c0cfe4" | pos.
! style="background:#c0cfe4" | masc.
| {futpfip_pos_m_1sg}
| {futpfip_pos_m_2sg}
| {futpfip_pos_m_3sg}
|rowspan="3"| {futpfip_pos_1pl}
|rowspan="3"| {futpfip_pos_2pl}
|rowspan="3"| {futpfip_pos_3pl}
|-
! style="background:#c0cfe4" | fem.
| {futpfip_pos_f_1sg}
| {futpfip_pos_f_2sg}
| {futpfip_pos_f_3sg}
|-
! style="background:#c0cfe4" | neut.
| {futpfip_pos_n_1sg}
| {futpfip_pos_n_2sg}
| {futpfip_pos_n_3sg}
|-
! rowspan="3" style="background:#c0cfe4" | neg.
! style="background:#c0cfe4" | masc.
| {futpfip_neg_m_1sg}
| {futpfip_neg_m_2sg}
| {futpfip_neg_m_3sg}
|rowspan="3"| {futpfip_neg_1pl}
|rowspan="3"| {futpfip_neg_2pl}
|rowspan="3"| {futpfip_neg_3pl}
|-
! style="background:#c0cfe4" | fem.
| {futpfip_neg_f_1sg}
| {futpfip_neg_f_2sg}
| {futpfip_neg_f_3sg}
|-
! style="background:#c0cfe4" | neut.
| {futpfip_neg_n_1sg}
| {futpfip_neg_n_2sg}
| {futpfip_neg_n_3sg}
|-
! style="background:#c0e4c0" colspan="3" | renarrative
! style="background:#c0e4c0" | аз
! style="background:#c0e4c0" | ти
! style="background:#c0e4c0" | той/тя/то
! style="background:#c0e4c0" | ние
! style="background:#c0e4c0" | вие
! style="background:#c0e4c0" | те
|-
! rowspan="3" style="background:#c0e4c0" | present and imperfect
! colspan="2" style="background:#c0e4c0" | masc.
| {ren_pres_m_1sg}
| {ren_pres_m_2sg}
| {ren_pres_m_3sg}
|rowspan="3"| {ren_pres_1pl}
|rowspan="3"| {ren_pres_2pl}
|rowspan="3"| {ren_pres_3pl}
|-
! colspan="2" style="background:#c0e4c0" | fem.
| {ren_pres_f_1sg}
| {ren_pres_f_2sg}
| {ren_pres_f_3sg}
|-
! colspan="2" style="background:#c0e4c0" | neut.
| {ren_pres_n_1sg}
| {ren_pres_n_2sg}
| {ren_pres_n_3sg}
|-
! rowspan="3" style="background:#c0e4c0" | aorist
! colspan="2" style="background:#c0e4c0" | masc.
| {ren_aor_m_1sg}
| {ren_aor_m_2sg}
| {ren_aor_m_3sg}
|rowspan="3"| {ren_aor_1pl}
|rowspan="3"| {ren_aor_2pl}
|rowspan="3"| {ren_aor_3pl}
|-
! colspan="2" style="background:#c0e4c0" | fem.
| {ren_aor_f_1sg}
| {ren_aor_f_2sg}
| {ren_aor_f_3sg}
|-
! colspan="2" style="background:#c0e4c0" | neut.
| {ren_aor_n_1sg}
| {ren_aor_n_2sg}
| {ren_aor_n_3sg}
|-
! rowspan="4" style="background:#c0e4c0" | future and future in the past
! rowspan="3" style="background:#c0e4c0" | pos.
! style="background:#c0e4c0" | masc.
| {ren_fut_pos_m_1sg}
| {ren_fut_pos_m_2sg}
| {ren_fut_pos_m_3sg}
|rowspan="3"| {ren_fut_pos_1pl}
|rowspan="3"| {ren_fut_pos_2pl}
|rowspan="3"| {ren_fut_pos_3pl}
|-
! style="background:#c0e4c0" | fem.
| {ren_fut_pos_f_1sg}
| {ren_fut_pos_f_2sg}
| {ren_fut_pos_f_3sg}
|-
! style="background:#c0e4c0" | neut.
| {ren_fut_pos_n_1sg}
| {ren_fut_pos_n_2sg}
| {ren_fut_pos_n_3sg}
|-
! colspan="2" style="background:#c0e4c0" | neg.
| {ren_fut_neg_1sg}
| {ren_fut_neg_2sg}
| {ren_fut_neg_3sg}
| {ren_fut_neg_1pl}
| {ren_fut_neg_2pl}
| {ren_fut_neg_3pl}
|-
! rowspan="3" style="background:#c0e4c0" | present and past perfect
! colspan="2" style="background:#c0e4c0" | masc.
| {ren_prespf_m_1sg}
| {ren_prespf_m_2sg}
| {ren_prespf_m_3sg}
|rowspan="3"| {ren_prespf_1pl}
|rowspan="3"| {ren_prespf_2pl}
|rowspan="3"| {ren_prespf_3pl}
|-
! colspan="2" style="background:#c0e4c0" | fem.
| {ren_prespf_f_1sg}
| {ren_prespf_f_2sg}
| {ren_prespf_f_3sg}
|-
! colspan="2" style="background:#c0e4c0" | neut.
| {ren_prespf_n_1sg}
| {ren_prespf_n_2sg}
| {ren_prespf_n_3sg}
|-
! rowspan="6" style="background:#c0e4c0" | future perfect and future perfect in the past
! rowspan="3" style="background:#c0e4c0" | pos.
! style="background:#c0e4c0" | masc.
| {ren_futpf_pos_m_1sg}
| {ren_futpf_pos_m_2sg}
| {ren_futpf_pos_m_3sg}
|rowspan="3"| {ren_futpf_pos_1pl}
|rowspan="3"| {ren_futpf_pos_2pl}
|rowspan="3"| {ren_futpf_pos_3pl}
|-
! style="background:#c0e4c0" | fem.
| {ren_futpf_pos_f_1sg}
| {ren_futpf_pos_f_2sg}
| {ren_futpf_pos_f_3sg}
|-
! style="background:#c0e4c0" | neut.
| {ren_futpf_pos_n_1sg}
| {ren_futpf_pos_n_2sg}
| {ren_futpf_pos_n_3sg}
|-
! rowspan="3" style="background:#c0e4c0" | neg.
! style="background:#c0e4c0" | masc.
| {ren_futpf_neg_m_1sg}
| {ren_futpf_neg_m_2sg}
| {ren_futpf_neg_m_3sg}
|rowspan="3"| {ren_futpf_neg_1pl}
|rowspan="3"| {ren_futpf_neg_2pl}
|rowspan="3"| {ren_futpf_neg_3pl}
|-
! style="background:#c0e4c0" | fem.
| {ren_futpf_neg_f_1sg}
| {ren_futpf_neg_f_2sg}
| {ren_futpf_neg_f_3sg}
|-
! style="background:#c0e4c0" | neut.
| {ren_futpf_neg_n_1sg}
| {ren_futpf_neg_n_2sg}
| {ren_futpf_neg_n_3sg}
|-
! style="background:#f0e68c" colspan="3" | dubitative
! style="background:#f0e68c" | аз
! style="background:#f0e68c" | ти
! style="background:#f0e68c" | той/тя/то
! style="background:#f0e68c" | ние
! style="background:#f0e68c" | вие
! style="background:#f0e68c" | те
|-
! rowspan="3" style="background:#f0e68c" | present and imperfect
! colspan="2" style="background:#f0e68c" | masc.
| {dub_pres_m_1sg}
| {dub_pres_m_2sg}
| {dub_pres_m_3sg}
|rowspan="3"| {dub_pres_1pl}
|rowspan="3"| {dub_pres_2pl}
|rowspan="3"| {dub_pres_3pl}
|-
! colspan="2" style="background:#f0e68c" | fem.
| {dub_pres_f_1sg}
| {dub_pres_f_2sg}
| {dub_pres_f_3sg}
|-
! colspan="2" style="background:#f0e68c" | neut.
| {dub_pres_n_1sg}
| {dub_pres_n_2sg}
| {dub_pres_n_3sg}
|-
! rowspan="3" style="background:#f0e68c" | aorist
! colspan="2" style="background:#f0e68c" | masc.
| {dub_aor_m_1sg}
| {dub_aor_m_2sg}
| {dub_aor_m_3sg}
|rowspan="3"| {dub_aor_1pl}
|rowspan="3"| {dub_aor_2pl}
|rowspan="3"| {dub_aor_3pl}
|-
! colspan="2" style="background:#f0e68c" | fem.
| {dub_aor_f_1sg}
| {dub_aor_f_2sg}
| {dub_aor_f_3sg}
|-
! colspan="2" style="background:#f0e68c" | neut.
| {dub_aor_n_1sg}
| {dub_aor_n_2sg}
| {dub_aor_n_3sg}
|-
! rowspan="4" style="background:#f0e68c" | future and future in the past
! rowspan="3" style="background:#f0e68c" | pos.
! style="background:#f0e68c" | masc.
| {dub_fut_pos_m_1sg}
| {dub_fut_pos_m_2sg}
| {dub_fut_pos_m_3sg}
|rowspan="3"| {dub_fut_pos_1pl}
|rowspan="3"| {dub_fut_pos_2pl}
|rowspan="3"| {dub_fut_pos_3pl}
|-
! style="background:#f0e68c" | fem.
| {dub_fut_pos_f_1sg}
| {dub_fut_pos_f_2sg}
| {dub_fut_pos_f_3sg}
|-
! style="background:#f0e68c" | neut.
| {dub_fut_pos_n_1sg}
| {dub_fut_pos_n_2sg}
| {dub_fut_pos_n_3sg}
|-
! colspan="2" style="background:#f0e68c" | neg.
| {dub_fut_neg_1sg}
| {dub_fut_neg_2sg}
| {dub_fut_neg_3sg}
| {dub_fut_neg_1pl}
| {dub_fut_neg_2pl}
| {dub_fut_neg_3pl}
|-
! colspan="3" style="background:#f0e68c" | present and past perfect
| colspan="6" style="text-align:center;"|''none''
|-
! rowspan="6" style="background:#f0e68c" | future perfect and future perfect in the past
! rowspan="3" style="background:#f0e68c" | pos.
! style="background:#f0e68c" | masc.
| {dub_futpf_pos_m_1sg}
| {dub_futpf_pos_m_2sg}
| {dub_futpf_pos_m_3sg}
|rowspan="3"| {dub_futpf_pos_1pl}
|rowspan="3"| {dub_futpf_pos_2pl}
|rowspan="3"| {dub_futpf_pos_3pl}
|-
! style="background:#f0e68c" | fem.
| {dub_futpf_pos_f_1sg}
| {dub_futpf_pos_f_2sg}
| {dub_futpf_pos_f_3sg}
|-
! style="background:#f0e68c" | neut.
| {dub_futpf_pos_n_1sg}
| {dub_futpf_pos_n_2sg}
| {dub_futpf_pos_n_3sg}
|-
! rowspan="3" style="background:#f0e68c" | neg.
! style="background:#f0e68c" | masc.
| {dub_futpf_neg_m_1sg}
| {dub_futpf_neg_m_2sg}
| {dub_futpf_neg_m_3sg}
|rowspan="3"| {dub_futpf_neg_1pl}
|rowspan="3"| {dub_futpf_neg_2pl}
|rowspan="3"| {dub_futpf_neg_3pl}
|-
! style="background:#f0e68c" | fem.
| {dub_futpf_neg_f_1sg}
| {dub_futpf_neg_f_2sg}
| {dub_futpf_neg_f_3sg}
|-
! style="background:#f0e68c" | neut.
| {dub_futpf_neg_n_1sg}
| {dub_futpf_neg_n_2sg}
| {dub_futpf_neg_n_3sg}
|-
! style="background:#9be1ff" colspan="3" | conclusive
! style="background:#9be1ff" | аз
! style="background:#9be1ff" | ти
! style="background:#9be1ff" | той/тя/то
! style="background:#9be1ff" | ние
! style="background:#9be1ff" | вие
! style="background:#9be1ff" | те
|-
! rowspan="3" style="background:#9be1ff" | present and imperfect
! colspan="2" style="background:#9be1ff" | masc.
| {conc_pres_m_1sg}
| {conc_pres_m_2sg}
| {conc_pres_m_3sg}
|rowspan="3"| {conc_pres_1pl}
|rowspan="3"| {conc_pres_2pl}
|rowspan="3"| {conc_pres_3pl}
|-
! colspan="2" style="background:#9be1ff" | fem.
| {conc_pres_f_1sg}
| {conc_pres_f_2sg}
| {conc_pres_f_3sg}
|-
! colspan="2" style="background:#9be1ff" | neut.
| {conc_pres_n_1sg}
| {conc_pres_n_2sg}
| {conc_pres_n_3sg}
|-
! rowspan="3" style="background:#9be1ff" | aorist
! colspan="2" style="background:#9be1ff" | masc.
| {conc_aor_m_1sg}
| {conc_aor_m_2sg}
| {conc_aor_m_3sg}
|rowspan="3"| {conc_aor_1pl}
|rowspan="3"| {conc_aor_2pl}
|rowspan="3"| {conc_aor_3pl}
|-
! colspan="2" style="background:#9be1ff" | fem.
| {conc_aor_f_1sg}
| {conc_aor_f_2sg}
| {conc_aor_f_3sg}
|-
! colspan="2" style="background:#9be1ff" | neut.
| {conc_aor_n_1sg}
| {conc_aor_n_2sg}
| {conc_aor_n_3sg}
|-
! rowspan="4" style="background:#9be1ff" | future and future in the past
! rowspan="3" style="background:#9be1ff" | pos.
! style="background:#9be1ff" | masc.
| {conc_fut_pos_m_1sg}
| {conc_fut_pos_m_2sg}
| {conc_fut_pos_m_3sg}
|rowspan="3"| {conc_fut_pos_1pl}
|rowspan="3"| {conc_fut_pos_2pl}
|rowspan="3"| {conc_fut_pos_3pl}
|-
! style="background:#9be1ff" | fem.
| {conc_fut_pos_f_1sg}
| {conc_fut_pos_f_2sg}
| {conc_fut_pos_f_3sg}
|-
! style="background:#9be1ff" | neut.
| {conc_fut_pos_n_1sg}
| {conc_fut_pos_n_2sg}
| {conc_fut_pos_n_3sg}
|-
! colspan="2" style="background:#9be1ff" | neg.
| {conc_fut_neg_1sg}
| {conc_fut_neg_2sg}
| {conc_fut_neg_3sg}
| {conc_fut_neg_1pl}
| {conc_fut_neg_2pl}
| {conc_fut_neg_3pl}
|-
! rowspan="3" style="background:#9be1ff" | present and past perfect
! colspan="2" style="background:#9be1ff" | masc.
| {conc_prespf_m_1sg}
| {conc_prespf_m_2sg}
| {conc_prespf_m_3sg}
|rowspan="3"| {conc_prespf_1pl}
|rowspan="3"| {conc_prespf_2pl}
|rowspan="3"| {conc_prespf_3pl}
|-
! colspan="2" style="background:#9be1ff" | fem.
| {conc_prespf_f_1sg}
| {conc_prespf_f_2sg}
| {conc_prespf_f_3sg}
|-
! colspan="2" style="background:#9be1ff" | neut.
| {conc_prespf_n_1sg}
| {conc_prespf_n_2sg}
| {conc_prespf_n_3sg}
|-
! rowspan="6" style="background:#9be1ff" | future perfect and future perfect in the past
! rowspan="3" style="background:#9be1ff" | pos.
! style="background:#9be1ff" | masc.
| {conc_futpf_pos_m_1sg}
| {conc_futpf_pos_m_2sg}
| {conc_futpf_pos_m_3sg}
|rowspan="3"| {conc_futpf_pos_1pl}
|rowspan="3"| {conc_futpf_pos_2pl}
|rowspan="3"| {conc_futpf_pos_3pl}
|-
! style="background:#9be1ff" | fem.
| {conc_futpf_pos_f_1sg}
| {conc_futpf_pos_f_2sg}
| {conc_futpf_pos_f_3sg}
|-
! style="background:#9be1ff" | neut.
| {conc_futpf_pos_n_1sg}
| {conc_futpf_pos_n_2sg}
| {conc_futpf_pos_n_3sg}
|-
! rowspan="3" style="background:#9be1ff" | neg.
! style="background:#9be1ff" | masc.
| {conc_futpf_neg_m_1sg}
| {conc_futpf_neg_m_2sg}
| {conc_futpf_neg_m_3sg}
|rowspan="3"| {conc_futpf_neg_1pl}
|rowspan="3"| {conc_futpf_neg_2pl}
|rowspan="3"| {conc_futpf_neg_3pl}
|-
! style="background:#9be1ff" | fem.
| {conc_futpf_neg_f_1sg}
| {conc_futpf_neg_f_2sg}
| {conc_futpf_neg_f_3sg}
|-
! style="background:#9be1ff" | neut.
| {conc_futpf_neg_n_1sg}
| {conc_futpf_neg_n_2sg}
| {conc_futpf_neg_n_3sg}
|-
! colspan="3" style="background:#f2b6c3" | conditional
! style="background:#f2b6c3" | аз
! style="background:#f2b6c3" | ти
! style="background:#f2b6c3" | той/тя/то
! style="background:#f2b6c3" | ние
! style="background:#f2b6c3" | вие
! style="background:#f2b6c3" | те
|-
! colspan="3" style="background:#f2b6c3" | masculine
| {cond_m_1sg}
| {cond_m_2sg}
| {cond_m_3sg}
|rowspan="3"| {cond_1pl}
|rowspan="3"| {cond_2pl}
|rowspan="3"| {cond_3pl}
|-
! colspan="3" style="background:#f2b6c3" | feminine
| {cond_f_1sg}
| {cond_f_2sg}
| {cond_f_3sg}
|-
! colspan="3" style="background:#f2b6c3" | neuter
| {cond_n_1sg}
| {cond_n_2sg}
| {cond_n_3sg}
|-
]=]
return export