// camxes.js.peg // Copyright (c) 2013, 2014 Masato Hagiwara // https://github.com/mhagiwara/camxes.js // //////// _la guskant cu co'a galfi_20150604 // // camxes.js can be used, modified, and re-distributed under MIT license. // See LICENSE for the details. // This is a Parsing Expression Grammar for Lojban. // See http://bford.info/packrat/ // // All rules have the form: // // name = peg_expression // // which means that the grammatical construct "name" is parsed using // "peg_expression". // // 1) Names in lower case are grammatical constructs. // 2) Names in UPPER CASE are selma'o (lexeme) names, and are terminals. // 3) Concatenation is expressed by juxtaposition with no operator symbol. // 4) / represents *ORDERED* alternation (choice). If the first // option succeeds, the others will never be checked. // 5) ? indicates that the element to the left is optional. // 6) * represents optional repetition of the construct to the left. // 7) + represents one_or_more repetition of the construct to the left. // 8) () serves to indicate the grouping of the other operators. // // Longest match wins. // How to compile using Node.js: (Added by Masato Hagiwara) // // load peg.js and the file system module // > var PEG = require("pegjs") // > var fs = require("fs") // // read peg and build a parser // > var camxes_peg = fs.readFileSync("/path/to/camxes.js.peg").toString(); // > var camxes = PEG.buildParser(camxes_peg, {cache: true}); // // test it // > camxes.parse("ko'a broda"); // [ 'text', // [ 'text_1', // [ 'paragraphs', [Object] ] ] ] // // write to a file // > fs.writeFileSync("/path/to/camxes.js", camxes.toSource()); // ___ GRAMMAR ___ { var _g_zoi_delim; function _join(arg) { if (typeof(arg) == "string") return arg; else { var ret = ""; for (var v in arg) { ret += _join(arg[v]); } return ret; } } function _node(label, arg) { var ret = []; if (label != undefined) ret.push( label ); if (typeof( arg ) == "object" && typeof( arg[0] ) == "string" && arg[0] != "") { ret.push( arg ); return ret; } return _node_int(label, arg); } function _node_int(label, arg) { if (typeof( arg ) == "string") return arg; var ret = []; if (label != undefined) ret.push( label ); for (var v in arg) { if (arg[v].length != 0) ret.push( _node_int( undefined, arg[v] ) ); } return ret; } function _node2(label, arg1, arg2) { return [label].concat(_node(arg1)).concat(_node(arg2)); } function _node_nonempty(label, arg) { var _n = _node(label, arg); return (_n.length == 1 && _n[0] == label) ? [] : _n; } // === ZOI functions === // function _zoi_assign_delim(word) { var a = word.toString().split(","); if (a.length > 0) _g_zoi_delim = a[a.length - 1]; else _g_zoi_delim = ""; return word; } function _zoi_check_quote(word) { if (typeof(word) == "object") word = word.toString(); if (!is_string(word)) { alert("ZOI word is not a string"); return false; } else { return (word.toLowerCase().replace(/,/gm,"").replace(/h/g, "'") === _g_zoi_delim); } } function _zoi_check_delim(word) { if (typeof(word) == "object") word = word.toString(); if (!is_string(word)) { alert("ZOI word is not a string"); return false; } else { word = word.split(","); if (word.length > 0) word = word[word.length - 1]; else word = ""; return (word === _g_zoi_delim); } } function is_string(v) { return typeof v.valueOf() === 'string'; } } // text //////// _maltufa: lo cmevla co'u selbrisle : xruti tu'a zoizoi (CMEVLA_clause+ / indicators?) free* zoi_20150810UTC text = expr:(intro_null NAI_clause* (CMEVLA_clause+ / indicators?) free* paragraphs? si_clause? SI_clause* faho_clause EOF?) {return _node_nonempty("text", expr);} intro_null = expr:(spaces? su_clause* (!paragraphs si_clause SI_clause*)?) {return _node_nonempty("intro_null", expr); } faho_clause = expr:((FAhO_clause dot_star)?) {return _node("faho_clause", expr);} // Please note that the "text_1" item in the text_1 production does // *not* match the BNF. This is due to a bug in the BNF. The change // here was made to match grammar.300 paragraphs = expr:((NIhO_clause+ free* paragraphs_1?)+ / paragraphs_1 (NIhO_clause+ free* paragraphs_1?)*) {return _node("paragraphs", expr);} paragraphs_1 = expr:(paragraphs_2 (NIhO_clause+ free* joik paragraphs_2)*) {return _node("paragraphs_1", expr);} paragraphs_2 = expr:(paragraph (NIhO_clause+ free* joik? tag? BO_clause free* paragraph)*) {return _node("paragraphs_2", expr);} paragraph = expr:((I_clause free* (statement_terms / fragment)?)+ / (statement_terms / fragment) (I_clause free* (statement_terms / fragment)?)*) {return _node("paragraph", expr);} statement_terms = expr:(statement IAU_elidible free* terms? free*) {return _node("statement_terms", expr);} statement = expr:(statement_1 / prenex statement) {return _node("statement", expr);} statement_1 = expr:(statement_2 (I_clause free* joik free* statement_2)*) {return _node("statement_1", expr);} statement_2 = expr:(statement_3 (I_clause joik? stag? BO_clause free* statement_3)*) {return _node("statement_2", expr);} // statement_3 //////// _maltufa: jmina zoizoi !prenex fragment zoi tezu'e lo nu la fragment la sentens cu jorne la'o zoi i joik zoi_20151019UTC statement_3 = expr:(sentence / tag? TUhE_clause free* paragraphs TUhU_elidible free* / gek_statement / !prenex fragment) {return _node("statement_3", expr);} // gek_statement //////// _maltufa: vimcu zoizoi + zoi la gik_20150723UTC // gek_statement //////// _maltufa: vimcu zoizoi GIhI_elidible zoi ki'u lo nu na'e sarcu_20150803UTC gek_statement = expr:(gek statement (gik statement)) {return _node("gek_statement", expr);} // ([by BOI] VAU) // ([by BOI] [joi {pa BOI}]) // ([{by BOI} {joi }] VAU) // ([{vei <(¹by BOI¹) (¹joi [pa BOI]¹)> VEhO} {by BOI}] VAU) // (vei [{by BOI} {joi } {joi }] VEhO) // ([{ } da] VAU) fragment = expr:(prenex / !terms joik free* / ek free* / gihek free* / NA_clause !terms !KU free* / terms VAU_elidible free* !mex / mex / relative_clauses / links / linkargs) {return _node("fragment", expr);} prenex = expr:(terms ZOhU_clause free*) {return _node("prenex", expr);} sentence = expr:(terms? (CU_elidible free* bridi_tail / gek sentence gik sentence)) {return _node("sentence", expr);} // subsentence //////// _maltufa: xruti la'o zoi subsentence zoi_20150723UTC subsentence = expr:(sentence / prenex subsentence) {return _node("subsentence", expr);} bridi_tail = expr:(bridi_tail_1 (joik_gihek stag? CU_elidible free* bridi_tail_1)*) {return _node("bridi_tail", expr);} bridi_tail_1 = expr:(bridi_tail_2 (joik_gihek !(stag? BO_clause) !(stag? KE_clause) CU_elidible free* bridi_tail_2 tail_terms)*) {return _node("bridi_tail_1", expr);} bridi_tail_2 = expr:(bridi_tail_3 (joik_gihek stag? BO_clause CU_elidible free* bridi_tail_3 tail_terms)*) {return _node("bridi_tail_2", expr);} bridi_tail_3 = expr:(KE_clause free* !(selbri_2 KEhE) bridi_tail KEhE_elidible free* tail_terms / selbri tail_terms / gek_bridi_tail) {return _node("bridi_tail_3", expr);} // gek_bridi_tail //////// _maltufa: vimcu zoizoi + zoi la gik_20150723UTC // gek_bridi_tail //////// _maltufa: vimcu zoizoi GIhI_elidible zoi ki'u lo nu na'e sarcu_20150803UTC gek_bridi_tail = expr:(gek bridi_tail (gik bridi_tail) tail_terms / tag* KE_clause free* gek_bridi_tail KEhE_elidible free* / NA_clause free* gek_bridi_tail) {return _node("gek_bridi_tail", expr);} //// EXP-FIX: tag? KE --> tag* KE //// EXP: Bridi-tail nonabsorbable terms implementation // tail_terms //////// _maltufa: galfi zoizoi term* zoi zoizoi nonabs_terms? zoi pe ma'oi PEhE e ma'oi CEhE_20151019UTC tail_terms = expr:(nonabs_terms? VAU_elidible free*) {return _node_nonempty("tail_terms", expr); } // terms //////// _maltufa: xruti la'o zoi terms_1 zoi pe ma'oi PEhE_20151019UTC terms = expr:(terms_1+) {return _node("terms", expr);} /*** EXP-SELBRITCITA-FIX ***/ // //////// _maltufa: xruti la'o zoi terms_1 zoi pe ma'oi PEhE_20151019UTC terms_1 = expr:(terms_2 (PEhE_clause free* joik terms_2)*) {return _node("terms_1", expr);} // //////// _maltufa: xruti la'o zoi terms_2 zoi pe ma'oi CEhE_20151019UTC terms_2 = expr:(term_2 (CEhE_clause free* term_2)*) {return _node("terms_2", expr);} // //////// _maltufa: xruti la'o zoi nonabs_terms zoi pe ma'oi PEhE e ma'oi CEhE_20151019UTC nonabs_terms = expr:(nonabs_terms_1+) {return _node("nonabs_terms", expr);} // //////// _maltufa: xruti la'o zoi nonabs_terms_1 zoi pe ma'oi PEhE e ma'oi CEhE_20151019UTC nonabs_terms_1 = expr:(nonabs_terms_2 (PEhE_clause free* joik nonabs_terms_2)*) {return _node("nonabs_terms_1", expr);} // //////// _maltufa: xruti la'o zoi nonabs_terms_2 zoi pe ma'oi PEhE e ma'oi CEhE_20151019UTC nonabs_terms_2 = expr:(term (CEhE_clause free* term)*) {return _node("nonabs_terms_2", expr);} term = expr:(term_1 (joik_ek term_1)*) {return _node("term", expr);} term_1 = expr:(term_2 (joik_ek? BO_clause free* term_2)*) {return _node("term_1", expr);} // term_2 //////// _maltufa: xruti la'o zoi subsentence zoi (XOI)_20150723UTC // term_2 //////// _maltufa: xruti la'o zoi termset zoi_20151019UTC // term_2 //////// _maltufa: xruti la'o zoi nonabs_termset zoi_20151019UTC // term_2 //////// _vimcu lo cfila i va'i jmina zoizoi !joik_gihek zoi ja'e lo nu stura fa lo'u ([CU { VAU} {na gi'a} CU {brode VAU} VAU] IAU) le'u_20160404UTC_ term_2 = expr:(XOI_clause free* subsentence SEhU_elidible free* / KE_clause free* term+ KEhE_elidible free* / termset / tag_term / !tag sumti / NA_clause free* !bridi_tail !joik_gihek KU_elidible free* / gek_term / nonabs_termset) {return _node("term_2", expr);} tag_term = expr:(!gek (tag !(!tag selbri) !gek_bridi_tail / FA_clause free* (joik FA_clause free*)* !tanru_unit_1) (sumti / KU_elidible free*)) {return _node("tag_term", expr);} /*** END EXP-SELBRITCITA-FIX ***/ // //////// _maltufa: xruti la'o zoi termset zoi_20151019UTC termset = expr:(gek terms_gik_terms / gek_term) {return _node("termset", expr);} // //////// _maltufa: xruti la'o zoi terms_gik_terms zoi_20151019UTC terms_gik_terms = expr:(term_2 (gik / terms_gik_terms) term_2) {return _node("terms_gik_terms", expr);} // //////// _maltufa: xruti la'o zoi nonabs_termset zoi_20151019UTC nonabs_termset = expr:(nonabs_gek_termset / NUhI_clause free* gek terms NUhU_elidible free* gik nonabs_terms NUhU_elidible free* / NUhI_clause free* nonabs_terms NUhU_elidible free*) {return _node("nonabs_termset", expr);} // //////// _maltufa: xruti la'o zoi nonabs_gek_termset zoi_20151019UTC nonabs_gek_termset = expr:(gek nonabs_terms_gik_terms) {return _node("nonabs_gek_termset", expr);} // //////// _maltufa: xruti la'o zoi nonabs_terms_gik_terms zoi_20151019UTC nonabs_terms_gik_terms = expr:(term (gik / nonabs_terms_gik_terms) term) {return _node("nonabs_terms_gik_terms", expr);} // gek_term //////// _maltufa: vimcu zoizoi + zoi la gik_20150723UTC // gek_term //////// _maltufa: vimcu zoizoi GIhI_elidible zoi ki'u lo nu na'e sarcu_20150803UTC // gek_term //////// _maltufa: zo NUhI je zo NUhU di'a selma'o i jmina zoizoi / NUhI_clause free* gek term+ NUhU_elidible free* gik term+ NUhU_elidible free* / NUhI_clause free* term+ NUhU_elidible free* zoi_20150904UTC gek_term = expr:(gek term+ (gik term+) / NUhI_clause free* gek term+ NUhU_elidible free* gik term+ NUhU_elidible free* / NUhI_clause free* term+ NUhU_elidible free*) {return _node("gek_term", expr);} /*** EXP-SELBRITCITA-FIX ***/ /*** END EXP-SELBRITCITA-FIX ***/ sumti = expr:(sumti_1 (VUhO_clause free* relative_clauses)?) {return _node("sumti", expr);} sumti_1 = expr:(sumti_2 (joik_ek sumti_2)*) {return _node("sumti_1", expr);} sumti_2 = expr:(sumti_3 (joik_ek? stag? BO_clause free* sumti_3)*) {return _node("sumti_2", expr);} // sumti_3 //////// _maltufa: vimcu zoizoi + zoi la gik_20150723UTC // sumti_3 //////// _maltufa: vimcu zoizoi GIhI_elidible zoi ki'u lo nu na'e sarcu_20150803UTC sumti_3 = expr:(KE_clause free* sumti KEhE_elidible free* / sumti_4 / gek sumti (gik sumti)) {return _node("sumti_3", expr);} sumti_4 = expr:(quantifier? sumti_5 relative_clauses? / quantifier selbri KU_elidible free* relative_clauses?) {return _node("sumti_4", expr);} // sumti_5 //////// _maltufa: xruti la'o zoi subsentence zoi (LOhOI)_20150723UTC // sumti_5 //////// _maltufa: lo cmevla co'u selbrisle : xruti tu'a zoizoi / LA_clause free* relative_clauses? CMEVLA_clause+ free* / (LA_clause / LE_clause) free* sumti_tail KU_elidible free* zoi_20150810UTC sumti_5 = expr:(RAhOI_clause free* / ZO_clause free* / ZOI_clause free* / LOhU_clause free* / lerfu_string BOI_elidible free* !(BO_clause* free* operand* !(joik_ek (sumti / relative_clause)) operator) !(operand KEhE) / LU_clause text LIhU_elidible free* / (LAhE_clause free* / NAhE_clause BO_clause free*) relative_clauses? sumti LUhU_elidible free* / KOhA_clause free* / LOhOI_clause NAI_clause? free* (joik LOhOI_clause NAI_clause? free*)* subsentence KUhAU_elidible free* / LA_clause free* relative_clauses? CMEVLA_clause+ free* / (LA_clause / LE_clause) free* sumti_tail KU_elidible free* / li_clause / NAhE_clause free* sumti_3 free*) {return _node("sumti_5", expr);} li_clause = expr:(LI_clause free* mex LOhO_elidible free*) {return _node("li_clause", expr); } sumti_tail = expr:(relative_clauses? (!quantifier sumti)? sumti_tail_1) {return _node("sumti_tail", expr); } sumti_tail_1 = expr:(quantifier? selbri / quantifier sumti) {return _node("sumti_tail_1", expr);} relative_clauses = expr:(relative_clause (joik? free* relative_clause)*) {return _node("relative_clauses", expr); } // relative_clause //////// _maltufa: xruti la'o zoi subsentence zoi_20150723UTC relative_clause = expr:(GOI_clause free* term GEhU_elidible free* / NOI_clause free* subsentence KUhO_elidible free*) {return _node("relative_clause", expr); } selbri = expr:(selbri_1 / tag selbri / NA_clause free* selbri) {return _node("selbri", expr); } selbri_1 = expr:(selbri_2 relative_clauses? (CEI_clause free* selbri)*) {return _node("selbri_1", expr); } selbri_2 = expr:(selbri_3 (CO_clause free* selbri_3)*) {return _node("selbri_2", expr); } selbri_3 = expr:(selbri_4+) {return _node("selbri_3", expr); } selbri_4 = expr:(selbri_5 (joik selbri_5)*) {return _node("selbri_4", expr); } selbri_5 = expr:(selbri_6 (joik stag? BO_clause free* selbri_6)*) {return _node("selbri_5", expr); } selbri_6 = expr:(tanru_unit (BO_clause free* tanru_unit)*) {return _node("selbri_6", expr); } tanru_unit = expr:(tanru_unit_1 linkargs?) {return _node("tanru_unit", expr); } // tanru_unit_2 //////// _maltufa: vimcu zoizoi + zoi la gik_20150723UTC // tanru_unit_2 //////// _maltufa: xruti la'o zoi subsentence zoi_20150723UTC // tanru_unit_2 //////// _maltufa: vimcu zoizoi GIhI_elidible zoi ki'u lo nu na'e sarcu_20150803UTC // tanru_unit_2 //////// _maltufa: lo cmevla co'u selbrisle : vimcu zoizoi CMEVLA_clause free* / zoi_20150810UTC // tanru_unit_1 //////// _maltufa: va'o lo nu claxu ma'oi GIhI lu ge selbri gi selbri vau li'u se genturfa'i ja'e ei tu'a lu ge bridi_tail gi bridi_tail li'u i jmina zoizoi !VAU zoi zoizoi NAhE_clause? free* gek selbri_2 (gik selbri_2) !term zoi_20151119UTC tanru_unit_1 = expr:(BRIVLA_clause free* / GOhA_clause RAhO_clause? free* / KE_clause free* selbri_2 KEhE_elidible free* / NAhE_clause? free* gek selbri_2 (gik selbri_2) !term !VAU / MUhOI_clause free* / GOhOI_clause free* / LUhEI_clause free* text LIhAU_elidible free* / ME_clause free* (sumti / operator+ / mex / tag) MEhU_elidible free* MOI_clause? free* / mex MOI_clause free* / (FA_clause free* (joik FA_clause free*)* / SE_clause free*) tanru_unit_1 / JAI_clause free* tag? tanru_unit_1 / NAhE_clause free* tanru_unit_1 / NU_clause NAI_clause? free* (joik NU_clause NAI_clause? free*)* subsentence KEI_elidible free*) {return _node("tanru_unit_1", expr); } linkargs = expr:(BE_clause free* term links? BEhO_elidible free*) {return _node("linkargs", expr);} links = expr:(BEI_clause free* term links?) {return _node("links", expr);} quantifier = expr:(!sumti_5 !selbri mex relative_clauses?) {return _node("quantifier", expr); } mex = expr:(mex_1 (operator+ mex_1?)*) {return _node("mex", expr); } mex_1 = expr:((KE_clause free* mex_2+ KEhE_elidible free* / mex_2 (BO_clause free* mex_2)*) (BIhE_clause free* operator+ (KE_clause free* mex_2+ KEhE_elidible free* / mex_2 (BO_clause free* mex_2)*)?)*) {return _node("mex_1", expr); } mex_2 = expr:(operand / mex_rp / mex_forethought) {return _node("mex_2", expr); } mex_rp = FUhA_clause free* mex_2+ operator (mex_2* operator)* KUhE_elidible free* // This is just to make for clearer parse trees mex_forethought = !(lerfu_string BOI_elidible free*) operator mex_2+ mex_forethought? KUhE_elidible free* / PEhO_clause free* operator mex_2+ mex_forethought? KUhE_elidible free* // Right recursive version. // operator //////// _maltufa: na'e vimcu ma'oi NAhU iku'i jalge fa lo simsa be tu'a la zantufa: (MAhO_clause / NAhU_clause) free* (mex / selbri / sumti) TEhU_elidible free*_20150728UTC operator = expr:(SE_clause free* operator / NAhE_clause free* operator / (MAhO_clause / NAhU_clause) free* (mex / selbri / sumti) TEhU_elidible free* / VUhU_clause free* / joik_ek) {return _node("operator", expr); } // operand //////// _maltufa: na'e vimcu ma'oi NIhE iku'i jalge fa lo simsa be tu'a la zantufa: (NIhE_clause / MOhE_clause) free* (selbri / sumti) TEhU_elidible free*_20150728UTC operand = expr:(number BOI_elidible free* / lerfu_string BOI_elidible free* / VEI_clause free* mex VEhO_elidible free* / (NIhE_clause / MOhE_clause) free* (selbri / sumti) TEhU_elidible free* / (LAhE_clause free* / NAhE_clause BO_clause free*) mex LUhU_elidible free* / NAhE_clause free* operand free*) {return _node("operand", expr); } number = expr:(PA_clause+) {return _node("number", expr); } lerfu_string = expr:(lerfu_word+) {return _node("lerfu_string", expr); } // ** BU clauses are part of BY_clause lerfu_word = expr:(BY_clause / LAU_clause lerfu_word / TEI_clause lerfu_string FOI_clause) {return _node("lerfu_word", expr); } ek = expr:(NA_clause? SE_clause? A_clause NAI_clause?) {return _node("ek", expr); } gihek = expr:(NA_clause? SE_clause? GIhA_clause NAI_clause?) {return _node("gihek", expr); } joik = expr:(NA_clause? SE_clause? JOI_clause NAI_clause? / interval / GAhO_clause interval GAhO_clause) {return _node("joik", expr); } interval = expr:(SE_clause? BIhI_clause NAI_clause?) {return _node("interval", expr); } joik_ek = expr:(joik free* / ek free*) {return _node("joik_ek", expr); } joik_gihek = expr:(joik free* / gihek free*) {return _node("joik_gihek", expr); } gek = expr:(SE_clause? GA_clause NAI_clause? free* / GI_clause (joik / stag) (BO_clause)? free* / (joik / stag) GI_clause (BO_clause)? free*) {return _node("gek", expr); } gik = expr:(GI_clause NAI_clause? free*) {return _node("gik", expr); } tag = expr:(tense_modal (joik tense_modal)*) {return _node("tag", expr); } stag = expr:(simple_tense_modal (joik simple_tense_modal)* / tense_modal (joik tense_modal)*) {return _node("stag", expr); } tense_modal = expr:(simple_tense_modal free* / FIhO_clause free* selbri FEhU_elidible free*) {return _node("tense_modal", expr); } simple_tense_modal = expr:(NAhE_clause? SE_clause? BAI_clause NAI_clause? KI_clause? / NAhE_clause? ( ((time space? / space time?) CAhA_clause) / (time space? / space time?) / CAhA_clause ) KI_clause? / KI_clause / CUhE_clause) {return _node("simple_tense_modal", expr); } time = expr:(ZI_clause time_offset* (ZEhA_clause (PU_clause NAI_clause?)?)? interval_property* / ZI_clause? time_offset+ (ZEhA_clause (PU_clause NAI_clause?)?)? interval_property* / ZI_clause? time_offset* ZEhA_clause (PU_clause NAI_clause?)? interval_property* / ZI_clause? time_offset* (ZEhA_clause (PU_clause NAI_clause?)?)? interval_property+) {return _node("time", expr); } time_offset = expr:(PU_clause NAI_clause? ZI_clause?) {return _node("time_offset", expr); } space = expr:(VA_clause space_offset* space_interval? (MOhI_clause space_offset)? / VA_clause? space_offset+ space_interval? (MOhI_clause space_offset)? / VA_clause? space_offset* space_interval (MOhI_clause space_offset)? / VA_clause? space_offset* space_interval? MOhI_clause space_offset) {return _node("space", expr); } space_offset = expr:(FAhA_clause NAI_clause? VA_clause?) {return _node("space_offset", expr); } space_interval = expr:((VEhA_clause VIhA_clause? / VIhA_clause) (FAhA_clause NAI_clause?)? space_int_props? / space_int_props) {return _node("space_interval", expr); } space_int_props = expr:((FEhE_clause interval_property)+) {return _node("space_int_props", expr); } interval_property = expr:(mex ROI_clause NAI_clause? / TAhE_clause NAI_clause? / ZAhO_clause NAI_clause?) {return _node("interval_property", expr); } // free //////// _maltufa: xruti tu'a la'o zoi SEI zoi_20150723UTC // free //////// _maltufa: jmina zoizoi SOI_clause free* subsentence SEhU_elidible / zoi_20150723UTC // free //////// _maltufa: lo cmevla co'u selbrisle : xruti tu'a zoizoi / vocative relative_clauses? CMEVLA_clause+ free* relative_clauses? DOhU_elidible zoi_20150810UTC free = expr:(SOI_clause free* subsentence SEhU_elidible / SEI_clause free* terms? CU_elidible free* selbri SEhU_elidible / vocative relative_clauses? selbri DOhU_elidible / vocative relative_clauses? CMEVLA_clause+ free* relative_clauses? DOhU_elidible / vocative sumti? DOhU_elidible / mex_2 MAI_clause / TO_clause text TOI_elidible / xi_clause / LOhAI_clause) {return _node("free", expr); } xi_clause = expr:(XI_clause free* mex_2) {return _node("xi_clause", expr); } vocative = expr:((COI_clause NAI_clause?)+ DOI_clause / (COI_clause NAI_clause?) (COI_clause NAI_clause?)* / DOI_clause) {return _node("vocative", expr); } indicators = expr:(FUhE_clause? indicator+) {return _node("indicators", expr); } indicator = expr:(((UI_clause / CAI_clause) NAI_clause? / DAhO_clause / FUhO_clause) !BU_clause) {return _node("indicator", expr); } // **************** // Magic Words // **************** bu_clause = expr:(pre_clause post:bu_clause_no_pre) {return _node("bu_clause", expr); } bu_clause_no_pre = expr:((si_word / SU spaces?) bu_tail+ post_clause) {return _node("bu_clause_no_pre", expr); } bu_tail = expr:BU_clause+ {return _node("bu_tail", expr); } dot_star = expr:(.*) { ret = ""; for (i in expr) ret += (expr[i] === " ") ? "_" : expr[i]; return ret; } // __ General Morphology Issues // // 1. Spaces (including '.y') and UI are eaten *after* a word. // // 3. BAhE is eaten *before* a word. // Handling of what can go after a cmavo post_clause = expr:(spaces? !BU_clause indicators*) {return _node_nonempty("post_clause", expr); } pre_clause = BAhE_clause? si_clause? // Handling of spaces and things like spaces. // ___ SPACE ___ // Do *NOT* delete the line above! // SU clauses su_clause = expr:((erasable_clause / su_valsi)* SU_clause) {return _node("su_clause", expr); } // Handling of SI and interactions with zo and lo'u...le'u si_clause = ((erasable_clause / si_word) si_clause? SI_clause)+ erasable_clause = expr:(bu_clause_no_pre !BU_clause) {return _node("erasable_clause", expr); } su_valsi = expr:(si_word / !SU_clause !FAhO_clause any_word spaces?) {return _node("su_valsi", expr); } si_word = (CMEVLA / BRIVLA / RAhOI spaces? (initial_rafsi / gismu / CVV_final_rafsi / stressed_initial_rafsi short_final_rafsi) / GOhOI spaces? any_word / ZO spaces? any_word / (LOhAI spaces? (!LOhAI !LEhAI any_word)*)? (LOhAI spaces? (!LOhAI !LEhAI any_word)*)? LEhAI / LOhU spaces? (!LEhU any_word)* LEhU / (ZOI / MUhOI) spaces? zoi_open spaces? zoi_word* zoi_close / !BU !SI !SU !FAhO CMAVO) spaces? // ___ ELIDIBLE TERMINATORS ___ BEhO_elidible = expr:(BEhO_clause?) {return (expr == "") ? ["BEhO"] : _node("BEhO", expr);} BOI_elidible = expr:(BOI_clause?) {return (expr == "") ? ["BOI"] : _node("BOI", expr);} CU_elidible = expr:(CU_clause?) {return (expr == "") ? ["CU"] : _node("CU", expr);} DOhU_elidible = expr:(DOhU_clause?) {return (expr == "") ? ["DOhU"] : _node("DOhU", expr);} FEhU_elidible = expr:(FEhU_clause?) {return (expr == "") ? ["FEhU"] : _node("FEhU", expr);} // FOI and FUhO are never elidible GEhU_elidible = expr:(GEhU_clause?) {return (expr == "") ? ["GEhU"] : _node("GEhU", expr);} // GIhI_elidible = expr:(GIhI_clause?) {return (expr == "") ? ["GIhI"] : _node("GIhI", expr);} //////// _maltufa: vimcu zoizoi GIhI_elidible zoi ki'u lo nu na'e sarcu_20150803UTC IAU_elidible = expr:(IAU_clause?) {return (expr == "") ? ["IAU"] : _node("IAU", expr);} KEI_elidible = expr:(KEI_clause?) {return (expr == "") ? ["KEI"] : _node("KEI", expr);} KEhE_elidible = expr:(KEhE_clause?) {return (expr == "") ? ["KEhE"] : _node("KEhE", expr);} KU_elidible = expr:(KU_clause?) {return (expr == "") ? ["KU"] : _node("KU", expr);} KUhAU_elidible = expr:(KUhAU_clause?) {return (expr == "") ? ["KUhAU"] : _node("KUhAU", expr);} KUhE_elidible = expr:(KUhE_clause?) {return (expr == "") ? ["KUhE"] : _node("KUhE", expr);} KUhO_elidible = expr:(KUhO_clause?) {return (expr == "") ? ["KUhO"] : _node("KUhO", expr);} // LEhU is never elidible LIhAU_elidible = expr:(LIhAU_clause?) {return (expr == "") ? ["LIhAU"] : _node("LIhAU", expr);} LIhU_elidible = expr:(LIhU_clause?) {return (expr == "") ? ["LIhU"] : _node("LIhU", expr);} LOhO_elidible = expr:(LOhO_clause?) {return (expr == "") ? ["LOhO"] : _node("LOhO", expr);} LUhU_elidible = expr:(LUhU_clause?) {return (expr == "") ? ["LUhU"] : _node("LUhU", expr);} MEhU_elidible = expr:(MEhU_clause?) {return (expr == "") ? ["MEhU"] : _node("MEhU", expr);} // //////// _maltufa: zo NUhI je zo NUhU di'a selma'o i jmina la'o zoi NUhU_elidible zoi_20150904UTC NUhU_elidible = expr:(NUhU_clause?) {return (expr == "") ? ["NUhU"] : _node("NUhU", expr);} SEhU_elidible = expr:(SEhU_clause?) {return (expr == "") ? ["SEhU"] : _node("SEhU", expr);} TEhU_elidible = expr:(TEhU_clause?) {return (expr == "") ? ["TEhU"] : _node("TEhU", expr);} TOI_elidible = expr:(TOI_clause?) {return (expr == "") ? ["TOI"] : _node("TOI", expr);} TUhU_elidible = expr:(TUhU_clause?) {return (expr == "") ? ["TUhU"] : _node("TUhU", expr);} VAU_elidible = expr:(VAU_clause?) {return (expr == "") ? ["VAU"] : _node("VAU", expr);} VEhO_elidible = expr:(VEhO_clause?) {return (expr == "") ? ["VEhO"] : _node("VEhO", expr);} // ___ SELMAHO ___ // Do *NOT* delete the line above! BRIVLA_clause = expr:(BRIVLA_pre BRIVLA_post) {return (expr.length == 2) ? _node2("BRIVLA_clause", expr[0], expr[1]) : _node("BRIVLA_clause", expr[0]); } BRIVLA_pre = pre_clause BRIVLA spaces? BRIVLA_post = post_clause CMEVLA_clause = pre:CMEVLA_pre post:CMEVLA_post {return _node2("CMEVLA_clause", pre, post); } CMEVLA_pre = pre_clause CMEVLA spaces? CMEVLA_post = post_clause CMAVO_clause = pre:CMAVO_pre post:CMAVO_post {return _node2("CMAVO_clause", pre, post); } CMAVO_pre = pre_clause CMAVO spaces? CMAVO_post = post_clause // eks; basic afterthought logical connectives A_clause = pre:A_pre post:A_post {return _node2("A_clause", pre, post); } A_pre = pre_clause A spaces? A_post = post_clause // modal operators BAI_clause = pre:BAI_pre post:BAI_post {return _node2("BAI_clause", pre, post); } BAI_pre = pre_clause BAI spaces? BAI_post = post_clause // next word intensifier BAhE_clause = expr:(BAhE_pre BAhE_post)+ {return _node("BAhE_clause", expr); } BAhE_pre = BAhE spaces? BAhE_post = si_clause? !BU_clause // sumti link to attach sumti to a selbri BE_clause = pre:BE_pre post:BE_post {return _node2("BE_clause", pre, post); } BE_pre = pre_clause BE spaces? BE_post = post_clause // multiple sumti separator between BE, BEI BEI_clause = pre:BEI_pre post:BEI_post {return _node2("BEI_clause", pre, post); } BEI_pre = pre_clause BEI spaces? BEI_post = post_clause // terminates BEBEI specified descriptors BEhO_clause = pre:BEhO_pre post:BEhO_post {return _node2("BEhO_clause", pre, post); } BEhO_pre = pre_clause BEhO spaces? BEhO_post = post_clause // prefix for high_priority MEX operator BIhE_clause = pre:BIhE_pre post:BIhE_post {return _node2("BIhE_clause", pre, post); } BIhE_pre = pre_clause BIhE spaces? BIhE_post = post_clause // interval component of JOI BIhI_clause = pre:BIhI_pre post:BIhI_post {return _node2("BIhI_clause", pre, post); } BIhI_pre = pre_clause BIhI spaces? BIhI_post = post_clause // joins two units with shortest scope BO_clause = pre:BO_pre post:BO_post {return _node2("BO_clause", pre, post); } BO_pre = pre_clause BO spaces? BO_post = post_clause // number or lerfu_string terminator BOI_clause = pre:BOI_pre post:BOI_post {return _node2("BOI_clause", pre, post); } BOI_pre = pre_clause BOI spaces? BOI_post = post_clause // turns any word into a BY lerfu word BU_clause = pre:BU_pre post:BU_post {return _node2("BU_clause", pre, post); } BU_pre = pre_clause BU spaces? BU_post = spaces? // individual lerfu words BY_clause = expr:(BY_pre BY_post / bu_clause) {return (expr[0] == "bu_clause") ? ["BY_clause", expr] : _node2("BY_clause", expr[0], expr[1]); } BY_pre = pre_clause BY spaces? BY_post = post_clause // specifies actualitypotentiality of tense CAhA_clause = pre:CAhA_pre post:CAhA_post {return _node2("CAhA_clause", pre, post); } CAhA_pre = pre_clause CAhA spaces? CAhA_post = post_clause // afterthought intensity marker CAI_clause = pre:CAI_pre post:CAI_post {return _node2("CAI_clause", pre, post); } CAI_pre = pre_clause CAI spaces? CAI_post = post_clause // pro_bridi assignment operator CEI_clause = pre:CEI_pre post:CEI_post {return _node2("CEI_clause", pre, post); } CEI_pre = pre_clause CEI spaces? CEI_post = post_clause // afterthought term list connective // //////// _maltufa: xruti la'o zoi CEhE_clause, CEhE_pre, CEhE_post zoi_20151019UTC CEhE_clause = pre:CEhE_pre post:CEhE_post {return _node2("CEhE_clause", pre, post); } CEhE_pre = pre_clause CEhE spaces? CEhE_post = post_clause // names; require consonant end, then pause no // LA or DOI selma'o embedded, pause before if // vowel initial and preceded by a vowel // tanru inversion CO_clause = pre:CO_pre post:CO_post {return _node2("CO_clause", pre, post); } CO_pre = pre_clause CO spaces? CO_post = post_clause COI_clause = pre:COI_pre post:COI_post {return _node2("COI_clause", pre, post); } COI_pre = pre_clause COI spaces? COI_post = post_clause // vocative marker permitted inside names; must // always be followed by pause or DOI // separator between head sumti and selbri CU_clause = pre:CU_pre post:CU_post {return _node2("CU_clause", pre, post); } CU_pre = pre_clause CU spaces? CU_post = post_clause // tensemodal question CUhE_clause = pre:CUhE_pre post:CUhE_post {return _node2("CUhE_clause", pre, post); } CUhE_pre = pre_clause CUhE spaces? CUhE_post = post_clause // cancel anaphoracataphora assignments DAhO_clause = pre:DAhO_pre post:DAhO_post {return _node2("DAhO_clause", pre, post); } DAhO_pre = pre_clause DAhO spaces? DAhO_post = post_clause // vocative marker DOI_clause = pre:DOI_pre post:DOI_post {return _node2("DOI_clause", pre, post); } DOI_pre = pre_clause DOI spaces? DOI_post = post_clause // terminator for DOI_marked vocatives DOhU_clause = pre:DOhU_pre post:DOhU_post {return _node2("DOhU_clause", pre, post); } DOhU_pre = pre_clause DOhU spaces? DOhU_post = post_clause // modifier head generic case tag FA_clause = pre:FA_pre post:FA_post {return _node2("FA_clause", pre, post); } FA_pre = pre_clause FA spaces? FA_post = post_clause // superdirections in space FAhA_clause = pre:FAhA_pre post:FAhA_post {return _node2("FAhA_clause", pre, post); } FAhA_pre = pre_clause FAhA spaces? FAhA_post = post_clause // normally elided 'done pause' to indicate end // of utterance string FAhO_clause = expr:(pre_clause FAhO spaces?) {return _node("FAhO_clause", expr);} // space interval mod flag FEhE_clause = pre:FEhE_pre post:FEhE_post {return _node2("FEhE_clause", pre, post); } FEhE_pre = pre_clause FEhE spaces? FEhE_post = post_clause // ends bridi to modal conversion FEhU_clause = pre:FEhU_pre post:FEhU_post {return _node2("FEhU_clause", pre, post); } FEhU_pre = pre_clause FEhU spaces? FEhU_post = post_clause // marks bridi to modal conversion FIhO_clause = pre:FIhO_pre post:FIhO_post {return _node2("FIhO_clause", pre, post); } FIhO_pre = pre_clause FIhO spaces? FIhO_post = post_clause // end compound lerfu FOI_clause = pre:FOI_pre post:FOI_post {return _node2("FOI_clause", pre, post); } FOI_pre = pre_clause FOI spaces? FOI_post = post_clause // reverse Polish flag FUhA_clause = pre:FUhA_pre post:FUhA_post {return _node2("FUhA_clause", pre, post); } FUhA_pre = pre_clause FUhA spaces? FUhA_post = post_clause // open long scope for indicator FUhE_clause = pre:FUhE_pre post:FUhE_post {return _node2("FUhE_clause", pre, post); } FUhE_pre = pre_clause FUhE spaces? FUhE_post = !BU_clause spaces? !BU_clause // close long scope for indicator FUhO_clause = pre:FUhO_pre post:FUhO_post {return _node2("FUhO_clause", pre, post); } FUhO_pre = pre_clause FUhO spaces? FUhO_post = post_clause // geks; forethought logical connectives GA_clause = pre:GA_pre post:GA_post {return _node2("GA_clause", pre, post); } GA_pre = pre_clause GA spaces? GA_post = post_clause // openclosed interval markers for BIhI GAhO_clause = pre:GAhO_pre post:GAhO_post {return _node2("GAhO_clause", pre, post); } GAhO_pre = pre_clause GAhO spaces? GAhO_post = post_clause // marker ending GOI relative clauses GEhU_clause = pre:GEhU_pre post:GEhU_post {return _node2("GEhU_clause", pre, post); } GEhU_pre = pre_clause GEhU spaces? GEhU_post = post_clause // forethought medial marker GI_clause = pre:GI_pre post:GI_post {return _node2("GI_clause", pre, post); } GI_pre = pre_clause GI spaces? GI_post = post_clause // logical connectives for bridi_tails GIhA_clause = pre:GIhA_pre post:GIhA_post {return _node2("GIhA_clause", pre, post); } GIhA_pre = pre_clause GIhA spaces? GIhA_post = post_clause // famyma'o zoizoi gek ... (gik ...)+ zoi // GIhI_clause = pre:GIhI_pre post:GIhI_post {return _node2("GIhI_clause", pre, post); } //////// _maltufa: vimcu ki'u lo nu na'e sarcu_20150803UTC // GIhI_pre = pre_clause GIhI spaces? //////// _maltufa: vimcu ki'u lo nu na'e sarcu_20150803UTC // GIhI_post = post_clause //////// _maltufa: vimcu ki'u lo nu na'e sarcu_20150803UTC // attaches a sumti modifier to a sumti GOI_clause = pre:GOI_pre post:GOI_post {return _node2("GOI_clause", pre, post); } GOI_pre = pre_clause GOI spaces? GOI_post = post_clause // pro_bridi GOhA_clause = pre:GOhA_pre post:GOhA_post {return _node2("GOhA_clause", pre, post); } GOhA_pre = pre_clause GOhA spaces? GOhA_post = post_clause GOhOI_clause = pre:GOhOI_pre post:GOhOI_post {return _node2("GOhOI_clause", pre, post); } GOhOI_pre = pre_clause GOhOI spaces? any_word spaces? GOhOI_post = post_clause // GEK for tanru units, corresponds to JEKs // sentence link I_clause = expr:(I_pre I_post) {return _node("I_clause", expr); } I_pre = pre_clause I spaces? I_post = post_clause IAU_clause = pre:IAU_pre post:IAU_post {return _node2("IAU_clause", pre, post); } IAU_pre = pre_clause IAU spaces? IAU_post = post_clause // jeks; logical connectives within tanru // modal conversion flag JAI_clause = pre:JAI_pre post:JAI_post {return _node2("JAI_clause", pre, post); } JAI_pre = pre_clause JAI spaces? JAI_post = post_clause // flags an array operand // non_logical connectives JOI_clause = pre:JOI_pre post:JOI_post {return _node2("JOI_clause", pre, post); } JOI_pre = pre_clause JOI spaces? JOI_post = post_clause // left long scope marker KE_clause = pre:KE_pre post:KE_post {return _node2("KE_clause", pre, post); } KE_pre = pre_clause KE spaces? KE_post = post_clause // right terminator for KE groups KEhE_clause = pre:KEhE_pre post:KEhE_post {return _node2("KEhE_clause", pre, post); } KEhE_pre = pre_clause KEhE spaces? KEhE_post = post_clause // right terminator, NU abstractions KEI_clause = pre:KEI_pre post:KEI_post {return _node2("KEI_clause", pre, post); } KEI_pre = pre_clause KEI spaces? KEI_post = post_clause // multiple utterance scope for tenses KI_clause = pre:KI_pre post:KI_post {return _node2("KI_clause", pre, post); } KI_pre = pre_clause KI spaces? KI_post = post_clause // sumti anaphora KOhA_clause = pre:KOhA_pre post:KOhA_post {return _node2("KOhA_clause", pre, post); } KOhA_pre = pre_clause KOhA spaces? KOhA_post = post_clause // right terminator for descriptions, etc. KU_clause = pre:KU_pre post:KU_post {return _node2("KU_clause", pre, post); } KU_pre = pre_clause KU spaces? KU_post = post_clause KUhAU_clause = pre:KUhAU_pre post:KUhAU_post {return _node2("KUhAU_clause", pre, post); } KUhAU_pre = pre_clause KUhAU spaces? KUhAU_post = post_clause // MEX forethought delimiter KUhE_clause = pre:KUhE_pre post:KUhE_post {return _node2("KUhE_clause", pre, post); } KUhE_pre = pre_clause KUhE spaces? KUhE_post = post_clause // right terminator, NOI relative clauses KUhO_clause = pre:KUhO_pre post:KUhO_post {return _node2("KUhO_clause", pre, post); } KUhO_pre = pre_clause KUhO spaces? KUhO_post = post_clause // name descriptors //////// _maltufa: lo cmevla co'u selbrisle : xruti tu'a la'o zoi LA_clause, LA_pre, LA_post zoi_20150810UTC LA_clause = pre:LA_pre post:LA_post {return _node2("LA_clause", pre, post); } LA_pre = pre_clause LA spaces? LA_post = post_clause // lerfu prefixes LAU_clause = pre:LAU_pre post:LAU_post {return _node2("LAU_clause", pre, post); } LAU_pre = pre_clause LAU spaces? LAU_post = post_clause // sumti qualifiers LAhE_clause = pre:LAhE_pre post:LAhE_post {return _node2("LAhE_clause", pre, post); } LAhE_pre = pre_clause LAhE spaces? LAhE_post = post_clause // sumti descriptors LE_clause = pre:LE_pre post:LE_post {return _node2("LE_clause", pre, post); } LE_pre = pre_clause LE spaces? LE_post = post_clause // possibly ungrammatical text right quote LEhU_clause = pre:LEhU_pre post:LEhU_post {return _node2("LEhU_clause", pre, post); } LEhU_pre = pre_clause LEhU spaces? LEhU_post = spaces? // convert number to sumti LI_clause = pre:LI_pre post:LI_post {return _node2("LI_clause", pre, post); } LI_pre = pre_clause LI spaces? LI_post = post_clause // famyma'o ma'oi LUhEI LIhAU_clause = pre:LIhAU_pre post:LIhAU_post {return _node2("LIhAU_clause", pre, post); } LIhAU_pre = pre_clause LIhAU spaces? LIhAU_post = post_clause // grammatical text right quote LIhU_clause = pre:LIhU_pre post:LIhU_post {return _node2("LIhU_clause", pre, post); } LIhU_pre = pre_clause LIhU spaces? LIhU_post = post_clause LOhAI_clause = pre:LOhAI_pre post:LOhAI_post {return _node2("LOhAI_clause", pre, post); } LOhAI_pre = pre_clause (LOhAI spaces? (!LOhAI !LEhAI any_word)*)? (LOhAI spaces? (!LOhAI !LEhAI any_word)*)? LEhAI spaces? LOhAI_post = post_clause // elidable terminator for LI LOhO_clause = pre:LOhO_pre post:LOhO_post {return _node2("LOhO_clause", pre, post); } LOhO_pre = pre_clause LOhO spaces? LOhO_post = post_clause // lo nu galfi lo bridi lo sumti cu cfari LOhOI_clause = pre:LOhOI_pre post:LOhOI_post {return _node2("LOhOI_clause", pre, post); } LOhOI_pre = pre_clause LOhOI spaces? LOhOI_post = post_clause // possibly ungrammatical text left quote LOhU_clause = pre:LOhU_pre post:LOhU_post {return _node2("LOhU_clause", pre, post); } LOhU_pre = pre_clause LOhU spaces? (!LEhU any_word)* LEhU_clause spaces? LOhU_post = post_clause // grammatical text left quote LU_clause = pre:LU_pre post:LU_post {return _node2("LU_clause", pre, post); } LU_pre = pre_clause LU spaces? LU_post = post_clause // galfi lo se li'erla'i selsku lo selbrisle LUhEI_clause = pre:LUhEI_pre post:LUhEI_post {return _node2("LUhEI_clause", pre, post); } LUhEI_pre = pre_clause LUhEI spaces? LUhEI_post = post_clause // LAhE close delimiter LUhU_clause = pre:LUhU_pre post:LUhU_post {return _node2("LUhU_clause", pre, post); } LUhU_pre = pre_clause LUhU spaces? LUhU_post = post_clause // change MEX expressions to MEX operators MAhO_clause = pre:MAhO_pre post:MAhO_post {return _node2("MAhO_clause", pre, post); } MAhO_pre = pre_clause MAhO spaces? MAhO_post = post_clause // change numbers to utterance ordinals MAI_clause = pre:MAI_pre post:MAI_post {return _node2("MAI_clause", pre, post); } MAI_pre = pre_clause MAI spaces? MAI_post = post_clause // converts a sumti into a tanru_unit ME_clause = pre:ME_pre post:ME_post {return _node2("ME_clause", pre, post); } ME_pre = pre_clause ME spaces? ME_post = post_clause // terminator for ME MEhU_clause = pre:MEhU_pre post:MEhU_post {return _node2("MEhU_clause", pre, post); } MEhU_pre = pre_clause MEhU spaces? MEhU_post = post_clause // change sumti to operand, inverse of LI MOhE_clause = pre:MOhE_pre post:MOhE_post {return _node2("MOhE_clause", pre, post); } MOhE_pre = pre_clause MOhE spaces? MOhE_post = post_clause // motion tense marker MOhI_clause = pre:MOhI_pre post:MOhI_post {return _node2("MOhI_clause", pre, post); } MOhI_pre = pre_clause MOhI spaces? MOhI_post = post_clause // change number to selbri MOI_clause = pre:MOI_pre post:MOI_post {return _node2("MOI_clause", pre, post); } MOI_pre = pre_clause MOI spaces? MOI_post = post_clause // galfi lo na'e lojbo lo selbrisle MUhOI_clause = pre:MUhOI_pre post:MUhOI_post {return _node2("MUhOI_clause", pre, post); } MUhOI_pre = pre_clause MUhOI spaces? zoi_open spaces? zoi_word* zoi_close spaces? MUhOI_post = post_clause // bridi negation NA_clause = pre:NA_pre post:NA_post {return _node2("NA_clause", pre, post); } NA_pre = pre_clause NA spaces? NA_post = post_clause // attached to words to negate them NAI_clause = pre:NAI_pre post:NAI_post {return _node2("NAI_clause", pre, post); } NAI_pre = pre_clause NAI spaces? NAI_post = post_clause // scalar negation NAhE_clause = pre:NAhE_pre post:NAhE_post {return _node2("NAhE_clause", pre, post); } NAhE_pre = pre_clause NAhE spaces? NAhE_post = post_clause // change a selbri into an operator NAhU_clause = pre:NAhU_pre post:NAhU_post {return _node2("NAhU_clause", pre, post); } NAhU_pre = pre_clause NAhU spaces? NAhU_post = post_clause // change selbri to operand; inverse of MOI NIhE_clause = pre:NIhE_pre post:NIhE_post {return _node2("NIhE_clause", pre, post); } NIhE_pre = pre_clause NIhE spaces? NIhE_post = post_clause // new paragraph; change of subject NIhO_clause = expr:(NIhO_pre NIhO_post) {return _node("NIhO_clause", expr); } NIhO_pre = pre_clause NIhO spaces? NIhO_post = post_clause // attaches a subordinate clause to a sumti NOI_clause = pre:NOI_pre post:NOI_post {return _node2("NOI_clause", pre, post); } NOI_pre = pre_clause NOI spaces? NOI_post = post_clause // abstraction NU_clause = pre:NU_pre post:NU_post {return _node2("NU_clause", pre, post); } NU_pre = pre_clause NU spaces? NU_post = post_clause // change operator to selbri; inverse of MOhE // //////// _maltufa: zo NUhI je zo NUhU di'a selma'o i jmina la'o zoi NUhI_clause, NUhI_pre, NUhI_post zoi_20150904UTC // marks the start of a termset NUhI_clause = pre:NUhI_pre post:NUhI_post {return _node2("NUhI_clause", pre, post); } NUhI_pre = pre_clause NUhI spaces? NUhI_post = post_clause // //////// _maltufa: zo NUhI je zo NUhU di'a selma'o i jmina la'o zoi NUhU_clause, NUhU_pre, NUhU_post zoi_20150904UTC // marks the middle and end of a termset NUhU_clause = pre:NUhU_pre post:NUhU_post {return _node2("NUhU_clause", pre, post); } NUhU_pre = pre_clause NUhU spaces? NUhU_post = post_clause // numbers and numeric punctuation PA_clause = pre:PA_pre post:PA_post {return _node2("PA_clause", pre, post); } PA_pre = pre_clause PA spaces? PA_post = post_clause // afterthought termset connective prefix // //////// _maltufa: xruti la'o zoi PEhE_clause, PEhE_pre, PEhE_post zoi_20151019UTC PEhE_clause = pre:PEhE_pre post:PEhE_post {return _node2("PEhE_clause", pre, post); } PEhE_pre = pre_clause PEhE spaces? PEhE_post = post_clause // forethought (Polish) flag PEhO_clause = pre:PEhO_pre post:PEhO_post {return _node2("PEhO_clause", pre, post); } PEhO_pre = pre_clause PEhO spaces? PEhO_post = post_clause // directions in time PU_clause = pre:PU_pre post:PU_post {return _node2("PU_clause", pre, post); } PU_pre = pre_clause PU spaces? PU_post = post_clause RAhOI_clause = pre:RAhOI_pre post:RAhOI_post {return _node2("RAhOI_clause", pre, post); } RAhOI_pre = pre_clause RAhOI spaces? (initial_rafsi / gismu / CVV_final_rafsi / stressed_initial_rafsi short_final_rafsi) spaces? RAhOI_post = post_clause // flag for modified interpretation of GOhI RAhO_clause = pre:RAhO_pre post:RAhO_post {return _node2("RAhO_clause", pre, post); } RAhO_pre = pre_clause RAhO spaces? RAhO_post = post_clause // converts number to extensional tense ROI_clause = pre:ROI_pre post:ROI_post {return _node2("ROI_clause", pre, post); } ROI_pre = pre_clause ROI spaces? ROI_post = post_clause // metalinguistic eraser to the beginning of // the current utterance // conversions SE_clause = pre:SE_pre post:SE_post {return _node2("SE_clause", pre, post); } SE_pre = pre_clause SE spaces? SE_post = post_clause // metalinguistic bridi insert marker SEI_clause = pre:SEI_pre post:SEI_post {return _node2("SEI_clause", pre, post); } SEI_pre = pre_clause SEI spaces? SEI_post = post_clause // metalinguistic bridi end marker SEhU_clause = pre:SEhU_pre post:SEhU_post {return _node2("SEhU_clause", pre, post); } SEhU_pre = pre_clause SEhU spaces? SEhU_post = post_clause // metalinguistic single word eraser SI_clause = expr:(spaces? SI spaces?) {return _node("SI_clause", expr); } // reciprocal sumti marker // SOI_clause //////// _maltufa: xruti zoizoi SOI_clause zoi_20150723UTC SOI_clause = pre:SOI_pre post:SOI_post {return _node2("SOI_clause", pre, post); } SOI_pre = pre_clause SOI spaces? SOI_post = post_clause // metalinguistic eraser of the entire text SU_clause = pre:SU_pre post:SU_post {return _node2("SU_clause", pre, post); } SU_pre = pre_clause SU spaces? SU_post = post_clause // tense interval properties TAhE_clause = pre:TAhE_pre post:TAhE_post {return _node2("TAhE_clause", pre, post); } TAhE_pre = pre_clause TAhE spaces? TAhE_post = post_clause // closing gap for MEX constructs TEhU_clause = pre:TEhU_pre post:TEhU_post {return _node2("TEhU_clause", pre, post); } TEhU_pre = pre_clause TEhU spaces? TEhU_post = post_clause // start compound lerfu TEI_clause = pre:TEI_pre post:TEI_post {return _node2("TEI_clause", pre, post); } TEI_pre = pre_clause TEI spaces? TEI_post = post_clause // left discursive parenthesis TO_clause = pre:TO_pre post:TO_post {return _node2("TO_clause", pre, post); } TO_pre = pre_clause TO spaces? TO_post = post_clause // right discursive parenthesis TOI_clause = pre:TOI_pre post:TOI_post {return _node2("TOI_clause", pre, post); } TOI_pre = pre_clause TOI spaces? TOI_post = post_clause // multiple utterance scope mark TUhE_clause = pre:TUhE_pre post:TUhE_post {return _node2("TUhE_clause", pre, post); } TUhE_pre = pre_clause TUhE spaces? TUhE_post = post_clause // multiple utterance end scope mark TUhU_clause = pre:TUhU_pre post:TUhU_post {return _node2("TUhU_clause", pre, post); } TUhU_pre = pre_clause TUhU spaces? TUhU_post = post_clause // attitudinals, observationals, discursives UI_clause = pre:UI_pre post:UI_post {return _node2("UI_clause", pre, post); } UI_pre = pre_clause UI spaces? UI_post = post_clause // distance in space_time VA_clause = pre:VA_pre post:VA_post {return _node2("VA_clause", pre, post); } VA_pre = pre_clause VA spaces? VA_post = post_clause // end simple bridi or bridi_tail VAU_clause = pre:VAU_pre post:VAU_post {return _node2("VAU_clause", pre, post); } VAU_pre = pre_clause VAU spaces? VAU_post = post_clause // left MEX bracket VEI_clause = pre:VEI_pre post:VEI_post {return _node2("VEI_clause", pre, post); } VEI_pre = pre_clause VEI spaces? VEI_post = post_clause // right MEX bracket VEhO_clause = pre:VEhO_pre post:VEhO_post {return _node2("VEhO_clause", pre, post); } VEhO_pre = pre_clause VEhO spaces? VEhO_post = post_clause // MEX operator VUhU_clause = pre:VUhU_pre post:VUhU_post {return _node2("VUhU_clause", pre, post); } VUhU_pre = pre_clause VUhU spaces? VUhU_post = post_clause // space_time interval size VEhA_clause = pre:VEhA_pre post:VEhA_post {return _node2("VEhA_clause", pre, post); } VEhA_pre = pre_clause VEhA spaces? VEhA_post = post_clause // space_time dimensionality marker VIhA_clause = pre:VIhA_pre post:VIhA_post {return _node2("VIhA_clause", pre, post); } VIhA_pre = pre_clause VIhA spaces? VIhA_post = post_clause VUhO_clause = pre:VUhO_pre post:VUhO_post {return _node2("VUhO_clause", pre, post); } VUhO_pre = pre_clause VUhO spaces? VUhO_post = post_clause // glue between logically connected sumti and relative clauses // subscripting operator XI_clause = pre:XI_pre post:XI_post {return _node2("XI_clause", pre, post); } XI_pre = pre_clause XI spaces? XI_post = post_clause XOI_clause = pre:XOI_pre post:XOI_post {return _node2("XOI_clause", pre, post); } XOI_pre = pre_clause XOI spaces? XOI_post = post_clause // hesitation // Very very special case. Handled in the morphology section. // Y_clause = spaces? Y spaces? // event properties _ inchoative, etc. ZAhO_clause = pre:ZAhO_pre post:ZAhO_post {return _node2("ZAhO_clause", pre, post); } ZAhO_pre = pre_clause ZAhO spaces? ZAhO_post = post_clause // time interval size tense ZEhA_clause = pre:ZEhA_pre post:ZEhA_post {return _node2("ZEhA_clause", pre, post); } ZEhA_pre = pre_clause ZEhA spaces? ZEhA_post = post_clause // lujvo glue // time distance tense ZI_clause = pre:ZI_pre post:ZI_post {return _node2("ZI_clause", pre, post); } ZI_pre = pre_clause ZI spaces? ZI_post = post_clause // conjoins relative clauses // single word metalinguistic quote marker ZO_clause = pre:ZO_pre post:ZO_post {return _node2("ZO_clause", pre, post); } ZO_pre = pre_clause ZO spaces? any_word spaces? ZO_post = post_clause // delimited quote marker ZOI_clause = pre:ZOI_pre post:ZOI_post {return _node2("ZOI_clause", pre, post); } ZOI_pre = pre_clause ZOI spaces? zoi_open spaces? zoi_word* zoi_close spaces? ZOI_post = post_clause // prenex terminator (not elidable) ZOhU_clause = pre:ZOhU_pre post:ZOhU_post {return _node2("ZOhU_clause", pre, post); } ZOhU_pre = pre_clause ZOhU spaces? ZOhU_post = post_clause // ___ MORPHOLOGY ___ CMEVLA = expr:cmevla {return ["CMEVLA", expr];} BRIVLA = expr:(gismu_2 / lujvo / fuhivla) {return ["BRIVLA", expr];} gismu_2 = expr:(gismu) {return ["gismu", expr];} // CMAVO //////// _maltufa: xruti ma'oi SOI_20150723UTC // CMAVO //////// _maltufa: vimcu ma'oi GIhI ki'u lo nu na'e sarcu_20150803UTC // CMAVO //////// _maltufa: lo cmevla co'u selbrisle : xruti ma'oi LA_20150810UTC // CMAVO //////// _maltufa: zo NUhI je zo NUhU di'a selma'o_20150904UTC CMAVO = expr:(A / BAI / BAhE / BE / BEI / BEhO / BIhE / BIhI / BO / BOI / BU / BY / CAhA / CAI / CEI / CO / COI / CU / CUhE / DAhO / DOI / DOhU / FA / FAhA / FAhO / FEhE / FEhU / FIhO / FOI / FUhA / FUhE / FUhO / GA / GAhO / GEhU / GI / GIhA / GOI / GOhA / GOhOI / I / IAU / JAI / JOI / KE / KEhE / KEI / KI / KOhA / KU / KUhAU / KUhE / KUhO / LA / LAU / LAhE / LEhAI / LE / LEhU / LI / LIhAU / LIhU / LOhAI / LOhO / LOhOI / LOhU / LU / LUhEI / LUhU / MAhO / MAI / ME / MEhU / MOhE / MOhI / MOI / MUhOI / NA / NAI / NAhE / NAhU / NIhE / NIhO / NOI / NU / NUhI / NUhU / PA / PEhO / PU / RAhOI / RAhO / ROI / SE / SEI / SEhU / SI / SOI / SU / TAhE / TEhU / TEI / TO / TOI / TUhE / TUhU / UI / VA / VAU / VEI / VEhO / VUhU / VEhA / VIhA / VUhO / XI / XOI / ZAhO / ZEhA / ZI / ZO / ZOI / ZOhU / cmavo) {return ["CMAVO", expr];} // This is a Parsing Expression Grammar for the morphology of Lojban. // See http://www.pdos.lcs.mit.edu/~baford/packrat/ // // All rules have the form // // name = peg_expression // // which means that the grammatical construct "name" is parsed using // "peg_expression". // // 1) Concatenation is expressed by juxtaposition with no operator symbol. // 2) / represents *ORDERED* alternation (choice). If the first // option succeeds, the others will never be checked. // 3) ? indicates that the element to the left is optional. // 4) * represents optional repetition of the construct to the left. // 5) + represents one_or_more repetition of the construct to the left. // 6) () serves to indicate the grouping of the other operators. // 7) & indicates that the element to the right must follow (but the // marked element itself does not absorb anything). // 8) ! indicates that the element to the right must not follow (the // marked element itself does not absorb anything). // 9) . represents any character. // 10) ' ' or " " represents a literal string. // 11) [] represents a character class. // // Repetitions grab as much as they can. // // // ___ GRAMMAR ___ // This grammar classifies words by their morphological class (cmevla, // gismu, lujvo, fuhivla, cmavo, and non_lojban_word). // //The final section sorts cmavo into grammatical classes (A, BAI, BAhE, ..., ZOhU). // // mi'e ((xorxes)) //___________________________________________________________________ lojban_word = expr:(CMEVLA / CMAVO / BRIVLA) { return expr; } any_word = expr:lojban_word spaces? { return expr; } zoi_open = w:lojban_word { return _zoi_assign_delim(w); } zoi_word = expr:( w:(non_space+) spaces &{ return (! _zoi_check_quote(w)); } ) {return "";} zoi_close = w:any_word &{ return (_zoi_check_delim(w)); } //___________________________________________________________________ cmevla = expr:(jbocme / zifcme) { return ["cmevla", _join(expr)]; } zifcme = (!h (nucleus / glide / h / consonant !pause)* consonant &pause) jbocme = (&zifcme any_syllable* &pause) //___________________________________________________________________ cmavo = expr:(!cmevla !CVCy_lujvo cmavo_form &post_word) { return _join(expr); } CVCy_lujvo = expr:(CVC_rafsi y h? initial_rafsi* brivla_core / stressed_CVC_rafsi y short_final_rafsi) { return _join(expr); } cmavo_form = expr:(!h !cluster onset (nucleus h)* (!stressed nucleus / nucleus !cluster) / y+) { return _join(expr); } //___________________________________________________________________ brivla = expr:(!cmavo initial_rafsi* brivla_core) { return _join(expr); } brivla_core = expr:(fuhivla / gismu / CVV_final_rafsi / stressed_initial_rafsi short_final_rafsi) { return _join(expr); } stressed_initial_rafsi = expr:(stressed_extended_rafsi / stressed_y_rafsi / stressed_y_less_rafsi) { return _join(expr); } initial_rafsi = expr:(extended_rafsi / y_rafsi / !any_extended_rafsi y_less_rafsi !any_extended_rafsi) { return _join(expr); } //___________________________________________________________________ any_extended_rafsi = expr:(fuhivla / extended_rafsi / stressed_extended_rafsi) { return _join(expr); } fuhivla = expr:(fuhivla_head stressed_syllable consonantal_syllable* final_syllable) { return _join(expr); } stressed_extended_rafsi = expr:(stressed_brivla_rafsi / stressed_fuhivla_rafsi) { return _join(expr); } extended_rafsi = expr:(brivla_rafsi / fuhivla_rafsi) { return _join(expr); } stressed_brivla_rafsi = expr:(&unstressed_syllable brivla_head stressed_syllable h y) { return _join(expr); } brivla_rafsi = expr:(&(syllable consonantal_syllable* syllable) brivla_head h y h?) { return _join(expr); } stressed_fuhivla_rafsi = expr:(fuhivla_head stressed_syllable consonantal_syllable* !h onset y) { return _join(expr); } fuhivla_rafsi = expr:(&unstressed_syllable fuhivla_head !h onset y h?) { return _join(expr); } fuhivla_head = expr:(!rafsi_string brivla_head) { return _join(expr); } brivla_head = expr:(!cmavo !slinkuhi !h &onset unstressed_syllable*) { return _join(expr); } slinkuhi = expr:(!rafsi_string consonant rafsi_string) { return _join(expr); } rafsi_string = expr:(y_less_rafsi* (gismu / CVV_final_rafsi / stressed_y_less_rafsi short_final_rafsi / y_rafsi / stressed_y_rafsi / stressed_y_less_rafsi? initial_pair y / hy_rafsi / stressed_hy_rafsi)) { return _join(expr); } //___________________________________________________________________ gismu = expr:((initial_pair stressed_vowel / consonant stressed_vowel consonant) &final_syllable consonant vowel &post_word) { return _join(expr); } CVV_final_rafsi = expr:(consonant stressed_vowel h &final_syllable vowel &post_word) { return _join(expr); } short_final_rafsi = expr:(&final_syllable (consonant diphthong / initial_pair vowel) &post_word) { return _join(expr); } stressed_y_rafsi = expr:((stressed_long_rafsi / stressed_CVC_rafsi) y) { return _join(expr); } stressed_y_less_rafsi = expr:(stressed_CVC_rafsi !y / stressed_CCV_rafsi / stressed_CVV_rafsi) { return _join(expr); } stressed_long_rafsi = expr:(initial_pair stressed_vowel consonant / consonant stressed_vowel consonant consonant) { return _join(expr); } stressed_CVC_rafsi = expr:(consonant stressed_vowel consonant) { return _join(expr); } stressed_CCV_rafsi = expr:(initial_pair stressed_vowel) { return _join(expr); } stressed_CVV_rafsi = expr:(consonant (unstressed_vowel h stressed_vowel / stressed_diphthong) r_hyphen?) { return _join(expr); } y_rafsi = expr:((long_rafsi / CVC_rafsi) y h?) { return _join(expr); } y_less_rafsi = expr:(!y_rafsi !stressed_y_rafsi !hy_rafsi !stressed_hy_rafsi (CVC_rafsi / CCV_rafsi / CVV_rafsi) !h) { return _join(expr); } hy_rafsi = expr:((long_rafsi vowel / CCV_rafsi / CVV_rafsi) h y h?) stressed_hy_rafsi = expr:((long_rafsi stressed_vowel / stressed_CCV_rafsi / stressed_CVV_rafsi) h y) long_rafsi = expr:(initial_pair unstressed_vowel consonant / consonant unstressed_vowel consonant consonant) { return _join(expr); } CVC_rafsi = expr:(consonant unstressed_vowel consonant) { return _join(expr); } CCV_rafsi = expr:(initial_pair unstressed_vowel) { return _join(expr); } CVV_rafsi = expr:(consonant (unstressed_vowel h unstressed_vowel / unstressed_diphthong) r_hyphen?) { return _join(expr); } r_hyphen = expr:(r &consonant / n &r) { return _join(expr); } //___________________________________________________________________ final_syllable = expr:(onset !y !stressed nucleus !cmevla &post_word) {return _join(expr);} stressed_syllable = expr:(&stressed syllable / syllable &stress) {return _join(expr);} stressed_diphthong = expr:(&stressed diphthong / diphthong &stress) {return _join(expr);} stressed_vowel = expr:(&stressed vowel / vowel &stress) {return _join(expr);} unstressed_syllable = expr:(!stressed syllable !stress / consonantal_syllable) {return _join(expr);} unstressed_diphthong = expr:(!stressed diphthong !stress) {return _join(expr);} unstressed_vowel = expr:(!stressed vowel !stress) {return _join(expr);} //// FIX: Xorxes' fix for fu'ivla rafsi stress stress = expr:((consonant / glide)* h? y? syllable pause) {return _join(expr);} stressed = expr:(onset [AEIOU]) {return _join(expr);} any_syllable = expr:(onset nucleus coda? / consonantal_syllable) {return _join(expr);} syllable = expr:(onset !y nucleus coda?) {return _join(expr);} //// FIX: preventing {bla'ypre} from being a valid lujvo consonantal_syllable = expr:(consonant &syllabic coda) {return _join(expr);} coda = expr:(!any_syllable consonant &any_syllable / syllabic? consonant? &pause) {return _join(expr);} // onset //////// _maltufa: di'a curmi la'o zoi CgV zoi_20150810UTC onset = expr:(h / consonant? glide / initial) {return _join(expr);} nucleus = expr:(vowel / diphthong / y !nucleus) {return _join(expr);} //_________________________________________________________________ glide = expr:(i / u) &nucleus {return expr;} diphthong = expr:(a i !i / a u !u / e i !i / o i !i) !nucleus {return _join(expr);} vowel = expr:(a / e / i / o / u) !nucleus {return expr;} a = [aA] {return "a";} e = [eE] {return "e";} i = [iI] {return "i";} o = [oO] {return "o";} u = [uU] {return "u";} y = [yY] !nucleus {return "y";} //___________________________________________________________________ cluster = expr:(consonant consonant+) {return _join(expr);} initial_pair = expr:(&initial consonant consonant !consonant) {return _join(expr);} initial = expr:(affricate / sibilant? other? liquid?) !consonant !glide {return _join(expr);} affricate = expr:(t c / t s / d j / d z) {return _join(expr);} liquid = expr:(l / r) {return _join(expr);} other = expr:(p / t !l / k / f / x / b / d !l / g / v / m / n !liquid) {return _join(expr);} sibilant = expr:(c / s !x / (j / z) !n !liquid) {return _join(expr); } consonant = expr:(voiced / unvoiced / syllabic) {return expr;} syllabic = expr:(l / m / n / r) {return expr;} voiced = expr:(b / d / g / j / v / z) {return expr;} unvoiced = expr:(c / f / k / p / s / t / x) {return expr;} // l,m,...,t //////// _maltufa: di'a curmi la'o zoi CgV zoi_20150810UTC l = [lL] !h !l {return "l";} m = [mM] !h !m !z {return "m";} n = [nN] !h !n !affricate {return "n";} r = [rR] !h !r {return "r";} b = [bB] !h !b !unvoiced {return "b";} d = [dD] !h !d !unvoiced {return "d";} g = [gG] !h !g !unvoiced {return "g";} v = [vV] !h !v !unvoiced {return "v";} j = [jJ] !h !j !z !unvoiced {return "j";} z = [zZ] !h !z !j !unvoiced {return "z";} s = [sS] !h !s !c !voiced {return "s";} c = [cC] !h !c !s !x !voiced {return "c";} x = [xX] !h !x !c !k !voiced {return "x";} k = [kK] !h !k !x !voiced {return "k";} f = [fF] !h !f !voiced {return "f";} p = [pP] !h !p !voiced {return "p";} t = [tT] !h !t !voiced {return "t";} h = ['h] &nucleus {return "'";} //___________________________________________________________________ post_word = expr:(pause / !nucleus lojban_word) {return _join(expr);} pause = expr:(space_char+ / EOF) {return _join(expr);} EOF = expr:(!.) {return _join(expr);} non_lojban_word = expr:(!lojban_word non_space+) {return _join(expr);} non_space = expr:(!space_char .) {return _join(expr);} //Unicode_style and escaped chars not compatible with cl_peg space_char = [.\t\n\r?!\u0020] {return "";} // space_char = [.?! ] / space_char1 / space_char2 // space_char1 = ' ' // space_char2 = '' //___________________________________________________________________ spaces = expr:(!Y initial_spaces) {return _join(expr);} initial_spaces = expr:((space_char / !ybu Y)+ EOF? / EOF) {return _join(expr);} ybu = expr:(Y space_char* BU) {return "ybu";} lujvo = expr:(!gismu !fuhivla brivla) {return _node("lujvo", expr);} //___________________________________________________________________ A = &cmavo expr:( a / e / o / u ) &post_word {return ["A", _join(expr)];} BAI = &cmavo expr:( z u h e / z a u / z a i / x a u / v a h u / v a h o / t u h i / t i h u h i / t i h u h e / t i h u h a / t i h u / t i h i / t e h i / t a i / t a h i / s i h a u / s a u / r i h i / r i h a / r a i / r a h i / r a h a / p u h e / p u h a i / p u h a / p o h i / p o h a / p i h o / p a h u / p a h a / n i h i / m u h u / m u h i / m u h a i / m e h e / m e h a / m a u / m a h i / m a h e / l i h i h e / l i h e / l e h a / l a h u / k u h u / k o h o i / k o h a u / k i h u / k i h o i / k i h i / k a i / k a h i / k a h a i / k a h a / j i h u / j i h o / j i h e / j a h i / j a h e / g u h a u / g a u / g a i h i / g a h a / f i h e / f a u / f a h e / d u h o / d u h i / d o h e / d i h o / d e h i h u / d e h i h o / d e h i h i / d e h i h e / d e h i h a / d e h i / c u h u / c i h u / c i h o / c i h e / c a u / c a h i / b e h i / b e h e i / b e h a u / b a u / b a i / b a h i ) &post_word {return ["BAI", _join(expr)];} // //////// _maltufa: zo PEhE di'a selma'o i vimcu zo pe'e ma'oi BAhE_20151019UTC BAhE = &cmavo expr:( z a i h e / z a h e / b a h e i / b a h e ) &post_word {return ["BAhE", _join(expr)];} BE = &cmavo expr:( b e ) &post_word {return ["BE", _join(expr)];} BEI = &cmavo expr:( b e i ) &post_word {return ["BEI", _join(expr)];} BEhO = &cmavo expr:( b e h o ) &post_word {return ["BEhO", _join(expr)];} BIhE = &cmavo expr:( b i h e ) &post_word {return ["BIhE", _join(expr)];} BIhI = &cmavo expr:( m i h i / b i h o / b i h i ) &post_word {return ["BIhI", _join(expr)];} // //////// _maltufa: zo CEhE di'a selma'o i vimcu zo ce'e ma'oi BO_20151019UTC BO = &cmavo expr:( b o ) &post_word {return ["BO", _join(expr)];} BOI = &cmavo expr:( b o i ) &post_word {return ["BOI", _join(expr)];} BU = &cmavo expr:( b u ) &post_word {return ["BU", _join(expr)];} BY = &cmavo expr:( z y / z e h y / z a h u h y / y h y / ybu / x y / x o h y / x o h e h y / x i h i h e i h y / x e i h y / x e h e h y / x a h y / v y / v o h y / v o h e i h a h y / v i h e i h e h y / v a u h a u h o h y / v a i h y / v a h e i h a h y / u y / u i h y / u h y / t y / t u h o h y / t o h a / t e h o h y / t a u h u h y / s y / s u h o i h y / s u h o h y / s u h e h y / s u h a u h y / s u h a i h y / s o i h u h y / s o i h a h y / s o h y / s o h u h y / s o h o h y / s o h i h y / s o h e h y / s o h a h y / s e i h u h e h y / s e h i h i h y / z u h a i / r y / r u h o / r o h y / r o h o i h y / r o h a u h o / r e i h y / r e h y / r a u h y / r a h e h y / p y / p u h e h u h o h y / p i h y / p e i h i h a h y / p a i h y / p a h y / p a h a u h o h y / o h y / n y / n o h y / n o h o h y / n o h e h u h y / n o h a i h y / n i h u h y / n i h e h o i h y / n i h e h e i h y / n a h a / m y / m u h y / m u h i h a i h y / m o h a h y / m e h i h y / m a i h e h e h y / m a h u h y / l y / l o h a / k y / k o i h o h y / k i h o h y / k e i h o h y / k a u h o h y / k a i h o h y / k a h o h y / k a h o h a i h y / k a h e i h a h y / j y / j o h o / j o h a u h o / j i h i h y / j e h o / j a u h y / i y h y / i y / i h y / g y / g o h o h i h a h y / g e h o / g a u h i h o h y / g a i h y / g a h e / g a h a u h y / f y / f u h a h a u h y / f u h a h a i h y / f i h u h y / f e i h y / f a i h u h y / f a i h u h a h y / f a i h e h a u h y / f a i h e h a i h y / e h y / d y / d u h e h y / d a u h y / d a h a h y / c y / c i h y / c i h i h y / c e h i h y / b y / b u h o h e / b i h y / a h y ) &post_word {return ["BY", _join(expr)];} CAhA = &cmavo expr:( b i h a i / c a h a / p u h i / n u h o / k a h e ) &post_word {return ["CAhA", _join(expr)];} CAI = &cmavo expr:( s a i / r u h e / p e i h o / p e i h a / p e i / n i h a u / t e i / n a h o i / m e h a i / m a u h i / d a u h i / d a i h i / c u h i / c a u h i / c a i ) &post_word {return ["CAI", _join(expr)];} CEI = &cmavo expr:( c e i ) &post_word {return ["CEI", _join(expr)];} // //////// _maltufa: zo CEhE di'a selma'o_20151019UTC CEhE = &cmavo expr:( c e h e ) &post_word {return ["CEhE", _join(expr)];} CO = &cmavo expr:( c o ) &post_word {return ["CO", _join(expr)];} COI = &cmavo expr:( v i h o / t a i h i / t a h a / s a u h e i / s a h e i / r e h i / p e h u / o h a i / n u h e / m u h o / m i h e / k i h e / k i h a i / k e h o / j u h i / j o h a u / j e h e / g o i h e / f i h i h e / f i h i / f e h o / f a u h u / d o i h o i / d i h a i / c o i / c o h o i / c o h o / c i h o i / b u h o i / b e h e / a h o i ) &post_word {return ["COI", _join(expr)];} CU = &cmavo expr:( c u ) &post_word {return ["CU", _join(expr)];} CUhE = &cmavo expr:( b a h a u / p u h a u / c u h e / n a u ) &post_word {return ["CUhE", _join(expr)];} DAhO = &cmavo expr:( d a i h o / d o h a i / d a h o ) &post_word {return ["DAhO", _join(expr)];} DOI = &cmavo expr:( d a h e i / d a h o i / d o i ) &post_word {return ["DOI", _join(expr)];} DOhU = &cmavo expr:( d o h u ) &post_word {return ["DOhU", _join(expr)];} FA = &cmavo expr:( f a i / f a / f e / f o / f u / f i h a / f i ) &post_word {return ["FA", _join(expr)];} FAhA = &cmavo expr:( z u h a u / z u h a / z o h i / z o h a / z e h o / v u h a / t o h o / t i h a / t e h e / r u h u / r i h u / r e h o / p a h o / n i h a / n e h u / n e h i / n e h a / g a h u / f a h a / d u h o i / d u h a / c a h u / b e h a ) &post_word &post_word {return ["FAhA", _join(expr)];} FAhO = &cmavo expr:( f a h o ) &post_word {return ["FAhO", _join(expr)];} FEhE = &cmavo expr:( f e h e ) &post_word {return ["FEhE", _join(expr)];} FEhU = &cmavo expr:( f e h u ) &post_word {return ["FEhU", _join(expr)];} FIhO = &cmavo expr:( f i h o ) &post_word {return ["FIhO", _join(expr)];} FOI = &cmavo expr:( f o i ) &post_word {return ["FOI", _join(expr)];} FUhA = &cmavo expr:( f u h a ) &post_word {return ["FUhA", _join(expr)];} FUhE = &cmavo expr:( f u h e i / f u h e ) &post_word {return ["FUhE", _join(expr)];} FUhO = &cmavo expr:( f u h o ) &post_word {return ["FUhO", _join(expr)];} GA = &cmavo expr:( g u h e / g u h i / g u h o / g u h a / g u h u / g e h i / g u / g o / g e / g a ) &post_word {return ["GA", _join(expr)];} GAhO = &cmavo expr:( k e h i / g a h o ) &post_word {return ["GAhO", _join(expr)];} GEhU = &cmavo expr:( g e h u ) &post_word {return ["GEhU", _join(expr)];} GI = &cmavo expr:( g i ) &post_word {return ["GI", _join(expr)];} // GIhA //////// _maltufa: xruti zo gi'i ki'u lo nu na'e sarcu ma'oi GIhI_20150803UTC GIhA = &cmavo expr:( g i h u / g i h o / g i h i / g i h e / g i h a ) &post_word {return ["GIhA", _join(expr)];} // GIhI = &cmavo expr:( g i h i ) &post_word {return ["GIhI", _join(expr)];} //////// _maltufa: vimcu ki'u lo nu na'e sarcu_20150803UTC GOI = &cmavo expr:( v o i h e / p o h u / k u h a u / x u h u / p e / n o h u / n e / g o i ) &post_word {return ["GOI", _join(expr)];} GOhA = &cmavo expr:( c e i h i / g a i h o / x e h u / m o / n e i / g o h u / g o h o / g o h i / n o h a / g o h e / g o h a / d u h u / b u h a / b u h e / b u h i / c o h e ) &post_word {return ["GOhA", _join(expr)];} GOhOI = &cmavo expr:( z e h o i / t a h a i / g o h o i / b o h e i ) &post_word {return ["GOhOI", _join(expr)];} I = &cmavo expr:( i ) &post_word {return ["I", _join(expr)];} IAU = &cmavo expr:( i h a u / i a u ) &post_word {return ["IAU", _join(expr)];} JAI = &cmavo expr:( j a h e i / j a i ) &post_word {return ["JAI", _join(expr)];} JOI = &cmavo expr:( z i h e / y h i / x o i h u / p i h u / k u h a / j u h e / j u / j o i / j e i / j o h e i h i / j o h e i / j o h e / j o / j i h o h e / j i / j e h i / j e / j a / f a h u h a i / f a h u / c e h o i / c e h o / c e h u ) &post_word {return ["JOI", _join(expr)];} // KE //////// _maltufa: zo NUhI je zo NUhU di'a selma'o i zo nu'i muvdu ma'oi NUhI_20150904UTC KE = &cmavo expr:( p i h a i / k e h o i / k e h e i / k e h a i / k e / f e i h u ) &post_word {return ["KE", _join(expr)];} // KEhE //////// _maltufa: zo NUhI je zo NUhU di'a selma'o i zo nu'u muvdu ma'oi NUhU_20150904UTC KEhE = &cmavo expr:( k e h e i h a / k e h e ) &post_word {return ["KEhE", _join(expr)];} KEI = &cmavo expr:( k e i ) &post_word {return ["KEI", _join(expr)];} KI = &cmavo expr:( k e h a ) &post_word {return ["KI", _join(expr)];} KOhA = &cmavo expr:( z u h i h a / z u h i / s e h e / z o h e / z i h o i / z i h o / z a i h o / x a i / v o h u / v o h o / v o h i / v o h e / v o h a / t u h o i / t u / t i / t a / r u / r i h a u / r i / r a / n e i h o / n a u h u / m i h o i / m i h o / m i h a i / m i h a / m i / m a i h i / m a h a / m a / l a u h e / l a u / k o h u / k o h o / k o h i / k o h e / k o h a / k o / k i / k a u h i / k a u h e / k a u h a / f o h u / f o h o / f o h i / f o h e / f o h a / d o h o / d o h i / d o h e i / d o / d i h u / d i h o i / d i h e i / d i h e / d i h a u / d i / d e i h u / d e i h o / d e i h e i / d e i h e / d e i / d e h u / d e h e / d e / d a h u / d a h e / d a h a u / d a h a i / d a / c e / c a h a u / b o h u / b o h o / b o h i / b o h e / b o h a ) &post_word { return ["KOhA", _join(expr)];} KU = &cmavo expr:( k u ) &post_word {return ["KU", _join(expr)];} KUhAU = &cmavo expr:( p o h e ) &post_word {return ["KUhAU", _join(expr)];} KUhE = &cmavo expr:( t e i h u / t e h o i h o i / k u h e ) &post_word {return ["KUhE", _join(expr)];} KUhO = &cmavo expr:( k u h o ) &post_word {return ["KUhO", _join(expr)];} // LA //////// _maltufa: lo cmevla co'u selbrisle : xruti ma'oi LA_20150810UTC LA = &cmavo expr:( l a h e i / z o h a u / l a i / l a h i / l a ) &post_word { return ["LA", _join(expr)]; } LAU = &cmavo expr:( c e h a / l a u h u / b u h u / t u h a ) &post_word {return ["LAU", _join(expr)];} LAhE = &cmavo expr:( z o h e i / v u h i / t a u / t a u h e / l u h o / l u h i / l u h e / l u h a u / l u h a / l a i h e / l a h e h a u / l a h e / d u h a u ) &post_word {return ["LAhE", _join(expr)];} // LE //////// _maltufa: lo cmevla co'u selbrisle : xruti ma'oi LA : vimcu la'o zoi la'ei zo'au lai la'i la zoi_20150810UTC LE = &cmavo expr:( r i h o i / g e i / m o h o i / m e h e i / l o i h i / l o i h e / l o i / l o h i / l o h e i / l o h e / l o / l e i h i / l e i h e / l e i / l e h i / l e h e i / l e h e / l e ) &post_word { return ["LE", _join(expr)];} LEhAI = &cmavo expr:( l e h a i ) &post_word {return ["LEhAI", _join(expr)];} LEhU = &cmavo expr:( l e h u ) &post_word {return ["LEhU", _join(expr)];} LI = &cmavo expr:( l i h e i / l i h a i / m e h o / m a i h o / l i / b o h a i ) &post_word {return ["LI", _join(expr)];} LIhAU = &cmavo expr:( l i h a u ) &post_word {return ["LIhAU", _join(expr)];} LIhU = &cmavo expr:( l i h u ) &post_word {return ["LIhU", _join(expr)];} LOhAI = &cmavo expr:( l o h a i / s a h a i ) &post_word {return ["LOhAI", _join(expr)];} LOhO = &cmavo expr:( l o h o ) &post_word {return ["LOhO", _join(expr)];} LOhOI = &cmavo expr:( l o h o i / p o ) &post_word {return ["LOhOI", _join(expr)];} LOhU = &cmavo expr:( l a h a i / l o h u ) &post_word {return ["LOhU", _join(expr)];} LU = &cmavo expr:( t u h a i / l a h a u / l u ) &post_word {return ["LU", _join(expr)];} LUhEI = &cmavo expr:( l u h e i ) &post_word {return ["LUhEI", _join(expr)];} LUhU = &cmavo expr:( l u h u ) &post_word {return ["LUhU", _join(expr)];} MAhO = &cmavo expr:( m a h o ) &post_word {return ["MAhO", _join(expr)];} MAI = &cmavo expr:( b a h a i / m o h o / m a i ) &post_word {return ["MAI", _join(expr)];} ME = &cmavo expr:( x o h i / n u h a / m e h a u / m e ) &post_word {return ["ME", _join(expr)];} MEhU = &cmavo expr:( m e h u ) &post_word {return ["MEhU", _join(expr)];} MOhE = &cmavo expr:( m o h e / b o i h a u ) &post_word {return ["MOhE", _join(expr)];} MOhI = &cmavo expr:( m o h i ) &post_word {return ["MOhI", _join(expr)];} MOI = &cmavo expr:( m o i h o / m e i / m o i / s i h e / c u h o / v a h e ) &post_word {return ["MOI", _join(expr)];} MUhOI = &cmavo expr:( m u h o i ) &post_word {return ["MUhOI", _join(expr)];} NA = &cmavo expr:( x u h o h e / j a h a / n a / c a u h a ) &post_word {return ["NA", _join(expr)];} NAI = &cmavo expr:( j a h a i / n a i ) &post_word {return ["NAI", _join(expr)];} NAhE = &cmavo expr:( s a i h e / r e i h e / p a i h e / n o i h e / c a i h e / c a u h o h e / c a u h e / j e h a i / n a h e i / t o h e / j e h a / n a h e / n o h e ) &post_word {return ["NAhE", _join(expr)];} NAhU = &cmavo expr:( n a h u ) &post_word {return ["NAhU", _join(expr)];} NIhE = &cmavo expr:( n i h e ) &post_word {return ["NIhE", _join(expr)];} NIhO = &cmavo expr:( n i h o / n o h i ) &post_word {return ["NIhO", _join(expr)];} NOI = &cmavo expr:( v o i h i / p o i h i / p o i / p o h o i / n o i / n o h o i ) &post_word {return ["NOI", _join(expr)];} NU = &cmavo expr:( z u h o / z a h i / s u h u / s i h o / p u h u / v o i / n u / n i h a i / n i / m u h e / l i h i / k a i h u / k a i h e i / k a h e i / k a / j o h u / d u / b u h a i ) &post_word {return ["NU", _join(expr)];} // //////// _maltufa: zo NUhI je zo NUhU di'a selma'o_20150904UTC NUhI = &cmavo expr:( n u h i ) &post_word {return ["NUhI", _join(expr)];} NUhU = &cmavo expr:( n u h u ) &post_word {return ["NUhU", _join(expr)];} PA = &cmavo expr:( z e / z a h u / x o h e / x o / x i h i h e i / x e i / x e h e / x a / v o h e i h a / v o / v i h e i h e / v a u h a u h o / v a i / v a h e i h a / t u h o / t e h o / t a u h u / s u h o i / s u h e / s u / s u h a u / s u h a i / s o i h u / s o i h a / s o h u / s o h o / s o h i / s o h e / s o h a / s o / s e i h u h e / s e h i h i / r o h o i / r o / r e i / r e / r a u / r a h e / p u h e h u h o / p i / p e i h i h a / p a i / p a h a u h o / p a / n o h o / n o h e h u / n o h a i / n o / n i h u / n i h e h o i / n i h e h e i / m u h i h a i / m u / m o h a / m e h i / m a i h e h e / m a h u / k o i h o / k i h o / k e i h o / k a u h o / k a i h o / k a h o h a i / k a h o / k a h e i h a / j i h i / j a u / g o h o h i h a / g a u h i h o / g a i / g a h a u / f u h a h a u / f u h a h a i / f i h u / f e i / f a i h u h a / f a i h u / f a i h e h a u / f a i h e h a i / d u h e / d a u / d a h a / c i h i / c i / c e h i / b i ) &post_word {return ["PA", _join(expr)];} // //////// _maltufa: zo PEhE di'a selma'o_20151019UTC PEhE = &cmavo expr:( p e h e ) &post_word {return ["PEhE", _join(expr)];} PEhO = &cmavo expr:( k e i h a i / p e h o ) &post_word {return ["PEhO", _join(expr)];} PU = &cmavo expr:( b a / p u / c a ) &post_word {return ["PU", _join(expr)];} RAhOI = &cmavo expr:( r a h o i ) &post_word {return ["RAhOI", _join(expr)];} RAhO = &cmavo expr:( r a h o ) &post_word {return ["RAhO", _join(expr)];} ROI = &cmavo expr:( x u h a u / v a h e i / r o i / r e h u / m u h e i / d e h e i / b a h o i ) &post_word {return ["ROI", _join(expr)];} SE = &cmavo expr:( x o h a i / x e / v o h a i / v e / t o h a i / t e / t a u h o / s u h e i / s e h u h o / s e h o h e / s e / r e h a u h e ) &post_word {return ["SE", _join(expr)];} // SEI //////// _maltufa: xruti ma'oi SOI_20150723UTC SEI = &cmavo expr:( t i h o / s e i / p o i h a / n o i h a / l e h a u / c e i h e ) &post_word {return ["SEI", _join(expr)];} SEhU = &cmavo expr:( x e h a u / s e h u ) &post_word {return ["SEhU", _join(expr)];} SI = &cmavo expr:( z e h e i / z e i / s i h u h i / s i ) &post_word {return ["SI", _join(expr)];} // SOI //////// _maltufa: xruti ma'oi SOI_20150723UTC SOI = &cmavo expr:( s o i ) &post_word {return ["SOI", _join(expr)];} SU = &cmavo expr:( s u h o ) &post_word {return ["SU", _join(expr)];} TAhE = &cmavo expr:( d e i h a / z e h a i / z e i h a / r u h i / t a h e / d i h i / n a h o ) &post_word {return ["TAhE", _join(expr)];} TEhU = &cmavo expr:( t e h u / k u h o i h u ) &post_word {return ["TEhU", _join(expr)];} TEI = &cmavo expr:( n e h e ) &post_word {return ["TEI", _join(expr)];} TO = &cmavo expr:( t o h i / t o / n o i h i / m a u h e ) &post_word {return ["TO", _join(expr)];} TOI = &cmavo expr:( t o i / m a u h o / g e h u h i ) &post_word {return ["TOI", _join(expr)];} TUhE = &cmavo expr:( t u h e ) &post_word {return ["TUhE", _join(expr)];} TUhU = &cmavo expr:( t u h u ) &post_word {return ["TUhU", _join(expr)];} UI = &cmavo expr:( z u h u / z o h o / z i h a i / z i h a / z a i h a / z a h a / x y h y / x u h u h i / x u / x o h o / x a u h o h o / x a u h e h o / x a i h a / x a h i / x a h a h a / x a h a / v u h e / v e i h i / v a h i / u u / u o / u i / u h u / u h o / u h i / u h e / u h a i / u h a / u e i h e / u e h i / u e / u a u / u a i / u a / t o i h o / t o i h e / t o h u / t i h e / t e h i h o / t a h u / t a h o i / t a h o / t a h e i / s u h a / s i h u / s i h a / s e i h i / s e h o / s e h i / s e h a / s a h u / s a h e / s a h a / s a / r u h a / r o h u / r o h o / r o h i / r o h e / r o h a / r i h e / r e h e / r a h u / r a h i h a u / p o h o / p e i h e / p e h i / p e h a i / p e h a / p a u / p a h e / o i h u / o i h o / o i h a / o i / o h u / o h o / o h i / o h e / o h a / n e h a u / n a h i / m u h a / m o i h i / m i h u / m a u h u / l i h o i / l i h o / l i h a / l e h o / l a i h i / l a h a / k u h i / k o i h e / k o i / k i h a h a u h u h a u h i / k i h a / k e h u / k e h e h u / k a u / k a i h e / k a i h a / k a h u / j u h o i / j u h o / j u h a / j o h a / j i h e i / j i h a u / j i h a / j e i h u / j e h u / j e h a u / j a h o / i u / i o / i i / i h u / i h o / i h i / i h e / i h a / i e h i / i e / i a h u / i a / g e h e i / g e h e / g a h i / f u h i / f u h e i h u / f u h e i h o / f u h e i h i / f u h e i h e / f u h e i h a / f u h a u / f a i h a / e i / e h u / e h o / e h i / e h e / e h a / d o i h a / d o h a / d e h o i / d e h a u / d e h a i / d a u h a / d a i / d a h i / c u h e i h u / c u h e i h o i / c u h e i h o / c u h e i h i / c u h e i h e i / c u h e i h e / c u h e i h a i / c u h e i h a / c u h e i / c i h a u h u h a u h i / c i h a i / c a h e / b u h o / b u h a h a / b o h o i / b i h u / b i h a / b e h u / b a h u / b a h a / a u h u / a u / a i / a h u / a h o / a h i / a h e / a h a ) &post_word {return ["UI", _join(expr)];} VA = &cmavo expr:( v i / v a / v u ) &post_word {return ["VA", _join(expr)];} VAU = &cmavo expr:( v a u ) &post_word {return ["VAU", _join(expr)];} VEI = &cmavo expr:( v e i ) &post_word {return ["VEI", _join(expr)];} VEhO = &cmavo expr:( v e h o ) &post_word {return ["VEhO", _join(expr)];} VUhU = &cmavo expr:( z i h a h o / z a h e i / x o h e i / v u h u / v o h a u h u / v i h o i h a u / v a h a / t o h e i h a u / t e h a u h u / t e h a u / t e h a / t a i h i h e / t a i h e h i / s u h i / s i h o i h e / s i h i / s e h i h a h o / s a h o / s a h i / r i h o / r e h a / p i h i / p i h e i h o i / p i h e i h a u / p i h e / p i h a / p a u h o i / p a u h e i / p a u h a h u / p a h i / n i h a h a u / n e h o i / n e h o / m e h e i h o / m a h o h e / k u h a u h a / k e i h i / k e i h a u / k a h o h e i / k a h a u / j u h u / j o i h i / j o h i / j a u h a u / j a h o i / g u h a u h i / g u h a i / m o i h o i / g e h a / g a h u h a u / f u h u / f e h i / f e h a u h u / f e h a / f a u h a u / f a h i / f a h a u / f a h a i / d u h e i / d i h e i h o h a u / d e i h a u h o / d e h o / d e h a u h u / d a h a h a u / c u h a u h e i / c u h a i / c u h a / c i h a i h u / b o i h a i / b e h e i h o i / b a i h i / b a i h e i ) &post_word {return ["VUhU", _join(expr)];} VEhA = &cmavo expr:( v e h u / v e h a / v e h i / v e h e ) &post_word {return ["VEhA", _join(expr)];} VIhA = &cmavo expr:( v i h i / v i h a / v i h u / v i h e ) &post_word {return ["VIhA", _join(expr)];} VUhO = &cmavo expr:( v u h o ) &post_word {return ["VUhO", _join(expr)];} XI = &cmavo expr:( x i h i / x i h e / x i / t e h a i / f a u h e ) &post_word {return ["XI", _join(expr)];} XOI = &cmavo expr:( x o i / f i h o i ) &post_word {return ["XOI", _join(expr)];} Y = &cmavo expr:( y+ ) &post_word {return _join(expr);} ZAhO = &cmavo expr:( x o h u / x a h o / c o h i / p u h o / c o h u / m o h u / c a h o / c o h a / d e h a / b a h o / d i h a / z a h o ) &post_word {return ["ZAhO", _join(expr)];} ZEhA = &cmavo expr:( z e h u / z e h a / z e h i / z e h e ) &post_word {return ["ZEhA", _join(expr)];} ZI = &cmavo expr:( z a h a i / z u / z a / z i ) &post_word {return ["ZI", _join(expr)];} ZO = &cmavo expr:( z o / r a h a i / m a h o i ) &post_word {return ["ZO", _join(expr)];} ZOI = &cmavo expr:( z o i / l a h o ) &post_word {return ["ZOI", _join(expr)];} ZOhU = &cmavo expr:( z o h u / k e h a u / g e h a i / c e h a i ) &post_word {return ["ZOhU", _join(expr)];} // //////// _cekitaujeizai: (ce'u ce) (ke'a ki) (tu'a tau) (jo'u jei) (du'u du) (su'o su) (bu'u zai) (ko'oi koi) (si'au si'u) (zu'ai se'e) (moi'oi gei) (lau'u lau) (poi'i voi) (xu'u po) (ku'au po'e) (ne'e tei)_ // //////// _cekitaujeizai: ju'a lo'u (mo'oi ge) (i'au go) (zo'u go) (moi'oi