// camxes.js.peg // Copyright (c) 2013, 2014 Masato Hagiwara // https://github.com/mhagiwara/camxes.js // // camxes.js can be used, modified, and re-distributed under MIT license. // See LICENSE for the details. // //////// _la guskant cu co'a galfi_20150604 // 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'; } } // //////// _vimcu ro zoi zoi comma zoi imu'ibo ri zukte noda i fau ku stika tu'a la'o zoi preproc.js zoi_20150806UTC // text //////// _vimcu lo pa cfila i galfi zoizoi si_clause? zoi zoizoi intro_si_clause zoi i jalge fa lo nu zoizoi idasibroda zoi zoizoi dasibroda zoi dunli lo ka stura_20150807UTC // text //////// _galfi zoizoi intro_si_clause zoi zoizoi si_clause? SI_clause* zoi tezu'e lo go'i je lo nu curmi lo nu zo si du'e mei_20150810UTC text = expr:(intro_null free* paragraphs? si_clause? SI_clause* faho_clause EOF?) {return _node_nonempty("text", expr);} // intro_null //////// _vimcu lo pa cfila i vimcu zoizoi intro_si_clause zoi i jalge fa lo nu zoizoi idasibroda zoi zoizoi dasibroda zoi dunli lo ka stura_20150807UTC // intro_null //////// _jmina zoizoi (!paragraphs si_clause SI_clause*)? zoi tezu'e lo go'i je lo nu curmi lo nu zo si du'e mei_20150810UTC intro_null = expr:(spaces? su_clause* (!paragraphs si_clause SI_clause*)?) {return _node_nonempty("intro_null", expr); } // intro_si_clause = expr:(si_clause? SI*) {return _node_nonempty("intro_si_clause", expr); } //////// _tu'a ti co'a na'e sarcu i vimcu_20150810UTC 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 // // // curmi lu niho je li'u pei // // // mu'a la oz cu se pagbu lo'u ni'o ca bo le'u i ku'i la paragraf cu se pagbu la fragment ji'a i ma'i lo logji saske cu na'e xambu fa lo nu lo na'e ka'e ckaji be lo ka jetnu cu simxu co jorne fi lo jonma'o i frica lo sedu'u sumti jorne ku noi ka'e se tamgau fi lo sedu'u jufra jorne i jdice lo du'u na curmi paragraphs = expr:((NIhO_clause+ paragraph?)+ / paragraph (NIhO_clause+ paragraph?)*) {return _node("paragraphs", expr);} paragraph = expr:((I_clause (statement_terms / fragment)?)+ / (statement_terms / fragment) (I_clause (statement_terms / fragment)?)*) {return _node("paragraph", expr);} // // // la'a zo VAU na'e se nitcu isemu'i bo na'e la'o zoi tail_terms zoi cu se lidne statement_terms = expr:(statement IAU_elidible terms?) {return _node("statement_terms", expr);} statement = expr:(statement_1 / prenex statement) {return _node("statement", expr);} statement_1 = expr:(statement_2 (I_clause joik statement_2)*) {return _node("statement_1", expr);} statement_2 = expr:(statement_3 (I_clause joik? tag? BO_clause statement_3)*) {return _node("statement_2", expr);} statement_3 = expr:(sentence / tag? TUhE_clause paragraphs TUhU_elidible / gek_statement) {return _node("statement_3", expr);} // // // ganai da'i curmi lo nu la gek lidne no gik gi lu ga ra broda gi ri brode li'u na se genturfa'i iki'ubo lo nu zo ga kuspe zo ra po'o i ka'e stika sepi'o zoi zoi !term zoi mu'a i ku'i lo gerna cu co'a no'e sampu gek_statement = expr:(gek statement (gik statement)+ GIhI_elidible) {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 //////// _vimcu lo cfila pe la zantufa xisu'o0.6: i galfi zoi zoi joik zoi zoizoi !terms joik zoi tezu'e lo nu genturfa'i lu joigiragiri li'u_20150819UTC_ fragment = expr:(prenex / !terms joik / ek / gihek / NA_clause !terms !KU / terms VAU_elidible !mex / mex / relative_clauses / links / linkargs) {return _node("fragment", expr);} prenex = expr:(terms ZOhU_clause) {return _node("prenex", expr);} sentence = expr:(terms? (CU_elidible bridi_tail / gek sentence (gik sentence)+ GIhI_elidible)) {return _node("sentence", expr);} bridi_tail = expr:(bridi_tail_1 (joik_gihek tag? CU_elidible bridi_tail_1)*) {return _node("bridi_tail", expr);} bridi_tail_1 = expr:(bridi_tail_2 (joik_gihek !(tag? BO_clause) !(tag? KE_clause) CU_elidible bridi_tail_2 tail_terms)*) {return _node("bridi_tail_1", expr);} bridi_tail_2 = expr:(bridi_tail_3 (joik_gihek tag? BO_clause CU_elidible bridi_tail_3 tail_terms)*) {return _node("bridi_tail_2", expr);} bridi_tail_3 = expr:(KE_clause !(selbri_2 KEhE) bridi_tail KEhE_elidible tail_terms / selbri tail_terms / gek_bridi_tail) {return _node("bridi_tail_3", expr);} // // // za'a nitcu fa zoizoi / tag* KE_clause free* gek_bridi_tail KEhE_elidible free* / NA_clause free* gek_bridi_tail zoi gek_bridi_tail = expr:(gek bridi_tail (gik bridi_tail)+ GIhI_elidible tail_terms / tag* KE_clause gek_bridi_tail KEhE_elidible / NA_clause gek_bridi_tail) {return _node("gek_bridi_tail", expr);} //// EXP-FIX: tag? KE --> tag* KE //// EXP: Bridi-tail nonabsorbable terms implementation tail_terms = expr:(term* VAU_elidible) {return _node_nonempty("tail_terms", expr); } // // // aunai curmi lo'u terms joi terms le'u ki'u lo nu na'e sarcu fa lo nu jimpe fi lo'u ke gauku naku ke'e je ke faku caku ke'e le'u i ei la joik cu pagbu la term jenai la terms iji'a ganai da'i tezu'e lo nu sampu kei la term cu curmi tu'a zoizoi joik_ek? zoi gi lo drata ke gerna pagbu cu co'u plixau mu'u ra'ai goi terms = expr:(term+) {return _node("terms", expr);} /*** EXP-SELBRITCITA-FIX ***/ term = expr:(term_1 (joik_ek term_1)*) {return _node("term", expr);} term_1 = expr:(term_2 (joik_ek? BO_clause term_2)*) {return _node("term_1", expr);} term_2 = expr:(XOI_clause statement SEhU_elidible / KE_clause term+ KEhE_elidible / tag_term / !tag sumti / NA_clause !bridi_tail KU_elidible / gek_term) {return _node("term_2", expr);} // tag_term //////// _la'o zoi tanru_unit_2 zoi binxo la'o zoi tanru_unit_1 zoi_20150810UTC tag_term = expr:(!gek (tag !(!tag selbri) !gek_bridi_tail / FA_clause (joik FA_clause)* !tanru_unit_1) (sumti / KU_elidible)) {return _node("tag_term", expr);} /*** END EXP-SELBRITCITA-FIX ***/ gek_term = expr:(gek term+ (gik term+)+ GIhI_elidible) {return _node("gek_term", expr);} /*** EXP-SELBRITCITA-FIX ***/ /*** END EXP-SELBRITCITA-FIX ***/ sumti = expr:(sumti_1 (VUhO_clause 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? tag? BO_clause sumti_3)*) {return _node("sumti_2", expr);} sumti_3 = expr:(KE_clause sumti KEhE_elidible / sumti_4 / gek sumti (gik sumti)+ GIhI_elidible) {return _node("sumti_3", expr);} sumti_4 = expr:(quantifier? sumti_5 relative_clauses? / quantifier selbri KU_elidible relative_clauses?) {return _node("sumti_4", expr);} // // // !(!joik_ek operator) : tu'a zoizoi !joik_ek zoi cu sarcu lo nu lu by joi (vei) pa (ve'o) by li'u cu sumti sumti_5 = expr:(RAhOI_clause / ZO_clause / ZOI_clause / LOhU_clause / lerfu_string BOI_elidible !(BO_clause* operand* !(joik_ek sumti) operator) !(operand KEhE) / LU_clause text LIhU_elidible / (LAhE_clause / NAhE_clause BO_clause) relative_clauses? sumti LUhU_elidible / KOhA_clause / LOhOI_clause (joik LOhOI_clause)* statement KUhAU_elidible / LE_clause sumti_tail KU_elidible / li_clause / NAhE_clause sumti_3) {return _node("sumti_5", expr);} li_clause = expr:(LI_clause mex LOhO_elidible) {return _node("li_clause", expr); } sumti_tail = expr:((sumti_5 relative_clauses?)? sumti_tail_1 / relative_clauses sumti_tail_1) {return _node("sumti_tail", expr); } // sumti_tail_1 //////// _vimcu zoizoi relative_clauses? zoi ki'u lo nu vo'e co'a pagbu la'o zoi selbri_1 zoi_20150810UTC // sumti_tail_1 //////// _galfi zoizoi selbri / quantifier selbri zoi zoizoi quantifier? selbri zoi_20150811UTC sumti_tail_1 = expr:(quantifier? selbri / quantifier sumti) {return _node("sumti_tail_1", expr);} relative_clauses = expr:(relative_clause (joik? relative_clause)*) {return _node("relative_clauses", expr); } relative_clause = expr:(GOI_clause term GEhU_elidible / NOI_clause statement KUhO_elidible) {return _node("relative_clause", expr); } // selbri //////// _gau melbi: zoizoi NA_clause selbri zoi muvdu ti la'o zoi selbri_1 zoi i jalge fa tu'a zoizoi selbri_1 / !gek tag selbri / NA_clause selbri zoi_20150810UTC // selbri //////// _galfi zoizoi !gek tag selbri zoi zoizoi tag selbri zoi ki'u lo nu za'a co'u nabmi fi tu'a lu pugi broda gi brode i gipu broda gi brode li'u_20150819UTC_ selbri = expr:(selbri_1 / tag selbri / NA_clause selbri) {return _node("selbri", expr); } // selbri_1 //////// _ma'oi CEI cu .ei jongau lo selbri jenai lo selbrisle i jmina zoizoi (CEI_clause selbri)* zoi_20150810UTC // selbri_1 //////// _jmina zoizoi relative_clauses? zoi_20150810UTC // selbri_1 //////// _gau melbi: zoizoi NA_clause selbri zoi muvdu la'o zoi selbri zoi_20150810UTC selbri_1 = expr:(selbri_2 relative_clauses? (CEI_clause selbri)*) {return _node("selbri_1", expr); } selbri_2 = expr:(selbri_3 (CO_clause 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); } // // // xu lo sumti ja lo term zo'u gauku zo BO tsamau lo'u joi bo le'u sei la selbri_5 joi la selbri_6 cu se simsa selbri_5 = expr:(selbri_6 (joik tag? BO_clause selbri_6)*) {return _node("selbri_5", expr); } selbri_6 = expr:(tanru_unit (BO_clause tanru_unit)*) {return _node("selbri_6", expr); } // tanru_unit = expr:(tanru_unit_1 (CEI_clause tanru_unit_1)*) {return _node("tanru_unit", expr); } //////// _ma'oi CEI cu .ei jongau lo selbri jenai lo selbrisle i vimcu_20150810UTC // tanru_unit_1 //////// _ma'oi CEI cu .ei jongau lo selbri jenai lo selbrisle i binxo la'o zoi tanru_unit zoi_20150810UTC // tanru_unit //////// _la'o zoi tanru_unit_2 zoi binxo la'o zoi tanru_unit_1 zoi_20150810UTC tanru_unit = expr:(tanru_unit_1 linkargs?) {return _node("tanru_unit", expr); } // tanru_unit_2 //////// _la'o zoi tanru_unit_2 zoi binxo la'o zoi tanru_unit_1 zoi_20150810UTC // tanru_unit_1 //////// _jmina zoizoi MUhOI_clause zoi_20150819UTC_ tanru_unit_1 = expr:(CMEVLA_clause / BRIVLA_clause / GOhA_clause / KE_clause selbri_2 KEhE_elidible / NAhE_clause? gek selbri_2 (gik selbri_2)+ !term GIhI_elidible / MUhOI_clause / GOhOI_clause / ME_clause (sumti / operator+ / mex / tag) MEhU_elidible MOI_clause? / mex MOI_clause / (FA_clause (joik FA_clause)* / SE_clause) tanru_unit_1 / JAI_clause tag? tanru_unit_1 / NAhE_clause tanru_unit_1 / NU_clause (joik NU_clause)* statement KEI_elidible) {return _node("tanru_unit_1", expr); } linkargs = expr:(BE_clause term links? BEhO_elidible) {return _node("linkargs", expr);} links = expr:(BEI_clause term links?) {return _node("links", expr);} quantifier = expr:(!sumti_5 !selbri mex relative_clauses?) {return _node("quantifier", expr); } // // // ganai da'i curmi tu'a zoizoi mex_1* zoi gi me zoizoi ([by BOI] [su'i {re BOI} {by BOI}] VEhO) zoi i xauzma fa zoizoi ([{ VEhO} {by BOI}] VAU) zoi i ku'i va'o tu'a zoizoi VEI_clause? zoi tu'a zo ve'o cu se curmi i ku'i na'e melbi mex = expr:(mex_1 (operator+ mex_1?)*) {return _node("mex", expr); } // // // operator+ : // // // ([pa BOI] [pi'i pi'i] [pa BOI]) // // // ([pa BOI] [pi'i {pe'o pi'i KUhE}]) mex_1 = expr:((KE_clause mex_2+ KEhE_elidible / mex_2 (BO_clause mex_2)*) (BIhE_clause operator+ (KE_clause mex_2+ KEhE_elidible / mex_2 (BO_clause mex_2)*)?)*) {return _node("mex_1", expr); } mex_2 = expr:(operand / mex_rp / mex_forethought) {return _node("mex_2", expr); } mex_rp = FUhA_clause mex_2+ operator (mex_2* operator)* KUhE_elidible // This is just to make for clearer parse trees mex_forethought = !(lerfu_string BOI_elidible) operator mex_2+ mex_forethought? KUhE_elidible / PEhO_clause operator mex_2+ mex_forethought? KUhE_elidible // Right recursive version. operator = expr:(SE_clause operator / NAhE_clause operator / MAhO_clause (mex / selbri / sumti) TEhU_elidible / VUhU_clause / joik_ek) {return _node("operator", expr); } // // // (na'e (pa da)) , (vei (na'e pa)) da // // // la'a na nitcu lo'u mo'e operand te'u le'u iki'ubo lu vu'u tu'o li'u mekso operand = expr:(number BOI_elidible / lerfu_string BOI_elidible / VEI_clause mex VEhO_elidible / MOhE_clause (selbri / sumti) TEhU_elidible / (LAhE_clause / NAhE_clause BO_clause) mex LUhU_elidible / NAhE_clause operand) {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) {return _node("ek", expr); } gihek = expr:(NA_clause? SE_clause? GIhA_clause) {return _node("gihek", expr); } joik = expr:(GAhO_clause? NA_clause? SE_clause? JOI_clause GAhO_clause?) {return _node("joik", expr); } joik_ek = expr:(joik / ek) {return _node("joik_ek", expr); } joik_gihek = expr:(joik / gihek) {return _node("joik_gihek", expr); } gek = expr:(SE_clause? GA_clause / GI_clause (joik / tag) (BO_clause)? / (joik / tag) GI_clause (BO_clause)?) {return _node("gek", expr); } gik = expr:(GI_clause) {return _node("gik", expr); } tag = expr:(tcita_selci+ (joik tcita_selci+)*) {return _node("tag", expr); } tcita_selci = expr:((NAhE_clause / SE_clause) tcita_selci / BAI_clause / mex ROI_clause / FIhO_clause selbri FEhU_elidible) {return _node("tcita_selci", expr); } // free //////// _galfi zoizoi selbri relative_clauses? zoi zoizoi selbri zoi ki'u lo nu zoizoi relative_clauses? zoi co'a pagbu la'o zoi selbri_1 zoi_20150810UTC free = expr:(SEI_clause statement SEhU_elidible / vocative relative_clauses? selbri DOhU_elidible / vocative sumti? DOhU_elidible / mex_2 MAI_clause / TO_clause text TOI_elidible / xi_clause / LOhAI_clause / (UI_clause !BU_clause)+) {return _node("free", expr); } xi_clause = expr:(XI_clause mex_2) {return _node("xi_clause", expr); } vocative = expr:(COI_clause+) {return _node("vocative", 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+ lerfu_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 free*) {return _node_nonempty("post_clause", expr); } number_post_clause = expr:(spaces? !BU_clause (!number free)*) {return _node_nonempty("number_post_clause", expr); } lerfu_post_clause = expr:(spaces? !BU_clause (!lerfu_string free)*) {return _node_nonempty("lerfu_post_clause", expr); } vocative_post_clause = expr:(spaces? !BU_clause (!vocative free)*) {return _node_nonempty("vocative_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 //////// _galfi zoi ly ZOI ly zoi ly (ZOI / MUhOI) ly_20150819UTC_ 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);} 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 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);} 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 // 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 = lerfu_post_clause // specifies actualitypotentiality of tense // afterthought intensity marker // 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 // 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 = vocative_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 // cancel anaphoracataphora assignments // 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 // 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 // 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 // close long scope for indicator // 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); } GIhI_pre = pre_clause GIhI spaces? GIhI_post = post_clause // 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 // 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 // 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 // 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 // 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 // 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: jmina la'o zoi MUhOI_clause, MUhOI_pre, MUhOI_post zoi_20150819UTC_ 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 // 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 // change selbri to operand; inverse of MOI // 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 // marks the start of a termset // marks the middle and end of a termset // 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 = number_post_clause // afterthought termset connective prefix // 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 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 // 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 // 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 // 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 // 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 // space_time dimensionality marker 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 // lujvo glue // time distance tense // 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 //////// _jmina zoizoi MUhOI zoi_20150819UTC_ CMAVO = expr:(A / BAI / BAhE / BE / BEI / BEhO / BIhE / BO / BOI / BU / BY / CEI / CO / COI / CU / DOhU / FA / FAhO / FEhU / FIhO / FOI / FUhA / GA / GAhO / GEhU / GI / GIhA / GIhI / GOI / GOhA / GOhOI / I / IAU / JAI / JOI / KE / KEhE / KEI / KOhA / KU / KUhAU / KUhE / KUhO / LAU / LAhE / LEhAI / LE / LEhU / LI / LIhU / LOhAI / LOhO / LOhOI / LOhU / LU / LUhU / MAhO / MAI / ME / MEhU / MOhE / MOI / MUhOI / NA / NAhE / NIhO / NOI / NU / PA / PEhO / RAhOI / ROI / SE / SEI / SEhU / SI / SU / TEhU / TEI / TO / TOI / TUhE / TUhU / UI / VAU / VEI / VEhO / VUhU / VUhO / XI / XOI / 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 //////// _vimcu zoizoi / digit zoi iki'ubo la digit cu se galfi la'o zoi preproc.js zoi_20150806UTC zifcme = (!h (nucleus / glide / h / consonant !pause)* consonant &pause) // jbocme //////// _vimcu zoizoi / digit zoi iki'ubo la digit cu se galfi la'o zoi preproc.js zoi_20150806UTC 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 //////// _vimcu zoizoi / digit zoi iki'ubo la digit cu se galfi la'o zoi preproc.js zoi_20150806UTC 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 //////// _galfi zoizoi &consonant zoi zoizoi consonantal_syllable* !h zoi sei la mezohe cu stika to zoizoi https://github.com/Ilmen-vodhr/ilmentufa/commit/9ae16d8cd6ef5f47bf5e4f740e75f321dd828226 zoi toi_20150810UTC stressed_fuhivla_rafsi = expr:(fuhivla_head stressed_syllable consonantal_syllable* !h onset y) { return _join(expr); } // fuhivla_rafsi //////// _galfi zoizoi &consonant zoi zoizoi !h zoi sei la mezohe cu stika to zoizoi https://github.com/Ilmen-vodhr/ilmentufa/commit/9ae16d8cd6ef5f47bf5e4f740e75f321dd828226 zoi toi_20150810UTC 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 //////// _jmina zoizoi / glide zoi sei la mezohe cu stika to zoizoi https://github.com/Ilmen-vodhr/ilmentufa/commit/9ae16d8cd6ef5f47bf5e4f740e75f321dd828226 zoi toi_20150810UTC 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 = expr:(h / glide / initial) {return _join(expr);} nucleus = expr:(vowel / diphthong / y !nucleus) {return _join(expr);} //_________________________________________________________________ glide = expr:(i / u) &nucleus {return expr;} // diphthong //////// _xu tu'a zoizoi !glide zoi sarcu i la'a lu zo oiia li'u je lu zo oiua li'u je lu zo oiian li'u cu na raktu i ei jalge fa tu'a lu zo oi ia li'u je lu zo oi ua li'u je lu zo oiian li'u mu'a i cipra_20150806UTC // diphthong //////// _pe'i da na'e ka'e te frica lu aian li'u zoizoi aiian li'u isemu'ibo galfi fi zoizoi (a i !i / a u !u / e i !i / o i !i) !nucleus zoi sei la mezohe cu stika to zoizoi https://github.com/Ilmen-vodhr/ilmentufa/commit/9ae16d8cd6ef5f47bf5e4f740e75f321dd828226 zoi toi_20150810UTC 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 = [lL] !h !glide !l {return "l";} m = [mM] !h !glide !m !z {return "m";} n = [nN] !h !glide !n !affricate {return "n";} r = [rR] !h !glide !r {return "r";} b = [bB] !h !glide !b !unvoiced {return "b";} d = [dD] !h !glide !d !unvoiced {return "d";} g = [gG] !h !glide !g !unvoiced {return "g";} v = [vV] !h !glide !v !unvoiced {return "v";} j = [jJ] !h !glide !j !z !unvoiced {return "j";} z = [zZ] !h !glide !z !j !unvoiced {return "z";} s = [sS] !h !glide !s !c !voiced {return "s";} c = [cC] !h !glide !c !s !x !voiced {return "c";} x = [xX] !h !glide !x !c !k !voiced {return "x";} k = [kK] !h !glide !k !x !voiced {return "k";} f = [fF] !h !glide !f !voiced {return "f";} p = [pP] !h !glide !p !voiced {return "p";} t = [tT] !h !glide !t !voiced {return "t";} h = ['h] &nucleus {return "'";} //___________________________________________________________________ // digit = expr:([0123456789] !h !nucleus) {return _join(expr);} //////// _vimcu iki'ubo la digit cu se galfi la'o zoi preproc.js zoi_20150806UTC post_word = expr:(pause / !nucleus lojban_word) {return _join(expr);} pause = expr:(space_char+ / EOF) {return _join(expr);} // // // za'a sarcu EOF = expr:(!.) {return _join(expr);} // comma = [,] {return "";} //////// _vimcu imu'ibo zukte noda_20150806UTC non_lojban_word = expr:(!lojban_word non_space+) {return _join(expr);} // // // mamukti 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 //////// _+gai'i +ki'oi +mu'ai +po'a +pu'ai +xo'u_20150820UTC_ BAI = &cmavo expr:( z u h e / z u h a u / z u h a / z u / z o h i / z o h a / z i / z e i h a / z e h u / z e h o / z e h i / z e h e / z e h a i / z e h a / z a u / z a i / z a h o / z a h a i / z a / x o h u / x a u / x a h o / v u h a / v u / v i h u / v i h i / v i h e / v i h a / v i / v e h u / v e h i / v e h e / v e h a / v a h u / v a h o / v a / t u h i / t o h o / 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 i h a / t e h i / t e h e / t a i / t a h i / t a h e / s i h a u / s a u / r u h u / r u h i / r i h u / r i h i / r i h a / r e h o / r a i / r a h i / r a h a / p u h o / p u h i / p u h e / p u h a u / p u h a i / p u h a / p u / p o h i / p o h a / p i h o / p a h u / p a h o / p a h a / n u h o / n i h i / n i h a / n e h u / n e h i / n e h a / n a u / n a h o / m u h u / m u h a i / m u h i / m o h u / 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 e h a / k a i / k a h i / k a h e / 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 u / g a h a / f i h e / f a u / f a h e / f a h a / d u h o i / d u h o / d u h i / d u h a / d o h e / d i h o / d i h i / d i h a / d e i h a / 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 / d e h a / c u h u / c u h e / c o h u / c o h i / c o h a / c i h u / c i h o / c i h e / c a u / c a h u / c a h o / c a h i / c a h a / c a / b i h a i / b e h i / b e h e i / b e h a u / b e h a / b a u / b a i / b a h o / b a h i / b a h a u / b a ) &post_word {return ["BAI", _join(expr)];} // BAhE //////// _+ba'ei_20150820UTC_ BAhE = &cmavo expr:( z a i h e / z a h e / p e 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)];} BO = &cmavo expr:( c e h e / 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 //////// _vimcu zoizoi / digit h y zoi iki'ubo la digit cu se galfi la'o zoi preproc.js zoi_20150806UTC // BY //////// _+xe'e'y_20150820UTC_ // BY //////// _+iy'y +jo'au'o +ro'au'o_20150820UTC_ // BY //////// _+fai'e'ai'y +su'ai'y +su'au'y_20150820UTC_ 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)];} CEI = &cmavo expr:( c e i ) &post_word {return ["CEI", _join(expr)];} CO = &cmavo expr:( c o ) &post_word {return ["CO", _join(expr)];} // COI //////// _+goi'e_20150820UTC_ 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 o i / d i h a i / d a h o i / d a h e 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)];} 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)];} FAhO = &cmavo expr:( f a h o ) &post_word {return ["FAhO", _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)];} 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 = &cmavo expr:( g i h e / g i h o / g i h a / g i h u ) &post_word {return ["GIhA", _join(expr)];} GIhI = &cmavo expr:( g i h i ) &post_word {return ["GIhI", _join(expr)];} // GOI //////// _+voi'e_20150820UTC_ 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 //////// _+bo'ei_20150820UTC_ 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 //////// _+ji'o'e +y'i_20150820UTC_ JOI = &cmavo expr:( z i h e / y h i / x o i h u / p i h u / m i h i / 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 / b i h o / b i h i ) &post_word {return ["JOI", _join(expr)];} // KE //////// _+ke'ai +ke'ei +ke'oi_20150820UTC_ KE = &cmavo expr:( p i h a i / n u h 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 //////// _+ke'ei'a_20150820UTC_ KEhE = &cmavo expr:( n u h u / 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)];} // KOhA //////// _+bo'a +bo'e +bo'i +bo'o +bo'u +ca'au +tu'oi +zi'oi_20150820UTC_ 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 //////// _+te'oi'oi +tei'u_20150820UTC_ 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)];} 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 //////// _+la'e'au +tau'e_20150820UTC_ 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 //////// _+lei'e +loi'e_20150820UTC_ LE = &cmavo expr:( z o h a u / 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 / l a i / l a h i / l a h e i / l a ) &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 //////// _+bo'ai +li'ei +mai'o_20150820UTC_ LI = &cmavo expr:( m e h o / m a i h o / l i h e i / l i h a i / l i / b o h a i ) &post_word {return ["LI", _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)];} LUhU = &cmavo expr:( l u h u ) &post_word {return ["LUhU", _join(expr)];} MAhO = &cmavo expr:( n a h u / 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 //////// _+boi'au_20150820UTC_ MOhE = &cmavo expr:( n i h e / m o h e / b o i h a u ) &post_word {return ["MOhE", _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)];} // //////// _jmina ma'oi MUhOI_20150819UTC_ MUhOI = &cmavo expr:( m u h o i ) &post_word {return ["MUhOI", _join(expr)];} // NA //////// _+cau'a_20150820UTC_ 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)];} // NAhE //////// _+cau'e_20150820UTC_ NAhE = &cmavo expr:( t o h e / s a i h e / r e i h e / p a i h e / n o i h e / n o h e / n a h e i / n a h e / m o h i / j e h a i / j e h a / f e h e / c a u h o h e / c a u h e / c a i h e ) &post_word {return ["NAhE", _join(expr)];} NIhO = &cmavo expr:( n i h o / n o h i ) &post_word {return ["NIhO", _join(expr)];} // NOI //////// _+no'oi +po'oi_20150820UTC_ 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 //////// _+ka'ei +kai'ei +ni'ai_20150820UTC_ 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)];} // PA //////// _vimcu zoizoi / digit zoi iki'ubo la digit cu se galfi la'o zoi preproc.js zoi_20150806UTC // PA //////// _+xe'e_20150820UTC_ // PA //////// _+fai'e'ai +su'ai +su'au_20150820UTC_ 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)];} PEhO = &cmavo expr:( k e i h a i / p e h o ) &post_word {return ["PEhO", _join(expr)];} RAhOI = &cmavo expr:( r a h o i ) &post_word {return ["RAhOI", _join(expr)];} // ROI //////// _+xu'au_20150820UTC_ 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 //////// _-su'ai +tau'o_20150820UTC_ 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 //////// _+cei'e +noi'a +poi'a_20150820UTC_ SEI = &cmavo expr:( t i h o / s o i / 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 //////// _+xe'au_20150820UTC_ 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)];} SU = &cmavo expr:( s u h o ) &post_word {return ["SU", _join(expr)];} // TEhU //////// _+ku'oi'u_20150820UTC_ TEhU = &cmavo expr:( t e h u / k u h o i h u ) &post_word {return ["TEhU", _join(expr)];} TEI = &cmavo expr:( t e i ) &post_word {return ["TEI", _join(expr)];} // TO //////// _+mau'e +noi'i_20150820UTC_ 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 //////// _+mau'o +ge'u'i_20150820UTC_ 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 //////// _-xe'e_20150820UTC_ // UI //////// _+cau'i +dau'a +de'ai +de'au +de'oi +doi'a +ge'ei +ji'au +ke'e'u +ki'a'au'u'au'i +koi'e +oi'u +pei'e +ta'oi +toi'e +toi'o +uei'e +xau'e'o +xau'o'o_20150820UTC_ 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 i / s a h u / s a h e / s a h a / s a / r u h e / 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 o / r a h i h a u / p o h o / p e i h o / p e i h e / p e i h a / p e i / 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 i h a u / n e h e / n e h a u / n a i / n a h o i / n a h i / m u h a / m o i h i / m i h u / m e h a i / m a u h u / m a u h i / 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 / j a h a i / 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 o / 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 e i / f u h e / 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 i / d o h a / d e h o i / d e h a u / d e h a i / d a u h i / d a u h a / d a i h o / d a i h i / d a i / d a h o / d a h i / c u 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 u h i / c 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)];} 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 //////// _+boi'ai +de'au'u +fau'au +fe'au'u +ga'u'au +ja'oi +ka'o'ei +kei'au +kei'i +ni'a'au +si'oi'e +te'au +vi'oi'au_20150820UTC_ 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)];} VUhO = &cmavo expr:( v u h o ) &post_word {return ["VUhO", _join(expr)];} // XI //////// _+fau'e_20150820UTC_ 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);} 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 //////// _+ge'ai +ke'au_20150820UTC_ 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)_ // //////// _cekitaujeizai: ju'a lo'u (mo'oi ge) (i'au go) (zo'u go) (moi'oi