Цитата: Алексей Гринь от декабря 27, 2013, 03:01Программа SCA от //zompist.com?Вообще это родовое название таких программ.
Цитироватьmatch (X<<K>>Y) | (_, velar, dental & voiced) -> ...
Цитата: Bhudh от декабря 26, 2013, 07:02Программа SCA от //zompist.com?
(Google) "sound change applier"
ЦитироватьS=ptcто у меня явно более high-level. С их cryptic/write-only переменными запутаться можно, без сто грамм не разберёшь, что Z это звонкие смычные (определённые через фрикатив!), особенно если правил очень много.
Z=bdg
Stage 0
{
public
ḱ: velar, palatal=true, voiced=false;
k: velar, palatal=false, voiced=false;
ǵ: velar, palatal=true, voiced=true;
g: velar, palatal=false, voiced=true;
t: dental, voiced=false;
d: dental, voiced=true;
macro plain = ~palatal;
}
Stage 1 inherits Stage 0
{
.Name = "PalatalPlainVelarMerger";
private
t: stage1_lenitor
d: stage1_lenitor
public
for all [velar & palatal] = match (`k+1)
| stage1_lenitor -> `k ^ (`k+1).voiced ^ plain
| _ -> `k ^ plain;
}
ЦитироватьStage 1 inherits Stage 0 {И так, трансформации (фонетические переходы) группируются в стадии (ключевое слово Stage). Стадия это некая отдельное состояние языка, с описанием новых переходов, новыми звуками и т.д. Стадия может наследовать другую стадию (ключевое слово inherits): т.е., новое состояние языка наследуют существующие звуки, добавляя что-то новое, изменяя или удаляя. При наследовании, команды исполняются последовательно от стадии-родителя к стадии-потомку. Внутри стадии все команды параллельны друг к другу. Любая новая стадия может наследовать любую существующую стадию, поэтому можно будет создавать описания языков-потомков просто указывая файл-описание языка-родителя и номер стадии его развития.
Цитироватьǵ: velar, palatal=true, voiced=true;Далее идёт перечисление звуков через синтаксис "символ: атрибут, атрибут, ..., атрибут". Символом атрибута может быть любой набор Unicode-значений, это всё условности. Атрибут символа это некая абстрактная единица его описания, атрибут можно рассматривать двояко: и как просто свойство, и как название фонетической группы. Напр., звуки k и g могут иметь атрибут "velar". Программе без разницы, что это значит, это просто некая условность. По умолчанию, если значение атрибута не установлено, то подразумевается true.
Цитироватьfor all [velar & palatal] = match (`k+1)Основная логика стадии.
| stage1_lenitor -> `k ^ (`k+1).voiced ^ plain
| _ -> `k ^ plain;
Цитировать| stage1_lenitor ->Далее символ, следующий за текущим во введённом слове (если бы имели for loop, то это был бы i+1) сравнивается с stage1_lenitor: есть ли у него такой атрибут? Если есть, то логика идёт дальше направо после оператора ->. Если такого атрибута нет, то логика идёт ниже за оператор |. Т.е. мы смотрим: если следующий звук после любого velar palatal звука является stage1_lenitor (т.е. t или d), то мы идём вправо по текущей ветви, иначе идём вниз и продолжим сравнивать. Знак _ значит «если ни одно сравнение выше не было верно, выполнить тогда это, чё уж поделать».
Цитировать`k ^ (`k+1).voicedВ данном случае мы говорим, что трансформированный звук во введённом слове есть тот же старый звук, однако мы ещё добавляем (^) к нему атрибут voiced (может быть true или false) у следующего звука (`k+1) Т.е. производим регрессивную ассимиляцию по звонкости. Можно отрицать атрибуты с помощью оператора ~. Т.е. например "`k ^ ~palatal" значит депалатализация.
Страница создана за 0.027 сек. Запросов: 22.