Доступа к репозиторию нет, но немного наговнокодил:
--[[
http://ru.wiktionary.org/wiki/Викисловарь:Использование_словаря_Зализняка
http://ru.wikipedia.org/wiki/Склонение_(лингвистика)
http://ru.wikipedia.org/wiki/Спряжение
http://ru.wikipedia.org/wiki/Одушевлённость_(грамматика)
http://ru.wiktionary.org/wiki/Категория:Шаблоны_словоизменений
http://ru.wiktionary.org/wiki/Категория:Шаблоны_словоизменений/Прилагательные
http://ru.wiktionary.org/wiki/Категория:Шаблоны_словоизменений/Существительные/Одушевлённые/Мужской_род
http://ru.wiktionary.org/wiki/Шаблон:прил_ru_3*a/b
]]
Dictionary={noun={}, adjective={}, pronoun={}, numeral={}} -- существительные, прилагательные, местоимения, числительные
Templates={}
Templates.adjective={
['4a'] = function(word, base, animacy) -- нет разных слов для одуш./неодуш.
return { type = 'adjective', word = word
, nominative = { -- именительный
singular = { masculine = base..'ий', neuter = base..'ее', feminine = base..'ая'}
, plural = base..'ие' }
, genitive = { -- родительный
singular = { masculine = base..'его', neuter = base..'его', feminine = base..'ей'}
, plural = base..'их' }
, dative = { -- дательный
singular = { masculine = base..'ему', neuter = base..'ему', feminine = base..'ей'}
, plural = base..'им' }
, accusative = { -- винительный
singular = { masculine = (animacy and base..'его' or base..'ий'), neuter = base..'ее', feminine = base..'ую'}
, plural = (animacy and base..'их' or base..'ие') }
, instrumental ={ -- творительный
singular = { masculine = base..'им', neuter = base..'им', feminine = base..'ей'}
, plural = base..'ими' }
, prepositional={ -- предложный
singular = { masculine = base..'ем', neuter = base..'ем', feminine = base..'ей'}
, plural = base..'их' }
}
end
}
Templates.noun = {
['a 1a'] = function(word, base) -- http://ru.wiktionary.org/wiki/Шаблон:сущ_ru_m_a_1a http://ru.wiktionary.org/wiki/Шаблон:сущ_ru_f_a_1a http://ru.wiktionary.org/wiki/Шаблон:сущ_ru_n_a_1a
return { type = 'noun', word = word
, nominative = { singular = { masculine = base..'', neuter = base..'о', feminine = base..'а'}
, plural = { masculine = base..'ы', neuter = base..'а', feminine = base..'ы' } }
, genitive = { singular = { masculine = base..'а', neuter = base..'а', feminine = base..'ы'}
, plural = { masculine = base..'ов', neuter = base..'', feminine = base..''} }
, dative = { singular = { masculine = base..'у', neuter = base..'у', feminine = base..'е'}
, plural = { masculine = base..'ам', neuter = base..'ам', feminine = base..'ам'} }
, accusative = { singular = { masculine = base..'а', neuter = base..'о', feminine = base..'у'}
, plural = { masculine = base..'ов', neuter = base..'', feminine = base..''} }
, instrumental = { singular = { masculine = base..'ом', neuter = base..'ом', feminine = base..'ой'}
, plural = { masculine = base..'ами', neuter = base..'ами', feminine = base..'ами'} }
, prepositional = { singular = { masculine = base..'е', neuter = base..'е', feminine = base..'е'}
, plural = { masculine = base..'ах', neuter = base..'ах', feminine = base..'ах'} }
}
end
}
-- verb - глаголы?
-- число, род, падеж
-- основа, основа1, основа2
-- краткая форма?
-- одушевленность (animacy) - винительный?
function adjective(word, dtype, base, animacy)
local a = Dictionary.adjective
-- добавляет (если не было) слово word в таблицу Dictionary.adjective и возвращает таблицу
-- dtype - тип склонения по классификации А. Зализняка (Dictionary.adjective.Templates)
-- base - строка или таблица с основами
if not a[word] then
a[word] = Templates.adjective[dtype](word, base, animacy)
end
return a[word]
end
function noun(word, dtype, base)
local n = Dictionary.noun
if not n[word] then
n[word] = Templates.noun[dtype](word, base)
end
return n[word]
end
Monsters = {
former_sergeant={
name = {
adjective('бывший', '4a', 'бывш', true) -- http://ru.wiktionary.org/wiki/бывший
, noun('сержант','a 1a','сержант', true) -- http://ru.wiktionary.org/wiki/сержант
}, gender = 'masculine'
}
}
function declension(monster, case, number)
local tbl = {}
for k, v in ipairs(monster.name) do
local tmp = Dictionary[v.type][v.word][case][number]
if type(tmp) == 'table' then tmp = tmp[monster.gender] end
table.insert(tbl, tmp)
end
return table.concat(tbl,' ')
end
local mfs = Monsters.former_sergeant
print( 'именительный', declension(mfs, 'nominative', 'singular'), declension(mfs, 'nominative', 'plural') )
print( 'родительный ', declension(mfs, 'genitive', 'singular'), declension(mfs, 'genitive', 'plural') )
print( 'дательный ', declension(mfs, 'dative', 'singular'), declension(mfs, 'dative', 'plural') )
print( 'винительный ', declension(mfs, 'accusative', 'singular'), declension(mfs, 'accusative', 'plural') )
print( 'творительный', declension(mfs, 'instrumental', 'singular'), declension(mfs, 'instrumental', 'plural') )
print( 'предложный ', declension(mfs, 'prepositional', 'singular'),declension(mfs, 'prepositional', 'plural') )
>lua test.lua
именительный бывший сержант бывшие сержанты
родительный бывшего сержанта бывших сержантов
дательный бывшему сержанту бывшим сержантам
винительный бывшего сержанта бывших сержантов
творительный бывшим сержантом бывшими сержантами
предложный бывшем сержанте бывших сержантах