From 4729fcc3e0bc147d8250923d3d6e9933bef5ec05 Mon Sep 17 00:00:00 2001 From: Jillian Chang Date: Wed, 1 Sep 2021 18:22:46 -0400 Subject: [PATCH 1/5] started working on markups for the variable rules --- grammars/inventory.grm | 6 +++++ grammars/meter.grm | 27 ++++++++++++++++++-- grammars/variable.grm | 58 +++++++++++++++++++++++++++++++++--------- 3 files changed, 77 insertions(+), 14 deletions(-) diff --git a/grammars/inventory.grm b/grammars/inventory.grm index c6a8d05..cd2283f 100644 --- a/grammars/inventory.grm +++ b/grammars/inventory.grm @@ -48,6 +48,12 @@ export PHONEME = Optimize[ "o" | "oː" | "õː" | "p" | "r" | "s" | "t" | "u" | "uː" | "ũː" | "w" | "z" | b.kSpace]; +export STRIKETHROUGH = Optimize[ + "a̶ ̶" | "e̶ ̶" | "i̶ ̶" | "o̶ ̶" | "u̶ ̶" | "ã̶ː̶ ̶" | + "ẽ̶ː̶ ̶" | "ĩ̶ː̶ ̶" | "õ̶ː̶ ̶" | "ũ̶ː̶ ̶" | "a̶ː̶ ̶" | + "e̶ː̶ ̶" | "i̶ː̶ ̶" | "o̶ː̶ ̶" | "u̶ː̶ ̶" | "o̶j̶ ̶" | + "a̶j̶ ̶" | "a̶w̶ ̶" | "h̶"]; + # Prosodic symbols. export NUCLEUS = Optimize["U" | # Short nucleus. "-"]; # Long nucleus. diff --git a/grammars/meter.grm b/grammars/meter.grm index 1fb2b8e..4ec231b 100644 --- a/grammars/meter.grm +++ b/grammars/meter.grm @@ -7,7 +7,12 @@ import 'inventory.grm' as i; import 'byte.grm' as b; import 'utility.grm' as u; -sigma_star = (i.PROSODIC_SYMBOL | i.PHONEME)*; +sigma_star = (i.PROSODIC_SYMBOL | i.PHONEME | i.STRIKETHROUGH | "‿")*; + +insert_space_resyllabification = Optimize[CDRewrite[u.Insert[" "], + "", i.CONSONANT "‿", sigma_star]]; + +delete_markups = Optimize[u.Rewrite[u.Delete[i.STRIKETHROUGH | "‿"], sigma_star]]; ## Syllable parsing. @@ -24,6 +29,8 @@ onset = Optimize[ # "x", "mn", and "phth" onsets are found word-initially in Greek names. CDRewrite[(s_cluster | "ks" | "mn" | "pt") : "O", i.BOW, i.NUCLEUS, sigma_star] @ + # Resyllabification consonants. + CDRewrite[i.CONSONANT : "O", "", "‿", sigma_star] @ # This allows for both syllable parses of muta cum liquida clusters. CDRewrite[(muta_cum_liquida | labiovelar | i.CONSONANT) : "O", "", i.NUCLEUS, sigma_star, 'rtl', 'obl'] @@ -31,7 +38,8 @@ onset = Optimize[ coda = Optimize[u.Rewrite[i.CONSONANT+ : "C", sigma_star]]; -export SYLLABLE = Optimize[long_nucleus @ short_nucleus @ onset @ coda]; +export SYLLABLE = Optimize[insert_space_resyllabification @ delete_markups @ + long_nucleus @ short_nucleus @ onset @ coda]; ## Syllable weight. @@ -194,3 +202,18 @@ test_syllable_2_278 = AssertEqual[ test_defective_1 = AssertNull[ "kũː siːk uːnanimãː adlokwitur male saːna soroːrẽː" @ METER ]; + +## Tests syllable parsing on variable rule markups. + +test_syllable_resyllabify = AssertEqual[ + "ab‿oris" @ SYLLABLE, + "U OUOUC" +]; +test_syllable_elision = AssertEqual[ + "multũ̶ː̶ ̶ille" @ SYLLABLE, + "OUCOUCOU" +]; +test_syllable_h_deletion = AssertEqual[ + "fuit‿h̶ok" @ SYLLABLE, + "OUU OUC" +]; diff --git a/grammars/variable.grm b/grammars/variable.grm index 2cc6fd2..690d7c9 100644 --- a/grammars/variable.grm +++ b/grammars/variable.grm @@ -1,30 +1,39 @@ # Implements variable sandhi phenomena, such as elision, resyllabification, -# diaeresis, synizesis, hypermetric lengthening, etc. +# diaeresis, and synizesis. import 'byte.grm' as b; import 'inventory.grm' as i; import 'utility.grm' as u; -sigma_star = (i.PROSODIC_SYMBOL | i.PHONEME)*; +sigma_star = (i.PROSODIC_SYMBOL | i.PHONEME | i.STRIKETHROUGH | "‿")*; h_deletion = Optimize[ - CDRewrite[u.Delete["h"] <1>, "", "", sigma_star, 'ltr', 'opt'] + CDRewrite["h" : "h̶", "", "", sigma_star, 'ltr', 'opt'] ]; # A final syllable ending in a vowel, letter m, or diphthong is removed # before a word beginning with a vowel (or an h-). -elision = Optimize[ - CDRewrite[u.Delete[(i.PHONEMIC_VOWEL | "oj" | "aj" | "aw") " "] <100>, - "", i.PHONEMIC_VOWEL, sigma_star, 'ltr', 'opt'] -]; +elision = Optimize[CDRewrite[("a " : "a̶ ̶") | + ("e " : "e̶ ̶") | + ("i " : "i̶ ̶") | + ("o " : "o̶ ̶") | + ("u " : "u̶ ̶") | + ("ãː " : "ã̶ː̶ ̶") | + ("ẽː " : "ẽ̶ː̶ ̶") | + ("ĩː " : "ĩ̶ː̶ ̶") | + ("õː " : "õ̶ː̶ ̶") | + ("ũː " : "ũ̶ː̶ ̶") | + ("aː " : "a̶ː̶ ̶") | + ("eː " : "e̶ː̶ ̶") | + ("iː " : "i̶ː̶ ̶") | + ("oː " : "o̶ː̶ ̶") | + ("uː " : "u̶ː̶ ̶") + , "", "h̶"? i.PHONEMIC_VOWEL, sigma_star]]; # Word-final consonant reattaches to the following word with an initial vowel. -# TODO: orthographically annotate using "‿". resyllabification = Optimize[ - CDRewrite[u.Insert[" "] <10>, - "", i.CONSONANT " " i.PHONEMIC_VOWEL, sigma_star, 'ltr', 'opt'] @ - CDRewrite[u.Delete[" "] <10>, - " " i.CONSONANT, i.PHONEMIC_VOWEL, sigma_star] + CDRewrite[ " " : "‿", + i.CONSONANT, "h̶"? i.PHONEMIC_VOWEL, sigma_star] ]; # High vowels may strengthen to their corresponding glides when adjacent to @@ -53,6 +62,31 @@ diastole = Optimize[ export VARIABLE = Optimize[h_deletion @ resyllabification @ elision @ synizesis @ diaeresis]; +# Tests elision markup +test_elision = AssertEqual[ + "tantajne animiːs" @ elision, + "tantajne̶ ̶animiːs" +]; + +# Tests h deletion + elision markup. +test_elision_2 = AssertEqual[ + "atkwe hominũː" @ h_deletion @ elision, + "atkwe̶ ̶h̶ominũː" +]; + +# Tests resyllabification markup. +test_resyllabification = AssertEqual[ + "ab oris" @ resyllabification, + "ab‿oris" +]; + +# Tests h deletion + resyllabification markup. +test_h_deletion = AssertEqual[ + "fuit hok" @ h_deletion @ resyllabification, + "fuit‿h̶ok" +]; + + # TODOs: # * Hypermeter: when a period has an extra syllable ending in a vowel # or m which is elided into the first word of the following period, often with -que words. From 1a8b914ad3be4efc32641035d34c51ea93d45a2a Mon Sep 17 00:00:00 2001 From: Jillian Chang Date: Sat, 4 Sep 2021 12:48:01 -0400 Subject: [PATCH 2/5] Added synizesis and diaeresis markups --- grammars/inventory.grm | 6 +++++ grammars/meter.grm | 36 ++++++++++++++++++++++++---- grammars/variable.grm | 53 ++++++++++++++++++++++++++++-------------- 3 files changed, 72 insertions(+), 23 deletions(-) diff --git a/grammars/inventory.grm b/grammars/inventory.grm index cd2283f..8e42a75 100644 --- a/grammars/inventory.grm +++ b/grammars/inventory.grm @@ -54,6 +54,12 @@ export STRIKETHROUGH = Optimize[ "e̶ː̶ ̶" | "i̶ː̶ ̶" | "o̶ː̶ ̶" | "u̶ː̶ ̶" | "o̶j̶ ̶" | "a̶j̶ ̶" | "a̶w̶ ̶" | "h̶"]; +export UMLAUT = Optimize["ü" | "ï"]; + +export MARKUPS = Optimize[ + STRIKETHROUGH | UMLAUT | "‿" | "͡" +]; + # Prosodic symbols. export NUCLEUS = Optimize["U" | # Short nucleus. "-"]; # Long nucleus. diff --git a/grammars/meter.grm b/grammars/meter.grm index 4ec231b..25f3671 100644 --- a/grammars/meter.grm +++ b/grammars/meter.grm @@ -7,18 +7,27 @@ import 'inventory.grm' as i; import 'byte.grm' as b; import 'utility.grm' as u; -sigma_star = (i.PROSODIC_SYMBOL | i.PHONEME | i.STRIKETHROUGH | "‿")*; +sigma_star = (i.PROSODIC_SYMBOL | i.PHONEME | i.MARKUPS)*; insert_space_resyllabification = Optimize[CDRewrite[u.Insert[" "], "", i.CONSONANT "‿", sigma_star]]; -delete_markups = Optimize[u.Rewrite[u.Delete[i.STRIKETHROUGH | "‿"], sigma_star]]; +# Removes markups for elision and resyllabification. +delete_strikethrough_undertie = Optimize[u.Rewrite[u.Delete[i.STRIKETHROUGH | "‿"], + sigma_star]]; + +# Removes the ligature tie and rewrites "i" or "u" to "j" or "w," respectively. +synizesis_cleanup = Optimize[ + CDRewrite[(("i" | "iː") : "j") | (("u" | "uː") : "w"), "͡", "", sigma_star] @ + CDRewrite[(("i" | "iː") : "j") | (("u" | "uː") : "w"), "", "͡", sigma_star] @ + u.Rewrite[u.Delete["͡"], sigma_star] +]; ## Syllable parsing. long_nucleus = Optimize[u.Rewrite[i.LONG_VOWEL : "-", sigma_star]]; -short_nucleus = Optimize[u.Rewrite[i.SHORT_VOWEL : "U", sigma_star]]; +short_nucleus = Optimize[u.Rewrite[i.SHORT_VOWEL | i.UMLAUT : "U", sigma_star]]; muta_cum_liquida = ((i.STOP | "f") i.LIQUID) - ("tl" | "dl"); s_cluster = "s" ((i.VOICELESS_STOP (i.LIQUID | "w")?) - "tl"); @@ -38,8 +47,9 @@ onset = Optimize[ coda = Optimize[u.Rewrite[i.CONSONANT+ : "C", sigma_star]]; -export SYLLABLE = Optimize[insert_space_resyllabification @ delete_markups @ - long_nucleus @ short_nucleus @ onset @ coda]; +export SYLLABLE = Optimize[insert_space_resyllabification @ + delete_strikethrough_undertie @ synizesis_cleanup @ + long_nucleus @ short_nucleus @ onset @ coda]; ## Syllable weight. @@ -217,3 +227,19 @@ test_syllable_h_deletion = AssertEqual[ "fuit‿h̶ok" @ SYLLABLE, "OUU OUC" ]; +test_syllable_synizesis_1 = AssertEqual[ + "su͡aːsit" @ SYLLABLE, + "O-OUC" +]; +test_syllable_synizesis_2 = AssertEqual[ + "laːwiːni͡akwe" @ SYLLABLE, + "O-O-COUOU" +]; +test_syllable_synizesis_3 = AssertEqual[ + "awre͡iːs" @ SYLLABLE, + "UCOUC" +]; +test_diaeresis_1 = AssertEqual[ + "troːïa" @ SYLLABLE, + "O-UU" +]; diff --git a/grammars/variable.grm b/grammars/variable.grm index 4a97ee2..46a1d96 100644 --- a/grammars/variable.grm +++ b/grammars/variable.grm @@ -5,15 +5,15 @@ import 'byte.grm' as b; import 'inventory.grm' as i; import 'utility.grm' as u; -sigma_star = (i.PROSODIC_SYMBOL | i.PHONEME | i.STRIKETHROUGH | "‿")*; +sigma_star = (i.PROSODIC_SYMBOL | i.PHONEME | i.MARKUPS)*; h_deletion = Optimize[ - CDRewrite["h" : "h̶", "", "", sigma_star, 'ltr', 'opt'] + CDRewrite[("h" : "h̶") <1>, "", "", sigma_star, 'ltr', 'opt'] ]; # A final syllable ending in a vowel, letter m, or diphthong is removed # before a word beginning with a vowel (or an h-). -elision = Optimize[CDRewrite[("a " : "a̶ ̶") | +elision = Optimize[CDRewrite[(("a " : "a̶ ̶") | ("e " : "e̶ ̶") | ("i " : "i̶ ̶") | ("o " : "o̶ ̶") | @@ -27,29 +27,29 @@ elision = Optimize[CDRewrite[("a " : "a̶ ̶") | ("eː " : "e̶ː̶ ̶") | ("iː " : "i̶ː̶ ̶") | ("oː " : "o̶ː̶ ̶") | - ("uː " : "u̶ː̶ ̶") - , "", "h̶"? i.PHONEMIC_VOWEL, sigma_star]]; + ("uː " : "u̶ː̶ ̶")) <100> + , "", "h̶"? i.PHONEMIC_VOWEL, sigma_star, 'ltr', 'opt']]; # Word-final consonant reattaches to the following word with an initial vowel. resyllabification = Optimize[ - CDRewrite[ " " : "‿", - i.CONSONANT, "h̶"? i.PHONEMIC_VOWEL, sigma_star] + CDRewrite[(" " : "‿") <10>, + i.CONSONANT, "h̶"? i.PHONEMIC_VOWEL, sigma_star, 'ltr', 'opt'] ]; # High vowels may strengthen to their corresponding glides when adjacent to # another vowel. synizesis = Optimize[ - CDRewrite[((("i" | "iː") : "j") | (("u" | "uː") : "w")) <1000>, - "", i.PHONEMIC_VOWEL, sigma_star, 'ltr', 'opt'] @ - CDRewrite[((("i" | "iː") : "j") | (("u" | "uː") : "w")) <1000>, - i.PHONEMIC_VOWEL, "", sigma_star, 'ltr', 'opt'] + CDRewrite[u.Insert["͡"] <1000>, + ("i" | "iː" | "u" | "uː") , i.PHONEMIC_VOWEL, sigma_star, 'ltr', 'opt'] @ + CDRewrite[u.Insert["͡"] <1000>, + i.PHONEMIC_VOWEL, ("i" | "iː" | "u" | "uː"), sigma_star, 'ltr', 'opt'] ]; # Glides may lenite to their corresponding vowels. diaeresis = Optimize[ - CDRewrite[("w" : "u") <1000>, + CDRewrite[("w" : "ü") <1000>, "k" | "g", "", sigma_star, 'ltr', 'opt'] @ - CDRewrite[("jj" : "i") <1000>, + CDRewrite[("jj" : "ï") <1000>, i.PHONEMIC_VOWEL, i.PHONEMIC_VOWEL, sigma_star, 'ltr', 'opt'] ]; @@ -88,9 +88,26 @@ test_h_deletion = AssertEqual[ "fuit‿h̶ok" ]; +# Tests synizesis of "u." +test_synizesis = AssertEqual[ + "suaːsit" @ synizesis, + "su͡aːsit" +]; + +# Tests synizesis of "j." +test_synizesis_2 = AssertEqual[ + "laːwiːniakwe" @ synizesis, + "laːwiːni͡akwe" +]; -# TODOs: -# * Hypermeter: when a period has an extra syllable ending in a vowel -# or m which is elided into the first word of the following period, often with -que words. -# (1.448 ajrea kuj gradibus surgeːbant liːmina neksajkwe) -# * Systole +# Tests synizesis of "j." +test_synizesis_3 = AssertEqual[ + "aureiːs" @ synizesis, + "aure͡iːs" +]; + +# Tests diaeresis of intervocalic "j." +test_diaeresis_1 = AssertEqual[ + "troːjja" @ diaeresis, + "troːïa" +]; From a2ff61fe3ec3c8a5ad728eac679b1f722faf8adc Mon Sep 17 00:00:00 2001 From: Jillian Chang Date: Tue, 7 Sep 2021 12:51:49 -0400 Subject: [PATCH 3/5] edit markups based on scansion failures --- grammars/inventory.grm | 8 ++-- grammars/meter.grm | 30 ++++++++++++-- grammars/pronounce.grm | 19 +++++++-- grammars/variable.grm | 91 ++++++++++++++++++++++++++++++++++-------- 4 files changed, 120 insertions(+), 28 deletions(-) diff --git a/grammars/inventory.grm b/grammars/inventory.grm index 8e42a75..666c2f8 100644 --- a/grammars/inventory.grm +++ b/grammars/inventory.grm @@ -27,7 +27,7 @@ oral_vowel = "a" | "e" | "i" | "o" | "u"; nasal_vowel = "ã" | "ẽ" | "ĩ" | "õ" | "ũ"; export SHORT_VOWEL = Optimize[oral_vowel | nasal_vowel]; export LONG_VOWEL = SHORT_VOWEL "ː"; -export PHONEMIC_VOWEL = SHORT_VOWEL | LONG_VOWEL; +export PHONEMIC_VOWEL = SHORT_VOWEL | LONG_VOWEL | "ü"; # Phonemic consonants. export VOICELESS_STOP = Optimize["p" | "t" | "k"]; @@ -50,9 +50,9 @@ export PHONEME = Optimize[ export STRIKETHROUGH = Optimize[ "a̶ ̶" | "e̶ ̶" | "i̶ ̶" | "o̶ ̶" | "u̶ ̶" | "ã̶ː̶ ̶" | - "ẽ̶ː̶ ̶" | "ĩ̶ː̶ ̶" | "õ̶ː̶ ̶" | "ũ̶ː̶ ̶" | "a̶ː̶ ̶" | - "e̶ː̶ ̶" | "i̶ː̶ ̶" | "o̶ː̶ ̶" | "u̶ː̶ ̶" | "o̶j̶ ̶" | - "a̶j̶ ̶" | "a̶w̶ ̶" | "h̶"]; + "ẽ̶ː̶ ̶" | "ĩ̶ː̶ ̶" | "õ̶ː̶ ̶" | "ũ̶ː̶ ̶" | "ü̶ː̶ " | + "a̶ː̶ ̶" | "e̶ː̶ ̶" | "i̶ː̶ ̶" | "o̶ː̶ ̶" | "u̶ː̶ ̶" | + "ü̶m̶ ̶" | "o̶j̶ ̶" | "a̶j̶ ̶" | "a̶w̶ ̶" | "h̶"]; export UMLAUT = Optimize["ü" | "ï"]; diff --git a/grammars/meter.grm b/grammars/meter.grm index 25f3671..ea59458 100644 --- a/grammars/meter.grm +++ b/grammars/meter.grm @@ -19,9 +19,9 @@ delete_strikethrough_undertie = Optimize[u.Rewrite[u.Delete[i.STRIKETHROUGH | " # Removes the ligature tie and rewrites "i" or "u" to "j" or "w," respectively. synizesis_cleanup = Optimize[ CDRewrite[(("i" | "iː") : "j") | (("u" | "uː") : "w"), "͡", "", sigma_star] @ - CDRewrite[(("i" | "iː") : "j") | (("u" | "uː") : "w"), "", "͡", sigma_star] @ - u.Rewrite[u.Delete["͡"], sigma_star] -]; + CDRewrite[(("i" | "iː") : "j") | (("u" | "uː") : "w"), "", "͡", sigma_star] @ + u.Rewrite[u.Delete["͡"], sigma_star] + ]; ## Syllable parsing. @@ -243,3 +243,27 @@ test_diaeresis_1 = AssertEqual[ "troːïa" @ SYLLABLE, "O-UU" ]; +test_markup_1 = AssertEqual[ + "troːas rellikwiaːs danaü̶m̶ ̶atkwe̶ ̶immiːtis‿akilliː" @ METER, + "SDDSDS" +]; +test_markup_4 = AssertEqual[ + "doːna kareːre doliːs danaüm siːk noːtus‿ulikseːs" @ METER, + "DDDSDS" +]; +test_markup_5 = AssertEqual[ + "wellitur‿h̶ujk aːtroː liːkuntur saŋgwine guttaj" @ METER, + "DSSSDS" +]; +# test_markup_6 = AssertEqual[ +# "koːnuːbi͡iːs arwiːskwe nowiːs operaːta juwentuːs" @ METER, +# "SSDDDS" +#]; +test_markup_7 = AssertEqual[ + "aːreːbant herba̶j̶ ̶et wiːktũː seges‿ajgra negaːbat" @ METER, + "SSSDDS" +]; +#test_markup_8 = AssertEqual[ +# "ku͡ikwe lokiː leːgeːs dedimus‿koːnuːbia nostra" @ METER, +# "DSDSDT" +#]; diff --git a/grammars/pronounce.grm b/grammars/pronounce.grm index a9a503b..1d361a9 100644 --- a/grammars/pronounce.grm +++ b/grammars/pronounce.grm @@ -42,7 +42,7 @@ u_loss = Optimize[u.Rewrite[("nguu": "ngu") | ("quu" : "ku"), sigma_star]]; qu = Optimize[u.Rewrite["qu" : "kw", sigma_star]]; # If "gu" proceeds "n" and precedes a vowel, it is pronounced as a labiovelar. -ngu = Optimize[CDRewrite["gu" : "gw", "n", i.VOWEL, sigma_star]]; +ngu = Optimize[CDRewrite["gu" : "gw", "n", i.PHONEMIC_VOWEL, sigma_star]]; # These words form an "ei" diphthong, rather than the normal hiatus. ei_exceptions = Optimize[u.RewriteWord[("dein" : "dẽːj") | @@ -80,6 +80,10 @@ ui_exceptions = Optimize[u.RewriteWord[("hui" : "huj") | sigma_star] ]; +ae_diphthonization = Optimize[u.Rewrite["ae": "aj", sigma_star]]; +oe_diphthonization = Optimize[u.Rewrite["oe" : "oj", sigma_star]]; +au_diphthonization = Optimize[u.Rewrite["au" : "aw", sigma_star]]; + diphthongization = Optimize[u.Rewrite[("ae" : "aj") | ("oe" : "oj") | ("au" : "aw"), @@ -142,13 +146,14 @@ devoicing = Optimize[CDRewrite["b" : "p", "", "s" | "t", sigma_star]]; rules = Optimize[ + # Diphthong exceptions. + ei_exceptions @ eu_exceptions @ oi_exceptions @ ou_exceptions @ ui_exceptions @ # Basic g2p rules. long_monophthongs @ digraphs @ unconditioned_rewrites @ # Rules for labiovelars. - u_loss @ qu @ ngu @ gn + u_loss @ qu @ ngu @ gn @ # Vowel rules. - ei_exceptions @ eu_exceptions @ oi_exceptions @ ou_exceptions @ ui_exceptions @ - diphthongization @ diaeresis @ + ae_diphthonization @ oe_diphthonization @ au_diphthonization @ diaeresis @ # Gemination. geminates @ # Nasal rules. @@ -266,6 +271,12 @@ test_pron_18 = AssertEqual[ "prajdãː adserwaːbant huːk undikwe troːia gazza" ]; +# Tests "au" diphthongization. +test_pron_19 = AssertEqual[ + "aut pelagō danaum īnsidiās suspectaque dōna" @ PRONOUNCE, + "awt pelagoː danawm iːnsidiaːs suspektakwe doːna" +]; + # TODO: # * Uncertainty about quīcumque: either kwiːkuŋkwe or kwiːkũːkwe? # * The clitics -que, -ne and -ue should act like the end of a word. diff --git a/grammars/variable.grm b/grammars/variable.grm index 46a1d96..8efc49a 100644 --- a/grammars/variable.grm +++ b/grammars/variable.grm @@ -8,7 +8,11 @@ import 'utility.grm' as u; sigma_star = (i.PROSODIC_SYMBOL | i.PHONEME | i.MARKUPS)*; h_deletion = Optimize[ - CDRewrite[("h" : "h̶") <1>, "", "", sigma_star, 'ltr', 'opt'] + # Delete medial "h" to permit additional variable rules, if needed (such as synizesis). + CDRewrite[u.Delete["h"] <1>, + i.PHONEME - b.kSpace, i.PHONEME - b.kSpace, sigma_star] @ + CDRewrite[("h" : "h̶") <1>, + "", "", sigma_star] ]; # A final syllable ending in a vowel, letter m, or diphthong is removed @@ -27,38 +31,45 @@ elision = Optimize[CDRewrite[(("a " : "a̶ ̶") | ("eː " : "e̶ː̶ ̶") | ("iː " : "i̶ː̶ ̶") | ("oː " : "o̶ː̶ ̶") | - ("uː " : "u̶ː̶ ̶")) <100> - , "", "h̶"? i.PHONEMIC_VOWEL, sigma_star, 'ltr', 'opt']]; + ("uː " : "u̶ː̶ ̶") | + ("üm " : "ü̶m̶ ̶") | + ("oj " : "o̶j̶ ̶") | + ("aj " : "a̶j̶ ̶") | + ("aw " : "a̶w̶ ̶")) + , "", "h̶"? i.PHONEMIC_VOWEL, sigma_star]]; # Word-final consonant reattaches to the following word with an initial vowel. resyllabification = Optimize[ - CDRewrite[(" " : "‿") <10>, - i.CONSONANT, "h̶"? i.PHONEMIC_VOWEL, sigma_star, 'ltr', 'opt'] + CDRewrite[(" " : "‿"), + i.CONSONANT, "h̶"? i.PHONEMIC_VOWEL, sigma_star] ]; # High vowels may strengthen to their corresponding glides when adjacent to # another vowel. synizesis = Optimize[ - CDRewrite[u.Insert["͡"] <1000>, - ("i" | "iː" | "u" | "uː") , i.PHONEMIC_VOWEL, sigma_star, 'ltr', 'opt'] @ - CDRewrite[u.Insert["͡"] <1000>, - i.PHONEMIC_VOWEL, ("i" | "iː" | "u" | "uː"), sigma_star, 'ltr', 'opt'] + CDRewrite[u.Insert["͡"], + ("i" | "iː" | "u" | "uː") , i.PHONEMIC_VOWEL, sigma_star] @ + CDRewrite[u.Insert["͡"], + i.PHONEMIC_VOWEL, ("i" | "iː" | "u" | "uː"), sigma_star] ]; # Glides may lenite to their corresponding vowels. diaeresis = Optimize[ - CDRewrite[("w" : "ü") <1000>, - "k" | "g", "", sigma_star, 'ltr', 'opt'] @ - CDRewrite[("jj" : "ï") <1000>, - i.PHONEMIC_VOWEL, i.PHONEMIC_VOWEL, sigma_star, 'ltr', 'opt'] + CDRewrite[("w" : "ü"), + "k" | "g", "", sigma_star] @ + # "aw" diphthongs preceding final m may lenite. + CDRewrite[("w" : "ü"), + "", "m", sigma_star] @ + CDRewrite[("jj" : "ï"), + i.PHONEMIC_VOWEL, i.PHONEMIC_VOWEL, sigma_star] ]; # Lengthening of a usually short syllable. # NB: this is not currently part of the exported VARIABLE cascade. diastole = Optimize[ CDRewrite[(("a" : "aː") | ("e" : "eː") | ("i" : "iː") | - ("o" : "oː") | ("u" : "uː")) <10000>, - "", "", sigma_star, 'ltr', 'opt'] + ("o" : "oː") | ("u" : "uː")), + "", "", sigma_star] ]; export VARIABLE = Optimize[h_deletion @ resyllabification @ elision @ @@ -102,8 +113,8 @@ test_synizesis_2 = AssertEqual[ # Tests synizesis of "j." test_synizesis_3 = AssertEqual[ - "aureiːs" @ synizesis, - "aure͡iːs" + "awreiːs" @ synizesis, + "awre͡iːs" ]; # Tests diaeresis of intervocalic "j." @@ -111,3 +122,49 @@ test_diaeresis_1 = AssertEqual[ "troːjja" @ diaeresis, "troːïa" ]; + +## Tests for scansion failures. +test_fail_1 = AssertEqual[ + "nekdũː etiãː kawsaj iːraːrũː sajwiːkwe doloːreːs" @ elision, + "nekdũ̶ː̶ ̶etiãː kawsa̶j̶ ̶iːraːrũː sajwiːkwe doloːreːs" +]; +test_fail_2 = AssertEqual[ + "troːas rellikwiaːs danawm atkwe immiːtis akilliː" @ diaeresis @ elision @ resyllabification, + "troːas rellikwiaːs danaü̶m̶ ̶atkwe̶ ̶immiːtis‿akilliː" +]; +test_fail_3 = AssertEqual[ + "eurũː ad seː zepurũːkwe wokat dehiŋk taːlia faːtur" @ elision @ h_deletion @ synizesis, + "e͡urũ̶ː̶ ̶ad seː zepurũːkwe wokat de͡iŋk taːlia faːtur" +]; +test_fail_4 = AssertEqual[ + "illiː seː prajdaj akkiŋgunt dapibuskwe futuːriːs" @ elision, + "illiː seː prajda̶j̶ ̶akkiŋgunt dapibuskwe futuːriːs" +]; +test_fail_5 = AssertEqual[ + "terga suũː piŋgwiːs kentũː kũː maːtribus aŋnoːs" @ resyllabification, + "terga suũː piŋgwiːs kentũː kũː maːtribus‿aŋnoːs" +]; +test_fail_6 = AssertEqual[ + "kũː subitoː ajneːaːs koŋkursuː akkeːdere maŋnoː" @ elision, + "kũː subito̶ː̶ ̶ajneːaːs koŋkursu̶ː̶ ̶akkeːdere maŋnoː" +]; +test_fail_7 = AssertEqual[ + "doːna kareːre doliːs danawm siːk noːtus ulikseːs" @ diaeresis @ resyllabification, + "doːna kareːre doliːs danaüm siːk noːtus‿ulikseːs" +]; +test_fail_8 = AssertEqual[ + "wellitur hujk aːtroː liːkuntur saŋgwine guttaj" @ h_deletion @ resyllabification, + "wellitur‿h̶ujk aːtroː liːkuntur saŋgwine guttaj" +]; +test_fail_9 = AssertEqual[ + "koːnuːbiiːs arwiːskwe nowiːs operaːta juwentuːs" @ synizesis, + "koːnuːbi͡iːs arwiːskwe nowiːs operaːta juwentuːs" +]; +test_fail_10 = AssertEqual[ + "aːreːbant herbaj et wiːktũː seges ajgra negaːbat" @ elision @ resyllabification, + "aːreːbant herba̶j̶ ̶et wiːktũː seges‿ajgra negaːbat" +]; +test_fail_11 = AssertEqual[ + "kuikwe lokiː leːgeːs dedimus koːnuːbia nostra" @ synizesis @ resyllabification, + "ku͡ikwe lokiː leːgeːs dedimus‿koːnuːbia nostra" +]; From f08dd3e321755f2dc3f757b542ad0349009b9c60 Mon Sep 17 00:00:00 2001 From: Jillian Chang Date: Tue, 14 Sep 2021 18:57:42 -0400 Subject: [PATCH 4/5] Fixed synizesis markup and reordered variable composition --- grammars/meter.grm | 26 +++++---- grammars/variable.grm | 130 ++++++------------------------------------ 2 files changed, 34 insertions(+), 122 deletions(-) diff --git a/grammars/meter.grm b/grammars/meter.grm index ea59458..236d4e2 100644 --- a/grammars/meter.grm +++ b/grammars/meter.grm @@ -18,8 +18,10 @@ delete_strikethrough_undertie = Optimize[u.Rewrite[u.Delete[i.STRIKETHROUGH | " # Removes the ligature tie and rewrites "i" or "u" to "j" or "w," respectively. synizesis_cleanup = Optimize[ - CDRewrite[(("i" | "iː") : "j") | (("u" | "uː") : "w"), "͡", "", sigma_star] @ - CDRewrite[(("i" | "iː") : "j") | (("u" | "uː") : "w"), "", "͡", sigma_star] @ + CDRewrite[(("i" | "iː") : "j") | + (("u" | "uː") : "w"), i.PHONEMIC_VOWEL "͡", "", sigma_star] @ + CDRewrite[(("i" | "iː") : "j") | + (("u" | "uː") : "w"), "", "͡" i.PHONEMIC_VOWEL, sigma_star] @ u.Rewrite[u.Delete["͡"], sigma_star] ]; @@ -255,15 +257,19 @@ test_markup_5 = AssertEqual[ "wellitur‿h̶ujk aːtroː liːkuntur saŋgwine guttaj" @ METER, "DSSSDS" ]; -# test_markup_6 = AssertEqual[ -# "koːnuːbi͡iːs arwiːskwe nowiːs operaːta juwentuːs" @ METER, -# "SSDDDS" -#]; + test_markup_6 = AssertEqual[ + "koːnuːbi͡iːs arwiːskwe nowiːs operaːta juwentuːs" @ METER, + "SSDDDS" +]; test_markup_7 = AssertEqual[ "aːreːbant herba̶j̶ ̶et wiːktũː seges‿ajgra negaːbat" @ METER, "SSSDDS" ]; -#test_markup_8 = AssertEqual[ -# "ku͡ikwe lokiː leːgeːs dedimus‿koːnuːbia nostra" @ METER, -# "DSDSDT" -#]; +test_markup_8 = AssertEqual[ + "ku͡ikwe lokiː leːgeːs dedimus koːnuːbia nostra" @ METER, + "DSDSDT" +]; +test_markup_9 = AssertEqual[ + "awt pelagoː danaü̶m̶ ̶iːnsidiaːs suspektakwe doːna" @ METER, + "DDDSDT" +]; diff --git a/grammars/variable.grm b/grammars/variable.grm index 8efc49a..abba788 100644 --- a/grammars/variable.grm +++ b/grammars/variable.grm @@ -10,9 +10,9 @@ sigma_star = (i.PROSODIC_SYMBOL | i.PHONEME | i.MARKUPS)*; h_deletion = Optimize[ # Delete medial "h" to permit additional variable rules, if needed (such as synizesis). CDRewrite[u.Delete["h"] <1>, - i.PHONEME - b.kSpace, i.PHONEME - b.kSpace, sigma_star] @ + i.PHONEME - b.kSpace, i.PHONEME - b.kSpace, sigma_star, 'ltr', 'opt'] @ CDRewrite[("h" : "h̶") <1>, - "", "", sigma_star] + "", "", sigma_star, 'ltr', 'opt'] ]; # A final syllable ending in a vowel, letter m, or diphthong is removed @@ -35,33 +35,33 @@ elision = Optimize[CDRewrite[(("a " : "a̶ ̶") | ("üm " : "ü̶m̶ ̶") | ("oj " : "o̶j̶ ̶") | ("aj " : "a̶j̶ ̶") | - ("aw " : "a̶w̶ ̶")) - , "", "h̶"? i.PHONEMIC_VOWEL, sigma_star]]; + ("aw " : "a̶w̶ ̶")) <100> + , "", "h̶"? i.PHONEMIC_VOWEL, sigma_star, 'ltr', 'opt']]; # Word-final consonant reattaches to the following word with an initial vowel. resyllabification = Optimize[ - CDRewrite[(" " : "‿"), - i.CONSONANT, "h̶"? i.PHONEMIC_VOWEL, sigma_star] + CDRewrite[(" " : "‿") <10>, + i.CONSONANT, "h̶"? i.PHONEMIC_VOWEL, sigma_star, 'ltr', 'opt'] ]; # High vowels may strengthen to their corresponding glides when adjacent to # another vowel. synizesis = Optimize[ - CDRewrite[u.Insert["͡"], - ("i" | "iː" | "u" | "uː") , i.PHONEMIC_VOWEL, sigma_star] @ - CDRewrite[u.Insert["͡"], - i.PHONEMIC_VOWEL, ("i" | "iː" | "u" | "uː"), sigma_star] + CDRewrite[u.Insert["͡"] <1000>, + ("i" | "iː" | "u" | "uː") , i.PHONEMIC_VOWEL, sigma_star, 'ltr', 'opt'] @ + CDRewrite[u.Insert["͡"] <1000>, + i.PHONEMIC_VOWEL, ("i" | "iː" | "u" | "uː"), sigma_star, 'ltr', 'opt'] ]; # Glides may lenite to their corresponding vowels. diaeresis = Optimize[ - CDRewrite[("w" : "ü"), - "k" | "g", "", sigma_star] @ + CDRewrite[("w" : "ü") <1000>, + "k" | "g", "", sigma_star, 'ltr', 'opt'] @ # "aw" diphthongs preceding final m may lenite. - CDRewrite[("w" : "ü"), - "", "m", sigma_star] @ - CDRewrite[("jj" : "ï"), - i.PHONEMIC_VOWEL, i.PHONEMIC_VOWEL, sigma_star] + CDRewrite[("w" : "ü") <1000>, + "", "m", sigma_star, 'ltr', 'opt'] @ + CDRewrite[("jj" : "ï") <1000>, + i.PHONEMIC_VOWEL, i.PHONEMIC_VOWEL, sigma_star, 'ltr', 'opt'] ]; # Lengthening of a usually short syllable. @@ -72,99 +72,5 @@ diastole = Optimize[ "", "", sigma_star] ]; -export VARIABLE = Optimize[h_deletion @ resyllabification @ elision @ - synizesis @ diaeresis]; - -# Tests elision markup -test_elision = AssertEqual[ - "tantajne animiːs" @ elision, - "tantajne̶ ̶animiːs" -]; - -# Tests h deletion + elision markup. -test_elision_2 = AssertEqual[ - "atkwe hominũː" @ h_deletion @ elision, - "atkwe̶ ̶h̶ominũː" -]; - -# Tests resyllabification markup. -test_resyllabification = AssertEqual[ - "ab oris" @ resyllabification, - "ab‿oris" -]; - -# Tests h deletion + resyllabification markup. -test_h_deletion = AssertEqual[ - "fuit hok" @ h_deletion @ resyllabification, - "fuit‿h̶ok" -]; - -# Tests synizesis of "u." -test_synizesis = AssertEqual[ - "suaːsit" @ synizesis, - "su͡aːsit" -]; - -# Tests synizesis of "j." -test_synizesis_2 = AssertEqual[ - "laːwiːniakwe" @ synizesis, - "laːwiːni͡akwe" -]; - -# Tests synizesis of "j." -test_synizesis_3 = AssertEqual[ - "awreiːs" @ synizesis, - "awre͡iːs" -]; - -# Tests diaeresis of intervocalic "j." -test_diaeresis_1 = AssertEqual[ - "troːjja" @ diaeresis, - "troːïa" -]; - -## Tests for scansion failures. -test_fail_1 = AssertEqual[ - "nekdũː etiãː kawsaj iːraːrũː sajwiːkwe doloːreːs" @ elision, - "nekdũ̶ː̶ ̶etiãː kawsa̶j̶ ̶iːraːrũː sajwiːkwe doloːreːs" -]; -test_fail_2 = AssertEqual[ - "troːas rellikwiaːs danawm atkwe immiːtis akilliː" @ diaeresis @ elision @ resyllabification, - "troːas rellikwiaːs danaü̶m̶ ̶atkwe̶ ̶immiːtis‿akilliː" -]; -test_fail_3 = AssertEqual[ - "eurũː ad seː zepurũːkwe wokat dehiŋk taːlia faːtur" @ elision @ h_deletion @ synizesis, - "e͡urũ̶ː̶ ̶ad seː zepurũːkwe wokat de͡iŋk taːlia faːtur" -]; -test_fail_4 = AssertEqual[ - "illiː seː prajdaj akkiŋgunt dapibuskwe futuːriːs" @ elision, - "illiː seː prajda̶j̶ ̶akkiŋgunt dapibuskwe futuːriːs" -]; -test_fail_5 = AssertEqual[ - "terga suũː piŋgwiːs kentũː kũː maːtribus aŋnoːs" @ resyllabification, - "terga suũː piŋgwiːs kentũː kũː maːtribus‿aŋnoːs" -]; -test_fail_6 = AssertEqual[ - "kũː subitoː ajneːaːs koŋkursuː akkeːdere maŋnoː" @ elision, - "kũː subito̶ː̶ ̶ajneːaːs koŋkursu̶ː̶ ̶akkeːdere maŋnoː" -]; -test_fail_7 = AssertEqual[ - "doːna kareːre doliːs danawm siːk noːtus ulikseːs" @ diaeresis @ resyllabification, - "doːna kareːre doliːs danaüm siːk noːtus‿ulikseːs" -]; -test_fail_8 = AssertEqual[ - "wellitur hujk aːtroː liːkuntur saŋgwine guttaj" @ h_deletion @ resyllabification, - "wellitur‿h̶ujk aːtroː liːkuntur saŋgwine guttaj" -]; -test_fail_9 = AssertEqual[ - "koːnuːbiiːs arwiːskwe nowiːs operaːta juwentuːs" @ synizesis, - "koːnuːbi͡iːs arwiːskwe nowiːs operaːta juwentuːs" -]; -test_fail_10 = AssertEqual[ - "aːreːbant herbaj et wiːktũː seges ajgra negaːbat" @ elision @ resyllabification, - "aːreːbant herba̶j̶ ̶et wiːktũː seges‿ajgra negaːbat" -]; -test_fail_11 = AssertEqual[ - "kuikwe lokiː leːgeːs dedimus koːnuːbia nostra" @ synizesis @ resyllabification, - "ku͡ikwe lokiː leːgeːs dedimus‿koːnuːbia nostra" -]; +export VARIABLE = Optimize[h_deletion @ resyllabification @ + synizesis @ diaeresis @ elision]; From d055bf54ee180dfcc5216c0c968ebe2b401fb8ec Mon Sep 17 00:00:00 2001 From: Jillian Chang Date: Tue, 14 Sep 2021 23:04:14 -0400 Subject: [PATCH 5/5] changed ordering for synizesis cleanups, since ii synizesis seems to all be ji --- grammars/meter.grm | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/grammars/meter.grm b/grammars/meter.grm index 236d4e2..9ce148a 100644 --- a/grammars/meter.grm +++ b/grammars/meter.grm @@ -18,10 +18,10 @@ delete_strikethrough_undertie = Optimize[u.Rewrite[u.Delete[i.STRIKETHROUGH | " # Removes the ligature tie and rewrites "i" or "u" to "j" or "w," respectively. synizesis_cleanup = Optimize[ - CDRewrite[(("i" | "iː") : "j") | - (("u" | "uː") : "w"), i.PHONEMIC_VOWEL "͡", "", sigma_star] @ CDRewrite[(("i" | "iː") : "j") | (("u" | "uː") : "w"), "", "͡" i.PHONEMIC_VOWEL, sigma_star] @ + CDRewrite[(("i" | "iː") : "j") | + (("u" | "uː") : "w"), i.PHONEMIC_VOWEL "͡", "", sigma_star] @ u.Rewrite[u.Delete["͡"], sigma_star] ]; @@ -273,3 +273,7 @@ test_markup_9 = AssertEqual[ "awt pelagoː danaü̶m̶ ̶iːnsidiaːs suspektakwe doːna" @ METER, "DDDSDT" ]; +test_markup_10 = AssertEqual[ + "floːribus‿iːnsiːdunt wariː͡is et kandida kirkũː" @ METER, + "DSSSDS" +];