// 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_20150604UTC // 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 //////// _vimcu zo jek_20150703UTC // text //////// _vimcu zoizoi (!text_1 joik)? zoi tezu'e lo nu la joik cu fragment_20150704UTC // text //////// _ galfi zoizoi text_1 zoi zoizoi paragraphs zoi_20150704UTC text = expr:(intro_null NAI_clause* indicators? free* paragraphs? si_clause? faho_clause EOF?) {return _node_nonempty("text", expr);} intro_null = expr:(spaces? su_clause* intro_si_clause) {return _node_nonempty("intro_null", expr); } intro_si_clause = expr:(si_clause? SI*) {return _node_nonempty("intro_si_clause", 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 // text_1 //////// _vimcu zo jek_20150703UTC // text_1 = expr:(I_clause joik? (stag? BO_clause)? free* text_1? / NIhO_clause+ free* paragraphs? / paragraphs) {return _node("text_1", expr);} //////// _va'o lo nu la joik cu fragment kei cu la'a na nitcu la'o zoi text_1 zoi .i vimcu_20150704UTC // // // curmi lu niho je li'u pei paragraphs = expr:((NIhO_clause+ free* paragraph?)+ / paragraph (NIhO_clause+ free* paragraph?)*) {return _node("paragraphs", expr);} // paragraph //////// _vimcu zo jek_20150703UTC // paragraph //////// _vimcu zoizoi !joik zoi tezu'e lo nu la joik cu fragment_20150705UTC paragraph = expr:((I_clause free* (statement / fragment)?)+ / (statement / fragment) (I_clause free* (statement / fragment)?)*) {return _node("paragraph", expr);} statement = expr:(statement_1 / prenex statement) {return _node("statement", expr);} // statement_1 //////// _vimcu zo jek_20150703UTC // statement_1 //////// _galfi zoizoi statement_2 (I_clause joik statement_2?)* zoi zoizoi I_clause free* joik free* statement_2)* zoi tezu'e lo nu ge la joik ji'a cu fragment gi la'o zoi free zoi ka'e se lidne zo i_20150705UTC statement_1 = expr:(statement_2 (I_clause free* joik free* statement_2)*) {return _node("statement_1", expr);} // statement_2 //////// _vimcu zo jek_20150703UTC // statement_2 //////// _galfi zoizoi statement_2?)? zoi zoiozoi statement_3)* zoi tezu'e lo nu zo BO poi lidne cu tsamau zo BO poi se lidne_20150705UTC statement_2 = expr:(statement_3 (I_clause joik? stag? BO_clause free* statement_3)*) {return _node("statement_2", expr);} // statement_3 //////// _galfi zoizoi text_1 zoi zoizoi paragraphs zoi_20150704UTC // statement_3 //////// _jmina zoizoi / gek_statement zoi_20150706UTC statement_3 = expr:(sentence / tag? TUhE_clause free* paragraphs TUhU_elidible free* / gek_statement) {return _node("statement_3", expr);} // //////// _jmina la'o zoi gek_statement zoi_20150706UTC // gek_statement //////// _cipra curmi lo nu la gek lidne no gik_20150713UTC // gek_statement //////// _co'u cipra curmi lo nu la gek lidne no gik_20150718UTC_ gek_statement = expr:(gek statement (gik statement)+ GIhI_elidible) {return _node("gek_statement", expr);} // fragment //////// _galfi zoizoi !JA_clause zoi zoizoi !JOI_clause zoi_20150703UTC // fragment //////// _jmina zoizoi / joik free* zoi_20150704UTC // fragment //////// _stika la'o zoi quantifier zoi isemu'ibo gau basti zoizoi quantifier zoi fa zoizoi mex zoi_20150709UTC // fragment //////// _cipra fa zoizoi mex+ zoi tezu'e lo nu kancu secu'u lu paboi reboi ciboi... nysu'ipa nysu'ire... li'u_20150709UTC // fragment //////// _zoizoi mex+ zoi lidne zoizoi joik free* zoi : joipaboipa_20150710UTC // fragment //////// _galfi zoizoi mex+ zoi zoizoi mex zoi_20150710UTC // ([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 VAU_elidible free* !mex / mex / joik free* / ek free* / gihek free* / NA_clause !JOI_clause free* / relative_clauses / links / linkargs) {return _node("fragment", expr);} prenex = expr:(terms ZOhU_clause free*) {return _node("prenex", expr);} // sentence //////// _galfi zoizoi (terms CU_elidible free*)? zoi zoizoi (terms)? CU_elidible free* zoi_20150704UTC sentence = expr:((terms)? CU_elidible free* bridi_tail) {return _node("sentence", expr);} // subsentence = expr:(sentence / prenex subsentence) {return _node("subsentence", expr);} //////// _la'o zoi statement zoi basti ti_20150706UTC // bridi_tail //////// _galfi zoizoi gihek stag? zoi zoizoi joik_gihek stag? CU_elidible free* zoi_20150704UTC bridi_tail = expr:(bridi_tail_1 (joik_gihek stag? CU_elidible free* bridi_tail_1)*) {return _node("bridi_tail", expr);} // bridi_tail_1 //////// _galfi zoizoi gihek !(stag? BO_clause) !(stag? KE_clause) free* bridi_tail_2 tail_terms zoi zoizoi joik_gihek !(stag? BO_clause) !(stag? KE_clause) CU_elidible free* bridi_tail_2 tail_terms zoi_20150704UTC 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 //////// _galfi zoizoi gihek stag? BO_clause free* bridi_tail_2 tail_terms zoi zoizoi joik_gihek stag? BO_clause CU_elidible free* bridi_tail_2 tail_terms zoi_20150704UTC // bridi_tail_2 //////// _galfi zoizoi bridi_tail_2 tail_terms)? zoi zoizoi bridi_tail_3 tail_terms)* zoi tezu'e lo nu zo BO poi lidne cu tsamau zo BO poi se lidne_20150705UTC 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 //////// _galfi zoizoi KE_clause free* !(selbri_3 KEhE) bridi_tail KEhE_elidible free* tail_terms / selbri tail_terms / gek_sentence zoi zoizoi KE_clause free* !(selbri_2 KEhE) bridi_tail KEhE_elidible free* tail_terms / selbri tail_terms / gek_bridi_tail zoi_20150706UTC 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);} // // // 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 //////// _cipra curmi lo nu la gek lidne no gik_20150713UTC // gek_bridi_tail //////// _co'u cipra curmi lo nu la gek lidne no gik_20150718UTC_ gek_bridi_tail = expr:(gek bridi_tail (gik bridi_tail)+ GIhI_elidible 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 // gek_sentence = expr:(gek subsentence gik subsentence tail_terms / tag* KE_clause free* gek_sentence KEhE_elidible free* / NA_clause free* gek_sentence) {return _node("gek_sentence", expr);} //////// _la'o zoi gek_bridi_tail zoi basti ti_20150706UTC //// EXP: Bridi-tail nonabsorbable terms implementation // tail_terms //////// _galfi zoizoi nonabs_terms? zoi zoizoi term* zoi_20150703UTC tail_terms = expr:(term* VAU_elidible free*) {return _node_nonempty("tail_terms", expr); } // terms //////// _galfi zoizoi terms_1 zoi zoizoi term zoi_20150703UTC // terms //////// _jmina zoizoi / KE_clause free* terms KEhE_elidible free* zoi tezu'e lo nu zo nu'i fa'u zo nu'u co'a cmavo ma'oi KE fa'u ma'oi KEhE_20150706UTC // terms //////// _galfi fi zoizoi (KE_clause free* term term+ KEhE_elidible free* / term)+ zoi_20150706UTC // // // 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:((KE_clause free* term term+ KEhE_elidible free* / term)+) {return _node("terms", expr);} /*** EXP-SELBRITCITA-FIX ***/ // terms_1 //////// _vimcu zo jek_20150703UTC // terms_1 //////// _vimcu zoizoi (PEhE_clause free* joik terms_2)* zoi_20150703UTC // terms_1 = expr:(terms_2) {return _node("terms_1", expr);} //////// _co'a dunli la'o zoi term zoi .i vimcu_20150703UTC // terms_2 //////// _vimcu zoizoi (CEhE_clause free* abs_term)* zoi_20150703UTC // terms_2 = expr:(abs_term) {return _node("terms_2", expr);} //////// _co'a dunli la'o zoi term zoi .i vimcu_20150703UTC // nonabs_terms = expr:(nonabs_terms_1+) {return _node("nonabs_terms", expr);} //////// _vimcu ki'u lo nu co'a dunli la'o zoi term+ zoi_20150703UTC // nonabs_terms_1 //////// _vimcu zo jek_20150703UTC // nonabs_terms_1 //////// _vimcu zoizoi (PEhE_clause free* joik nonabs_terms_2)* zoi_20150703UTC // nonabs_terms_1 = expr:(nonabs_terms_2) {return _node("nonabs_terms_1", expr);} //////// _vimcu ki'u lo nu co'a dunli la'o zoi term zoi_20150703UTC // nonabs_terms_2 //////// _vimcu zoizoi (CEhE_clause free* term)* zoi_20150703UTC // nonabs_terms_2 = expr:(term) {return _node("nonabs_terms_2", expr);} //////// _vimcu ki'u lo nu co'a dunli la'o zoi term zoi_20150703UTC // term = expr:(sumti / ( !gek (tag / FA_clause free*) (sumti / KU_elidible free*) ) / nonabs_termset / NA_clause KU_clause free*) {return _node("term", expr);} //////// _vimcu .i la'o zoi abs_term zoi cu binxo la'o zoi term zoi_20150703UTC // abs_term //////// _galfi lo cmene zoizoi abs_term zoi .ije galfi zoizoi abs_tag_term zoi zoizoi tag_term zoi_20150703UTC // term //////// _galfi zoizoi sumti / tag_term zoi zoizoi term_1 zoi tezu'e lo nu sarxe la camxes ra'a ma'oi CEhE e ma'oi PEhE vu'o noi vimcu ke'a_20150703UTC // term //////// _jmina zoizoi (joik_ek NA_clause KU_clause free*)* zoi tezu'e lo nu lu naku ja ja'aku li'u gendra_20150703UTC // term //////// _galfi zoizoi termset zoi zoizoi gek_term zoi_20150706UTC // term = expr:(term_1 / gek_term / NA_clause KU_clause free* (joik_ek NA_clause KU_clause free*)*) {return _node("term", expr);} //////// _gau sampu fa la term .i la'o zoi term_1 zoi basti ti_20150706UTC // term_1 //////// _jmina ti tezu'e lo nu sarxe la camxes ra'a ma'oi CEhE e ma'oi PEhE vu'o noi vimcu ke'a_20150703UTC // term_1 //////// _galfi lo cmene zoizoi term zoi .i galfi zoizoi term_2 zoi zoizoi term_1 zoi_20150706UTC term = expr:(term_1 (joik_ek term_1)*) {return _node("term", expr);} // term_2 //////// _jmina ti tezu'e lo nu sarxe la camxes ra'a ma'oi CEhE e ma'oi PEhE vu'o noi vimcu ke'a .i ra'unai zo BO poi lidne cu tsamau zo BO poi se lidne_20150703UTC // term_2 //////// _galfi lo cmene zoizoi term_1 zoi .i galfi fi zoizoi term_2 (joik_ek? BO_clause free* term_2)* zoi_20150706UTC // term_1 //////// _galfi fi zoizoi joik_ek? zoi noi ku'i na'e melbi ku'o tezu'e lo nu zo ce'e noi co'a cmavo ma'oi BO cu sarxe la camxes_20150706UTC term_1 = expr:(term_2 (joik_ek? BO_clause free* term_2)*) {return _node("term_1", expr);} // term_2 //////// _la'o zoi term_2 zoi binxo lo cnino_20150706UTC // term_2 //////// _jmina zoizoi KE_clause free* term KEhE_elidible free* / zoi_20150706UTC term_2 = expr:(KE_clause free* term KEhE_elidible free* / tag_term / !tag sumti / NA_clause KU_clause free* / gek_term) {return _node("term_2", expr);} // abs_tag_term //////// _galfi lo cmene zoizoi tag_term zoi_20150703UTC // tag_term //////// _zoizoi !gek_bridi_tail zoi basti zoizoi !gek_sentence zoi_20150706UTC // tag_term //////// _galfi zoizoi FA_clause free* zoi zoizoi FA_clause (joik FA_clause)* free* zoi_20150707UTC // tag_term //////// _galfi zoizoi FA_clause (joik FA_clause)* free* zoi zoizoi FA_clause free* (joik FA_clause free*)* !tanru_unit_2 zoi_20150715UTC tag_term = expr:(!gek (tag !(!tag selbri) !gek_bridi_tail / FA_clause free* (joik FA_clause free*)* !tanru_unit_2) (sumti / KU_elidible free*)) {return _node("tag_term", expr);} /*** END EXP-SELBRITCITA-FIX ***/ // termset //////// _vimcu zoizoi / NUhI_clause free* gek terms NUhU_elidible free* gik terms NUhU_elidible free* / NUhI_clause free* terms NUhU_elidible free* zoi_20150703UTC // termset = expr:(gek_termset) {return _node("termset", expr);} //////// _co'a dunli la'o zoi gek_termset zoi .i vimcu_20150706UTC // gek_termset //////// _galfi zoizoi terms_gik_terms zoi zoizoi term (gik term)+ GIhI_elidible zoi_20150706UTC // gek_termset //////// _galfi lo cmene zoizoi gek_term zoi_20150706UTC // gek_term //////// _cipra curmi lo nu la gek lidne no gik_20150713UTC // gek_term //////// _co'u cipra curmi lo nu la gek lidne no gik_20150718UTC_ gek_term = expr:(gek term (gik term)+ GIhI_elidible) {return _node("gek_term", expr);} /*** EXP-SELBRITCITA-FIX ***/ // terms_gik_terms = expr:(abs_term (gik / terms_gik_terms) abs_term) {return _node("terms_gik_terms", expr);} _la'o zoi nonabs_terms_gik_terms zoi cu binxo ti_20150703UTC // nonabs_termset //////// _galfi zoizoi nonabs_terms zoi zoizoi term+ zoi_20150703UTC // nonabs_termset //////// _vimcu zoizoi / NUhI_clause free* gek terms NUhU_elidible free* gik term+ NUhU_elidible free* / NUhI_clause free* term+ NUhU_elidible free* zoi_20150703UTC // nonabs_termset = expr:(nonabs_gek_termset) {return _node("nonabs_termset", expr);} //////// _co'a dunli la'o zoi termset zoi .i vimcu_20150703UTC // nonabs_gek_termset = expr:(gek nonabs_terms_gik_terms) {return _node("nonabs_gek_termset", expr);} //////// _la'o zoi gek_termset zoi basti_20150703UTC // nonabs_terms_gik_terms //////// galfi lo cmene .i vimcu zoizoi nonabs_zoi_20150703UTC // terms_gik_terms = expr:(term (gik / terms_gik_terms) term) {return _node("terms_gik_terms", expr);} //////// co'u se nitcu_20150706UTC /*** END EXP-SELBRITCITA-FIX ***/ sumti = expr:(sumti_1 (VUhO_clause free* relative_clauses)?) {return _node("sumti", expr);} // sumti_1 //////// _vimcu zoizoi stag? zoi tezu'e lo nu lo'u tag_term joik tag_term le'u fasnu_20150703UTC sumti_1 = expr:(sumti_2 (joik_ek sumti_2)*) {return _node("sumti_1", expr);} // sumti_2 //////// _zoizoi / KE_clause free* sumti KEhE_elidible free* zoi muvdu la'o zoi sumti_4 zoi_20150706UTC // sumti_2 = expr:(sumti_3) {return _node("sumti_2", expr);} //////// _co'a dunli la'o zoi sumti_3 .i vimcu_20150706UTC // sumti_3 //////// _galfi zoizoi sumti_3)? zoi zoizoi sumti_4)* zoi tezu'e lo nu zo BO poi lidne cu tsamau zo BO poi se lidne_20150703UTC // sumti_3 //////// _galfi fi zoizoi joik_ek? zoi noi ku'i na'e melbi ku'o tezu'e lo nu zo ce'e noi co'a cmavo ma'oi BO cu sarxe la camxes_20150706UTC // sumti_3 //////// _galfi lo cmene zoizoi sumti_2 zoi i galfi zoizoi sumti_4 zoi zoizoi sumti_3 zoi_20150706UTC sumti_2 = expr:(sumti_3 (joik_ek? stag? BO_clause free* sumti_3)*) {return _node("sumti_2", expr);} // sumti_4 //////// _galfi zoizoi gek sumti gik sumti_4 zoi zoizoi gek sumti (gik sumti)+ GIhI_elidible zoi_20150706UTC // sumti_4 //////// _zoizoi KE_clause free* sumti KEhE_elidible free* zoi muvdu ti la'o zoi sumti_2 zoi_20150706UTC // sumti_4 //////// _galfi lo cmene zoizoi sumti_3 zoi i galfi zoizoi sumti_5 zoi zoizoi sumti_4 zoi_20150706UTC // sumti_3 //////// _cipra curmi lo nu la gek lidne no gik_20150713UTC // sumti_3 //////// _co'u cipra curmi lo nu la gek lidne no gik_20150718UTC_ sumti_3 = expr:(KE_clause free* sumti KEhE_elidible free* / sumti_4 / gek sumti (gik sumti)+ GIhI_elidible) {return _node("sumti_3", expr);} // sumti_5 //////// _galfi lo cmene zoizoi sumti_4 zoi i galfi zoizoi sumti_6 zoi zoizoi sumti_5 zoi_20150706UTC sumti_4 = expr:(quantifier? sumti_5 relative_clauses? / quantifier selbri KU_elidible free* relative_clauses?) {return _node("sumti_4", expr);} // sumti_6 //////// _vimcu zo jek_20150703UTC // sumti_6 //////// _galfi zoizoi subsentence zoi zoizoi statement zoi_20150706UTC // sumti_6 //////// _galfi lo cmene zoizoi sumti_5 zoi_20150706UTC // sumti_5 //////// _cipra curmi lo'u na'e da li'u i galfi zoizoi BO_clause zoi zoizoi BO_clause? zoi_20150709UTC // sumti_5 //////// _lo'u na'e bo le'u zo na'e cu frica .ei tezu'e lo nu lu na'e bo (da je de) li'u lu (na'e da) je de li'u frica i xruti tu'a la'o zoi BO_clause zoi i jmina zoizoi / NAhE sumti_5 free* zoi_20150709UTC // sumti_5 //////// _galfi zoizoi NAhE sumti_5 free* zoi zoizoi NAhE sumti_3 free* zoi ija'ebo lu na'e ke da ke'e li'u gendra_20150709UTC // sumti_5 //////// _galfi zoizoi lerfu_string !MOI_clause BOI_elidible free zoi zoizoi lerfu_string BOI_elidible free zoi_20150709UTC // sumti_5 //////// _galfi zoizoi NAhE sumti_3 free* zoi zoizoi NAhE sumti_3 !(!operand mex) free* zoi ija'ebo lu na'ebysu'ire li'u gendra_20150709UTC // sumti_5 //////// _simsa fa zoizoi lerfu_string BOI_elidible free* zoi i galfi zoizoi lerfu_string BOI_elidible free* zoi zoizoi lerfu_string !(!operand mex) BOI_elidible free* zoi ija'ebo lu bysu'ire li'u je lu bypaby li'u gendra_20150709UTC // sumti_5 //////// _pu tolmo'i tu'a zoizoi _clause zoi i jmina ri ja'e lo nu lu nahe da li'u gendra (to la'o zoi spaces? zoi toi) i ji'a jmina zoizoi free* zoi .ije zoizoi !(!operand mex) zoi cu ei se lidne zoizoi BOI_elidible free* zoi_20150709UTC // sumti_5 //////// _stika tu'a la'o zoi mex_forethought zoi ira'abo galfi zoizoi !(!operand mex) zoi zoizoi !operator zoi_20150710UTC // sumti_5 //////// _galfi zoizoi !operator zoi zoizoi !(!joik_ek operator) zoi_20150710UTC // sumti_5 //////// _galfi zoizoi !(!joik_ek operator) zoi zoizoi !(BO_clause* free* operand* !joik_ek operator) zoi tezu'e tu'a lu by bo cy ri'o dy li'u_20150717UTC // sumti_5 //////// _galfi zoizoi !(BO_clause* free* operand* !joik_ek operator) zoi zoizoi !(BO_clause* free* operand* !(joik_ek sumti) operator) !(operand KEhE) zoi tezu'e tu'a lu ([{by BOI} {bo }] [joi {re BOI}]) li'u je lu ([{by BOI} {bo <(¹ci BOI¹) (¹joi [re BOI]¹)> }] VAU) li'u je lu ([{ } {BY:dy BOI}] VAU) li'u_20150718UTC // sumti_5 //////// _galfi zoizoi NAhE_clause free* zoi zoizoi NAhE_clause free* !(!sumti_5 operand) zoi tezu'e tu'a lu ([{ } VAU] [i { } VAU]) li'u i ji'a vimcu zoizoi !(BO_clause* free* operand* !(joik_ek sumti) operator) !(operand KEhE) zoi lo diklo be zo NAhE mu'i lo nu la'a xlura noda_20150718UTC // // // !(!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 free* / ZO_clause free* / ZOI_clause free* / LOhU_clause free* / lerfu_string BOI_elidible free* !(BO_clause* free* operand* !(joik_ek sumti) 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*)* statement KUhAU_elidible free* / LE_clause free* sumti_tail KU_elidible free* / li_clause / NAhE_clause free* !(!sumti_5 operand) 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 //////// _galfi zoizoi sumti_6 zoi zoizoi sumti_5 zoi_20150706UTC sumti_tail = expr:((sumti_5 relative_clauses?)? sumti_tail_1 / relative_clauses sumti_tail_1) {return _node("sumti_tail", expr); } sumti_tail_1 = expr:(selbri relative_clauses? / quantifier selbri relative_clauses? / quantifier sumti) {return _node("sumti_tail_1", expr);} // relative_clauses //////// _jmina zoizoi joik zoi_20150703UTC // relative_clauses //////// _vimcu zoizoi ZIhE_clause zoi_20150703UTC // relative_clauses //////// _galfi zoizoi joik zoi zoizoi joik? zoi_20150707UTC relative_clauses = expr:(relative_clause (joik? free* relative_clause)*) {return _node("relative_clauses", expr); } // relative_clause //////// _galfi zoizoi subsentence zoi zoizoi statement zoi_20150706UTC relative_clause = expr:(GOI_clause free* term GEhU_elidible free* / NOI_clause free* statement KUhO_elidible free*) {return _node("relative_clause", expr); } selbri = expr:(tag? selbri_1) {return _node("selbri", expr); } selbri_1 = expr:(selbri_2 / NA_clause free* selbri) {return _node("selbri_1", expr); } // selbri_2 //////// _galfi zoizoi selbri_2)? zoi zoizoi selbri_3)* zoi tezu'e lo nu zo CO poi lidne cu tsamau zo CO poi se lidne ku'o lo ka jorne .i sa'unai "lu broda {co brode} {co brodi} da li'u" = "lu brodi be da ke brode broda li'u" != "lu brodi be da brode broda li'u"_20150705UTC 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 //////// _vimcu zo jek_20150703UTC // selbri_4 //////// _vimcu zoizoi / joik stag? KE_clause free* selbri_3 KEhE_elidible free* zoi .i ki'u bo ri pagbu la'o zoi tanru_unit_2 zoi_20150706UTC selbri_4 = expr:(selbri_5 (joik selbri_5)*) {return _node("selbri_4", expr); } // selbri_5 //////// _vimcu zo jek_20150703UTC // selbri_5 //////// _galfi zoizoi selbri_5)? zoi zoizoi selbri_6)* zoi tezu'e lo nu zo BO poi lidne cu tsamau zo BO poi se lidne_20150705UTC // // // 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 stag? BO_clause free* selbri_6)*) {return _node("selbri_5", expr); } // selbri_6 //////// _zoizoi gek zoi basti zoizoi guhek zoi_20150703UTC // selbri_6 //////// _galfi zoizoi tanru_unit (BO_clause free* selbri_6)? zoi zoizoi tanru_unit (BO_clause free* tanru_unit)* zoi tezu'e lo nu zo BO poi lidne cu tsamau zo BO poi se lidne_20150705UTC // selbri_6 //////// _galfi zoizoi gek selbri gik selbri_6 zoi zoizoi gek selbri (gik selbri)+ GIhI_elidible zoi_20150705UTC // selbri_6 //////// _zoizoi / NAhE_clause? free* gek selbri (gik selbri)+ GIhI_elidible zoi muvdu la'o zoi tanru_unit_2 zoi_20150706UTC selbri_6 = expr:(tanru_unit (BO_clause free* tanru_unit)*) {return _node("selbri_6", expr); } tanru_unit = expr:(tanru_unit_1 (CEI_clause free* tanru_unit_1)*) {return _node("tanru_unit", expr); } tanru_unit_1 = expr:(tanru_unit_2 linkargs?) {return _node("tanru_unit_1", expr); } // tanru_unit_2 //////// _vimcu zo jek_20150703UTC // tanru_unit_2 //////// _galfi zoizoi subsentence zoi zoizoi statement zoi_20150706UTC // tanru_unit_2 //////// _zoizoi / NAhE_clause? free* gek selbri (gik selbri)+ GIhI_elidible zoi muvdu ti la'o zoi selbri_6 zoi_20150706UTC // tanru_unit_2 //////// _galfi zoizoi selbri zoi zoizoi selbri_2 zoi_20150706UTC // tanru_unit_2 //////// _galfi zoizoi selbri_3 zoi zoizoi selbri_2 zoi_20150706UTC // tanru_unit_2 //////// galfi zoizoi (number / lerfu_string) MOI_clause free* zoi zoizoi mex MOI_clause free* zoi_20150709UTC // tanru_unit_2 //////// _la'o zoi lerfu_string zoi cu pagbu la sumti i galfi zoizoi ME_clause free* (sumti / lerfu_string) MEhU_elidible free* MOI_clause? free* zoi zoizoi ME_clause free* sumti MEhU_elidible free* MOI_clause? free* zoi_20150709UTC // tanru_unit_2 //////// _vimcu ma'oi NUhA i ji'a galfi fi zoizoi ME_clause free* (sumti/operator) zoi_20150710UTC // tanru_unit_2 //////// _galfi zoi zoi operator zoi zoizoi operator+ zoi_20150712UTC // tanru_unit_2 //////// _cipra curmi lo nu la gek lidne no gik_20150713UTC // tanru_unit_2 //////// _cipra curmi lo nu ma'oi ME lidne la mex jonai la tag_20150713UTC // tanru_unit_2 //////// _galfi zoizoi SE_clause free* zoi zoizoi (FA_clause free* (joik FA_clause free*)* / SE_clause free*) zoi_20150715UTC // tanru_unit_2 //////// _galfi zoizoi (gik selbri_2)* GIhI_elidible zoi zoizoi (gik selbri_2)* !term GIhI_elidible zoi tezu'e tu'a lu (CU [ge {broda VAU} { } GIhI VAU]) li'u je ku'i lu (CU [ge broda { } GIhI] VAU) li'u_20150718UTC // tanru_unit_2 //////// _co'u cipra curmi lo nu la gek lidne no gik_20150718UTC_ tanru_unit_2 = expr:(CMEVLA_clause free* / 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 GIhI_elidible / GOhOI_clause 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_2 / JAI_clause free* tag? tanru_unit_2 / NAhE_clause free* tanru_unit_2 / NU_clause NAI_clause? free* (joik NU_clause NAI_clause? free*)* statement KEI_elidible free*) {return _node("tanru_unit_2", 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 //////// _galfi zoizoi number !MOI_clause zoi zoizoi number zoi_20150709UTC // quantifier //////// _jmina zoizoi / !sumti_5 !selbri mex relative_clauses? zoi_20150709UTC // quantifier //////// _muvdu zoizoi number BOI_elidible free* / VEI_clause free* mex VEhO_elidible free* zoi la'o zoi operand_3 zoi_20150709UTC quantifier = expr:(!sumti_5 !selbri mex relative_clauses?) {return _node("quantifier", expr); } // mex //////// _galfi zoizoi mex_1 (operator mex_1)* / rp_clause zoi zoizoi FUhA_clause operand+ operator (operand* operator)* / mex_1 (operator+ mex_1)* zoi tezu'e lo nu curmi tu'a lo pa po'o operand pe zo fu'a lu'u je lo nu krefu fa tu'a fu'a zei mexpau_20150712UTC // mex //////// _gasnu tu'a lo'u FUhA ... KUhE le'u noi gau cmima la'o zoi mex_2 zoi_20150712UTC // mex //////// _galfi zoizoi operator+ zoi zoizoi operator zoi_20150712UTC // // // 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 //////// _galfi fi zoizoi mex_1 (operator+ mex_1?)* zoi_20150713UTC mex = expr:(mex_1 (operator+ mex_1?)*) {return _node("mex", expr); } // rp_clause = expr:(FUhA_clause free* rp_expression) {return _node("rp_clause", expr); } //////// _tu'a di'u co'u sarcu ki'u lo nu stika tu'a la mex_20150712UTC // mex_1 //////// _galfi fi zoizoi mex_2 (BIhE_clause free* operator+ mex_2)* zoi_20150712UTC // mex_1 //////// _galfi zoizoi operator+ zoi zoizoi operator zoi_20150712UTC // mex_1 //////// _jmina zoizoi / operator BO_clause free* zoi i zo BO dunli zo BIhE lo ka ciste i tu'a xai no'e sarcu tu'a lo mekso ije ku'i na'e vimcu tezu'e lo nu sarxe la camxes_20150712UTC // mex_1 //////// _galfi zoizoi mex_2 zoi zoizoi mex_2 (BO_clause free* mex_2)* zoi tezu'e lo nu lo jbini operator ciste cu curmi tu'a lo na'e re mei be lo operand_20150713UTC // mex_1 //////// _vimcu zoizoi / operator BO_clause free* zoi ki'u lo nu ma'oi BO cu se pilno fi lo gunma be lo operand_20150713UTC // mex_1 //////// _galfi zoizoi mex_2 (BO_clause free* mex_2)* zoi zoizoi (KE_clause free* mex_2+ KEhE_elidible free* / mex_2 (BO_clause free* mex_2)*) zoi_20150713UTC // // // operator+ : // // // ([pa BOI] [pi'i pi'i] [pa BOI]) // // // ([pa BOI] [pi'i {pe'o pi'i KUhE}]) 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 //////// _la mex zo'u gasnu tu'a lo'u FUhA ... KUhE le'u noi gau cmima la'o zoi mex_2 zoi_20150712UTC mex_2 = expr:(operand / mex_rp / mex_forethought) {return _node("mex_2", expr); } // //////// _jmina la'o zoi mex_rp zoi i la mex zo'u gasnu tu'a lo'u FUhA ... KUhE le'u noi gau cmima la'o zoi mex_2 zoi_20150712UTC // mex_rp //////// _cipra cuxna zoizoi operand zoi jenai zoizoi mex_2 zoi iki'u bo au tu'a zo pe'o ja zo fu'a na nenri lo fu'a zei mexpau i ku'i ma'i lo si'o gerna melbi kei curmi tu'a zoizoi mex_2 zoi_20150713UTC 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 //////// _galfi fi zoizoi !(lerfu_string BOI_elidible free*) operator mex_2+ KUhE_elidible free* !MAI / PEhO_clause free* operator mex_2+ KUhE_elidible free* zoi_20150710UTC // mex_forethought //////// _jmina zoizoi mex_forethought? zoi tezu'e lo nu lo operator porsi cu simsa la'o zoi f∘g∘h(x) zoi_20150712UTC // mex_forethought //////// _cipra galfi zoizoi mex_2+ zoi zoizoi (operand / mex_forethought)+ zoi iki'u bo au tu'a zo fu'a na nenri lo pe'o zei mexpau i ku'i ma'i lo si'o gerna melbi kei curmi tu'a zoizoi mex_2 zoi_20150713UTC // mex_forethought //////// _vimcu zoi zoi !MAI zoi ki'u lo nu za'a na sarcu_20150713UTC 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* // fore_operands = expr:(mex_2+ ) {return _node("fore_operands", expr); } //////// _vimcu_20150710UTC // Right recursive version. // rp_expression //////// _galfi fi zoizoi mex (rp_expression operator)* zoi_20150710UTC // rp_expression = expr:(mex (rp_expression operator)*) {return _node("rp_expression", expr); } //////// _tu'a di'u co'u sarcu ki'u lo nu stika tu'a la mex_20150712UTC // rp_expression_tail = expr:(rp_expression operator rp_expression_tail / ()) {return _node("rp_expression_tail", expr); } //////// _vimcu_20150710UTC // operator //////// _vimcu zo jek_20150703UTC // operator = expr:(operator_1 (joik stag? operator_1)*) {return _node("operator", expr); } //////// _la joik cu cmima la operator .i galfi fi zoizoi operator_1 (BO_clause? operator_1)* zoi_20150710UTC // operator = expr:(operator_1 (BO_clause? operator_1)*) {return _node("operator", expr); } //////// _cipra vimcu zo bo la operator ma'i lo si'o melbi i tu'a zo ke banzu_20150711UTC // operator //////// _xruti operator i ku'i galfi fi zoizoi operator_1+ zoi tezu'e tu'a zoizoi ([pa BOI] [vu'u {vu'u vu'u vu'u}] [pa BOI]) zoi naje zoizoi ([pa BOI] [vu'u vu'u vu'u vu'u] [pa BOI]) zoi_20150712UTC // operator = expr:(operator_1+) {return _node("operator", expr); } //////// _vimcu ki'u lo nu la'o zoi operator_1 zoi cu di'a se cmene la'o zoi operator zoi i lo ka operator krefu cu se vrici tu'a zo pe'o ce zo fu'a ce lo jbini_20150712UTC // operator_1 //////// _vimcu zo jek_20150703UTC // operator_1 //////// _zoizoi gek zoi basti zoizoi guhek zoi_20150703UTC // operator_1 //////// _muvdu zoizoi / gek operator_1 gik operator_2 zoi la'o zoi operator_2 zoi_20150705UTC // operator_1 //////// _galfi zoizoi operator_2 / operator_2 joik stag? BO_clause free* operator_1 zoi zoizoi operator_2 (joik stag? BO_clause free* operator_2)* zoi tezu'e lo nu zo BO poi lidne cu tsamau zo BO poi se lidne_20150705UTC // operator_1 = expr:(operator_2 (joik stag? BO_clause free* operator_2)*) {return _node("operator_1", expr); } //////// _vimcu .i la joik cu cmima la operator_20150710UTC // operator_2 //////// _zoizoi / gek operator_1 gik operator_2 zoi muvdu ti_20150705UTC // operator_2 //////// _galfi zoizoi gek operator_1 gik operator_2 zoi zoizoi gek operator gik operator zoi tezu'e lo nu la gek cu tsamau la joik_20150705UTC // operator_2 //////// _galfi zoizoi gek operator gik operator zoi zoizoi gek operator (gik operator)+ GIhI_elidible zoi_20150706UTC // operator_2 = expr:(mex_operator / KE_clause free* operator KEhE_elidible free* / gek operator (gik operator)+ GIhI_elidible) {return _node("operator_2", expr); } //////// _vimcu .i la joik cu cmima la operator_20150710UTC // mex_operator //////// galfi lo cmene zoizoi operator_1 zoi .i la joik cu cmima la operator_20150710UTC // operator_1 //////// _vimcu zoizoi gek operator (gik operator)+ GIhI_elidible zoi tezu'e lo nu la mex lidne ma'oi ROI i ji'a to'e sarcu ne'i la mex_20150710UTC // operator_1 //////// _galfi lo cmene zo operator iseja'e bo tu'e cipra vimcu zo bo la operator ma'i lo si'o melbi i tu'a zo ke banzu tu'u_20150711UTC // operator_1 //////// _cipra mulno i xruti tu'a lo cmene_20150711UTC // operator_1 //////// _di'a se cmene zo operator i lo ka operator krefu cu se vrici tu'a zo pe'o ce zo fu'a ce lo jbini_20150712UTC // operator //////// _vimcu zoizoi KE_clause free* operator KEhE_elidible free* zoi ki'u lo nu na'e sarxe la mex_20150713UTC operator = expr:(SE_clause free* operator / NAhE_clause free* operator / MAhO_clause free* mex TEhU_elidible free* / NAhU_clause free* selbri TEhU_elidible free* / VUhU_clause free* / joik_ek) {return _node("operator", expr); } // operand = expr:(operand_1 (joik_ek stag? operand_1)*) {return _node("operand", expr); } //////// _vimcu .i la joik cu cmima la operator_20150710UTC // operand_1 = expr:(operand_2 (joik_ek operand_2)*) {return _node("operand_1", expr); } //////// _vimcu .i la joik cu cmima la operator_20150710UTC // operand_2 //////// _galfi zoizoi operand_2)? zoi zoizoi operand_3)* zoi tezu'e lo nu zo BO poi lidne cu tsamau zo BO poi se lidne_20150705UTC // operand_2 = expr:(operand_3 (joik_ek stag? BO_clause free* operand_3)*) {return _node("operand_2", expr); } //////// _vimcu .i la joik cu cmima la operator_20150710UTC // operand_3 //////// _galfi zoizoi gek operand gik operand_3 zoi zoizoi gek operand (gik operand)+ GIhI_elidible zoi_20150706UTC // operand_3 //////// _cipra curmi lo'u na'e pa li'u i galfi zoizoi BO_clause zoi zoizoi BO_clause? zoi_20150709UTC // operand_3 //////// _lo'u na'e bo le'u zo na'e cu frica .ei tezu'e lo nu lu na'e bo (pa je re) li'u lu (na'e pa) je re li'u frica i xruti tu'a la'o zoi BO_clause zoi i jmina zoizoi / NAhE operand_3 free* zoi_20150709UTC // operand_3 //////// _galfi zoizoi lerfu_string !MOI_clause zoi zoizoi lerfu_string zoi_20150709UTC // operand_3 //////// _galfi zoizoi quantifier zoi zoizoi / number BOI_elidible free* / VEI_clause free* mex VEhO_elidible free* zoi_20150709UTC // operand_3 //////// _stika lo se porsi i jalge fa tu'a zoizoi / number BOI_elidible free* / lerfu_string BOI_elidible free* / VEI_clause free* mex VEhO_elidible free* zoi_20150709UTC // operand_3 //////// _pu tolmo'i tu'a zoizoi _clause zoi i jmina ri ja'e lo nu lu nahe pa li'u gendra (to la'o zoi spaces? zoi toi) i ji'a jmina zoizoi free* zoi_20150709UTC // operand_3 //////// _galfi lo cmene zoizoi operand zoi .i la joik cu cmima la operator_20150710UTC // operand //////// _vimcu zoizoi KE_clause free* operand KEhE_elidible free* zoi ki'u lo nu lu vei pa ve'o li'u basti_20150710UTC // operand //////// _vimcu zoizoi gek operand (gik operand)+ GIhI_elidible li'u ki'u lo nu lu (pe'o) joi paboi pa li'u basti i ji'a ai la mex cu lidne ma'oi ROI_20150710UTC // operand //////// _galfi so'o zoi zoi operand zoi zoizoi mex_2 zoi i ku'i ma'oi NAhE cu lidne la operand po'o ki'u lo nu la operator ji'a cu ka'e se lidne ma'oi NAhE_20150710UTC // operand //////// zo jo'i gau cmavo ma'oi VUhU i lu (pe'o) jo'i paboi reboi ci (kuhe) li'u mu'a basti i vimcu ma'oi JOhI_20150712UTC // operand //////// lo LAhE zei mexpau cu se pagbu zo mex jenai lo'u mex_2 le'u_20150712UTC // // // (na'e (pa da)) , (vei (na'e pa)) da operand = expr:(number BOI_elidible free* / lerfu_string BOI_elidible free* / VEI_clause free* mex VEhO_elidible free* / NIhE_clause free* selbri TEhU_elidible free* / MOhE_clause free* 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); } // jek = expr:(NA_clause? SE_clause? JA_clause NAI_clause?) {return _node("jek", expr); } //////// _vimcu_20150703UTC // joik //////// _jmina zoizoi NA_clause? zoi_20150703UTC 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); } // //////// _jmina la'o zoi joik_gihek zoi_20150704UTC joik_gihek = expr:(joik free* / gihek free*) {return _node("joik_gihek", expr); } // joik_jek = expr:(joik free* / jek free*) {return _node("joik_jek", expr); } //////// _vimcu_20150703UTC // gek //////// _galfi zoizoi SE_clause? GA_clause NAI_clause? free* / joik GI_clause free* / stag gik zoi zoizoi SE_clause? GA_clause NAI_clause? free* / GI_clause (joik / stag) (BO_clause)? free* / (joik / stag) GI_clause (BO_clause)? free* zoi_20150707UTC 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); } // guhek = expr:(SE_clause? GUhA_clause NAI_clause? free*) {return _node("guhek", expr); } //////// _zoizoi gek zoi basti zoizoi guhek zoi_20150703UTC gik = expr:(GI_clause NAI_clause? free*) {return _node("gik", expr); } // tag //////// _vimcu zo jek_20150703UTC tag = expr:(tense_modal (joik tense_modal)*) {return _node("tag", expr); } // stag //////// _vimcu zo jek_20150703UTC 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 //////// _galfi zoizoi number ROI_clause NAI_clause? zoi zoizoi mex ROI_clause NAI_clause? zoi_20150710UTC interval_property = expr:(mex ROI_clause NAI_clause? / TAhE_clause NAI_clause? / ZAhO_clause NAI_clause?) {return _node("interval_property", expr); } // free //////// _galfi zoizoi (terms CU_elidible free*)? zoi zoizoi (terms)? CU_elidible free* zoi_20150704UTC // free //////// _galfi zoizoi (number / lerfu_string) MAI_clause zoi zoizoi mex_2 MAI_clause zoi_20150710UTC free = expr:(SEI_clause free* terms? CU_elidible free* selbri SEhU_elidible / SOI_clause free* sumti sumti? SEhU_elidible / vocative relative_clauses? selbri 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 //////// _galfi zoizoi (number / lerfu_string) zoi zoizoi mex_2 zoi_20150710UTC 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 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);} // //////// _jmina la'o zoi GIhI_elidible zoi_20150706UTC GIhI_elidible = expr:(GIhI_clause?) {return (expr == "") ? ["GIhI"] : _node("GIhI", 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);} // NUhU_elidible = expr:(NUhU_clause?) {return (expr == "") ? ["NUhU"] : _node("NUhU", expr);} //////// _vimcu_20150703UTC 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 // CEhE_clause = pre:CEhE_pre post:CEhE_post {return _node2("CEhE_clause", pre, post); } //////// _vimcu_20150703UTC // CEhE_pre = pre_clause CEhE spaces? //////// _vimcu_20150703UTC // CEhE_post = post_clause //////// _vimcu_20150703UTC // 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 // //////// _jmina ma'oi GIhI noi famyma'o zoizoi gek ... (gik ...)+ zoi_20150706UTC // 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 // GUhA_clause = pre:GUhA_pre post:GUhA_post {return _node2("GUhA_clause", pre, post); } //////// _vimcu_20150703UTC // GUhA_pre = pre_clause GUhA spaces? //////// _vimcu_20150703UTC // GUhA_post = post_clause //////// _vimcu_20150703UTC // sentence link I_clause = expr:(I_pre I_post) {return _node("I_clause", expr); } I_pre = pre_clause I spaces? I_post = post_clause // jeks; logical connectives within tanru // JA_clause = pre:JA_pre post:JA_post {return _node2("JA_clause", pre, post); } //////// _vimcu_20150703UTC // JA_pre = pre_clause JA spaces? //////// _vimcu_20150703UTC // JA_post = post_clause //////// _vimcu_20150703UTC // 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 // JOhI_clause = pre:JOhI_pre post:JOhI_post {return _node2("JOhI_clause", pre, post); }_20150712UTCzo jo'i gau cmavo ma'oi VUhU i vimcu ma'oi JOhI_20150712UTC_ // JOhI_pre = pre_clause JOhI spaces?_20150712UTC // JOhI_post = post_clause_20150712UTC // 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 // 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 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 // 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 // NUhA_clause = pre:NUhA_pre post:NUhA_post {return _node2("NUhA_clause", pre, post); } //////// _vimcu .i ma'oi ME basti_20150710UTC // NUhA_pre = pre_clause NUhA spaces? //////// _vimcu .i ma'oi ME basti_20150710UTC // NUhA_post = post_clause //////// _vimcu .i ma'oi ME basti_20150710UTC // marks the start of a termset // NUhI_clause = pre:NUhI_pre post:NUhI_post {return _node2("NUhI_clause", pre, post); } //////// _vimcu_20150703UTC // NUhI_pre = pre_clause NUhI spaces? //////// _vimcu_20150703UTC // NUhI_post = post_clause //////// _vimcu_20150703UTC // marks the middle and end of a termset // NUhU_clause = pre:NUhU_pre post:NUhU_post {return _node2("NUhU_clause", pre, post); } //////// _vimcu_20150703UTC // NUhU_pre = pre_clause NUhU spaces? //////// _vimcu_20150703UTC // NUhU_post = post_clause //////// _vimcu_20150703UTC // 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 // PEhE_clause = pre:PEhE_pre post:PEhE_post {return _node2("PEhE_clause", pre, post); } //////// _vimcu_20150703UTC // PEhE_pre = pre_clause PEhE spaces? //////// _vimcu_20150703UTC // PEhE_post = post_clause //////// _vimcu_20150703UTC // 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 = 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 // 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 // ZIhE_clause = pre:ZIhE_pre post:ZIhE_post {return _node2("ZIhE_clause", pre, post); } //////// _vimcu_20150703UTC // ZIhE_pre = pre_clause ZIhE spaces? //////// _vimcu_20150703UTC // ZIhE_post = post_clause //////// _vimcu_20150703UTC // 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 //////// _vimcu zoizoi / JA zoi_20150703UTC // CMAVO //////// _vimcu zoizoi / GUhA zoi_20150703UTC // CMAVO //////// _vimcu zoizoi / ZIhE zoi_20150703UTC // CMAVO //////// _vimcu zoizoi / PEhE zoi_20150703UTC // CMAVO //////// _vimcu zoizoi / CEhE zoi_20150703UTC // CMAVO //////// _vimcu zoizoi NUhI / NUhU / zoi_20150703UTC // CMAVO //////// _jmina zoizoi / GIhI zoi_20150706UTC // CMAVO //////// _vimcu zo NUhA .i ma'oi ME basti_20150710UTC // CMAVO //////// _zo jo'i gau cmavo ma'oi VUhU i vimcu ma'oi JOhI_20150712UTC 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 / GIhI / GOI / GOhA / GOhOI / I / JAI / JOI / KE / KEhE / KEI / KI / KOhA / KU / KUhAU / KUhE / KUhO / LAU / LAhE / LEhAI / LE / LEhU / LI / LIhU / LOhAI / LOhO / LOhOI / LOhU / LU / LUhU / MAhO / MAI / ME / MEhU / MOhE / MOhI / MOI / NA / NAI / NAhE / NAhU / NIhE / NIhO / NOI / NU / 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 / 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 / digit)* consonant &pause) jbocme = (&zifcme (any_syllable / digit)* &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+ / digit) { 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 &consonant onset y) { return _join(expr); } fuhivla_rafsi = expr:(&unstressed_syllable fuhivla_head &consonant 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* h? y? syllable pause) {return _join(expr);} stressed = expr:(onset comma* [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 = expr:(a i / a u / e i / o i) !nucleus !glide {return _join(expr);} vowel = expr:(a / e / i / o / u) !nucleus {return expr;} a = comma* [aA] {return "a";} e = comma* [eE] {return "e";} i = comma* [iI] {return "i";} o = comma* [oO] {return "o";} u = comma* [uU] {return "u";} y = comma* [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 = comma* [lL] !h !glide !l {return "l";} m = comma* [mM] !h !glide !m !z {return "m";} n = comma* [nN] !h !glide !n !affricate {return "n";} r = comma* [rR] !h !glide !r {return "r";} b = comma* [bB] !h !glide !b !unvoiced {return "b";} d = comma* [dD] !h !glide !d !unvoiced {return "d";} g = comma* [gG] !h !glide !g !unvoiced {return "g";} v = comma* [vV] !h !glide !v !unvoiced {return "v";} j = comma* [jJ] !h !glide !j !z !unvoiced {return "j";} z = comma* [zZ] !h !glide !z !j !unvoiced {return "z";} s = comma* [sS] !h !glide !s !c !voiced {return "s";} c = comma* [cC] !h !glide !c !s !x !voiced {return "c";} x = comma* [xX] !h !glide !x !c !k !voiced {return "x";} k = comma* [kK] !h !glide !k !x !voiced {return "k";} f = comma* [fF] !h !glide !f !voiced {return "f";} p = comma* [pP] !h !glide !p !voiced {return "p";} t = comma* [tT] !h !glide !t !voiced {return "t";} h = comma* ['h] &nucleus {return "'";} //___________________________________________________________________ digit = expr:(comma* [0123456789] !h !nucleus) {return _join(expr);} post_word = expr:(pause / !nucleus lojban_word) {return _join(expr);} pause = expr:(comma* space_char+ / EOF) {return _join(expr);} EOF = expr:(comma* !.) {return _join(expr);} comma = [,] {return "";} 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:((comma* 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 //////// _zo ji muvdu ma'oi JOI_20150706UTC A = &cmavo expr:( a / e / o / u ) &post_word {return ["A", _join(expr)];} BAI = &cmavo expr:( z u h e / z a u / 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 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 / p o h i / 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 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 i / k o h a u / k i h u / 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 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)];} // BAhE //////// _lo cmavo be ma'oi PEhE cu muvdu ti ma'i lo si'o sarxe la camxes_20150703UTC BAhE = &cmavo expr:( z a i h e / z a h e / p e h e / 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)];} // BO //////// _lo cmavo be ma'oi CEhE cu muvdu ti ma'i lo si'o sarxe la camxes_20150703UTC 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 = &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 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 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 / s e h e / r y / r u h o / r o h y / r o h o i h y / 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 i h i h y / j e h o / j a u 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 / e h y / d y / d u h e h y / digit 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 / n e h e / 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 i ) &post_word {return ["CAI", _join(expr)];} CEI = &cmavo expr:( c e i ) &post_word {return ["CEI", _join(expr)];} // CEhE = &cmavo expr:( c e h e ) &post_word {return ["CEhE", _join(expr)];} //////// _vimcu .i lo cmavo be ma'oi CEhE cu muvdu ma'oi BO ma'i lo si'o sarxe la camxes_20150703UTC 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 / 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 u 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 //////// _lo cmavo be ma'oi GUhA muvdu ti ma'i lo si'o sarxe la camxes_20150703UTC 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 //////// _zo gi'i cu muvdu ma'oi GIhI_20150706UTC 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)];} // //////// _jmina ma'oi GIhI_20150706UTC GIhI = &cmavo expr:( g i h i ) &post_word {return ["GIhI", _join(expr)];} GOI = &cmavo expr:( n o h u / n e / g o i / p o h u / p e / p o h e / p o ) &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 / 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 ) &post_word {return ["GOhOI", _join(expr)];} // GUhA = &cmavo expr:( g u h e / g u h i / g u h o / g u h a / g u h u ) &post_word {return ["GUhA", _join(expr)];} //////// _ma'oi GA basti .i ma'i lo si'o sarxe la camxes kei lo cmavo be ma'oi GUhA muvdu ma'oi GA_20150703UTC I = &cmavo expr:( i ) &post_word {return ["I", _join(expr)];} // JA = &cmavo expr:( j e h i / j e / j o / j a / j u ) &post_word { return ["JA", _join(expr)];} //////// _muvdu ma'oi JOI_20150703UTC JAI = &cmavo expr:( j a h e i / j a i ) &post_word {return ["JAI", _join(expr)];} //JOhI = &cmavo expr:( j o h i ) &post_word {return ["JOhI", _join(expr)];} //////// _20150712UTC // JOI //////// _lo cmavo be ma'oi JA cu muvdu ti_20150703UTC // JOI //////// _lo cmavo be ma'oi ZIhE cu muvdu ti ma'i lo si'o sarxe la camxes_20150703UTC // JOI //////// _zo ji muvdu ti_20150706UTC JOI = &cmavo expr:( z i h e / x o i h u / p i h u / k u h a / j u h e / j u / j o i / j o h u / j o h e i h i / j o h e i / j o h e / j o / 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 ) &post_word {return ["JOI", _join(expr)];} // KE //////// _lo cmavo be ma'oi NUhI cu muvdu ti ma'i lo si'o sarxe la camxes_20150706UTC KE = &cmavo expr:( p i h a i / n u h i / k e / f e i h u ) &post_word {return ["KE", _join(expr)];} // KEhE //////// _lo cmavo be ma'oi NUhU cu muvdu ti ma'i lo si'o sarxe la camxes_20150706UTC KEhE = &cmavo expr:( n u h u / 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 i ) &post_word {return ["KI", _join(expr)];} KOhA = &cmavo expr:( z u h i h a / z u h i / z u h a i / z o h e / 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 / 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 u / l a u h e / k o h u / k o h o / k o h i / k o h e / k o h a / k o / k e h a / 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 h u ) &post_word { return ["KOhA", _join(expr)];} KU = &cmavo expr:( k u ) &post_word {return ["KU", _join(expr)];} KUhAU = &cmavo expr:( k u h a u ) &post_word {return ["KUhAU", _join(expr)];} KUhE = &cmavo expr:( 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 / z a i / t a u ) &post_word {return ["LAU", _join(expr)];} LAhE = &cmavo expr:( z o h e i / v u h i / t u h a / 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 / d u h a u ) &post_word {return ["LAhE", _join(expr)];} LE = &cmavo expr:( z o h a u / r i h o i / m o i h o i / m o h o i / m e h e i / l o i h i / 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 / 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 = &cmavo expr:( l i h a i / m e h o / l 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 / x u h u ) &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:( 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 //////// _+nu'a ki'u lo nu vimcu ma'oi NUhA_20150710UTC ME = &cmavo expr:( 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 ) &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)];} NA = &cmavo expr:( x u h o h e / j a h a / n 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 / 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 / v o i / n o i / p o i ) &post_word {return ["NOI", _join(expr)];} NU = &cmavo expr:( b u h a i / k a i h u / p o i h i / n i / d u h u / s i h o / n u / l i h i / k a / j e i / s u h u / z u h o / m u h e / p u h u / z a h i ) &post_word {return ["NU", _join(expr)];} // NUhA = &cmavo expr:( n u h a ) &post_word {return ["NUhA", _join(expr)];} //////// _vimcu .i ma'oi ME basti i zo nu'a gau cmavo ma'oi ME_20150710UTC // NUhI = &cmavo expr:( n u h i ) &post_word {return ["NUhI", _join(expr)];} //////// _vimcu .i lo cmavo be ma'oi NUhI cu muvdu ma'oi KE ma'i lo si'o sarxe la camxes_20150706UTC // NUhU = &cmavo expr:( n u h u ) &post_word {return ["NUhU", _join(expr)];} //////// _vimcu .i lo cmavo be ma'oi NUhU cu muvdu ma'oi KEhE ma'i lo si'o sarxe la camxes_20150706UTC 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 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 o / s u h e / 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 / d u h e / d a u / d a h a / c i h i / c i / c e h i / b i / digit ) &post_word {return ["PA", _join(expr)];} // PEhE = &cmavo expr:( p e h e ) &post_word {return ["PEhE", _join(expr)];} //////// _vimcu .i lo cmavo be ma'oi PEhE cu muvdu ma'oi BAhE ma'i lo si'o sarxe la camxes_20150703UTC 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:( v a h e i / b a h o i / d e h e i / m u h e i / r e h u / r o i ) &post_word {return ["ROI", _join(expr)];} SE = &cmavo expr:( r e h a u h e / s e h o h e / s e h u h o / s u h a i / s u h e i / t o h a i / v o h a i / x o h a i / s e / t e / v e / x e ) &post_word {return ["SE", _join(expr)];} SEI = &cmavo expr:( l e h a u / s e i / t i h o ) &post_word {return ["SEI", _join(expr)];} SEhU = &cmavo expr:( 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 = &cmavo expr:( s o i ) &post_word {return ["SOI", _join(expr)];} SU = &cmavo expr:( s u ) &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 ) &post_word {return ["TEhU", _join(expr)];} TEI = &cmavo expr:( t e i ) &post_word {return ["TEI", _join(expr)];} TO = &cmavo expr:( t o h i / t o ) &post_word {return ["TO", _join(expr)];} TOI = &cmavo expr:( t o 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 //////// _lo cmavo be ma'oi SA di'a jmive bu'u ti ma'i lo si'o sarxe la camxes_20150703UTC 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 e h e / 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 h i / u e / u a u / u a i / u a / t o h u / t i h e / t e h i h o / t a h u / t a h o / t a h e i / s u h a / s i h a 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 h i / p e h a i / p e h a / p a u / p a h e / 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 h o i / k i h a / k 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 / 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 / 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 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 //////// _+jo'i_20150712UTC 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 a h a / t o h e i h a u / t e h a u h 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 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 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 a h a u / j u h u / j o i h i / j o h i / j a u h a u / g u h a u h i / g u h a i / g e i / g e h a / f u h u / f e h i / f e h a / 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 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 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 e / t e h a i / x i h i / x i ) &post_word {return ["XI", _join(expr)];} Y = &cmavo expr:( y+ ) &post_word {return _join(expr);} ZAhO = &cmavo expr:( 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)];} // ZIhE = &cmavo expr:( z i h e ) &post_word {return ["ZIhE", _join(expr)];} //////// _vimcu .i lo cmavo be ma'oi ZIhE cu muvdu ma'oi JOI ma'i lo si'o sarxe la camxes_20150703UTC 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:( c e h a i / z o h u ) &post_word {return ["ZOhU", _join(expr)];}