// 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 // // // ganai da'i curmi lo nu la gek lidne no gik gi lu ga ra broda gi ri brode li'u na se genturfa'i iki'ubo lo nu zo ga kuspe zo ra po'o i ka'e stika sepi'o zoi zoi !term zoi mu'a i ku'i lo gerna cu co'a no'e sampu gek_statement = expr:(gek statement (gik statement)+ GIhI_elidible) {return _node("gek_statement", expr);} // 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 //////// _ki'u lo nu cipra tu'a zoizoi ke term+ ke'e zoi je zoizoi ga term+ gi term+ zoi vu'o pe la term kei cipra galfi fi term+ iva'i vimcu zoizoi KE_clause free* term term+ KEhE_elidible free* zoi_20150723UTC_ terms = expr:(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 //////// _cipra curmi tu'a zoizoi term+ zoi_20150723UTC_ // term_2 //////// _jmina zoizoi XOI_clause free* statement SEhU_elidible free* / zoi_20150723UTC_ term_2 = expr:(XOI_clause free* statement SEhU_elidible free* / 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 //////// _cipra curmi tu'a zoizoi term+ zoi_20150723UTC_ 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 //////// _galfi zoizoi statement zoi zoizoi sentence zoi mu'i lo nu na'e sarcu fa tu'a zo zo'u_20150720UTC_ // relative_clause //////// _cipra xruti seva'u tu'a zo noi_20150723UTC_ 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 //////// _galfi zoizoi SEI_clause free* terms? CU_elidible free* selbri SEhU_elidible zoi zoizoi SEI_clause free* statement SEhU_elidible zoi_20150723UTC_ // free //////// _vimcu zoizoi SOI_clause free* sumti sumti? SEhU_elidible / zoi_20150723UTC_ free = expr:(SEI_clause free* statement 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); }_zo 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); } //////// _vimcu_20150723UTC_ // SOI_pre = pre_clause SOI spaces? //////// _vimcu_20150723UTC_ // SOI_post = post_clause //////// _vimcu_20150723UTC_ // 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 // //////// _jmina la bridi ra'abri tcita: XOI_clause, XOI_pre, XOI_post_20150723UTC_ XOI_clause = pre:XOI_pre post:XOI_post {return _node2("XOI_clause", pre, post); } XOI_pre = pre_clause XOI spaces? XOI_post = post_clause // hesitation // Very very special case. Handled in the morphology section. // Y_clause = spaces? Y spaces? // event properties _ inchoative, etc. ZAhO_clause = pre:ZAhO_pre post:ZAhO_post {return _node2("ZAhO_clause", pre, post); } ZAhO_pre = pre_clause ZAhO spaces? ZAhO_post = post_clause // time interval size tense ZEhA_clause = pre:ZEhA_pre post:ZEhA_post {return _node2("ZEhA_clause", pre, post); } ZEhA_pre = pre_clause ZEhA spaces? ZEhA_post = post_clause // lujvo glue // time distance tense ZI_clause = pre:ZI_pre post:ZI_post {return _node2("ZI_clause", pre, post); } ZI_pre = pre_clause ZI spaces? ZI_post = post_clause // conjoins relative clauses // 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 //////// _+XOI -SOI_20150723UTC_ 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 / SU / TAhE / TEhU / TEI / TO / TOI / TUhE / TUhU / UI / VA / VAU / VEI / VEhO / VUhU / VEhA / VIhA / VUhO / XI / XOI / ZAhO / ZEhA / ZI / ZO / ZOI / ZOhU / cmavo) {return ["CMAVO", expr];} // This is a Parsing Expression Grammar for the morphology of Lojban. // See http://www.pdos.lcs.mit.edu/~baford/packrat/ // // All rules have the form // // name = peg_expression // // which means that the grammatical construct "name" is parsed using // "peg_expression". // // 1) Concatenation is expressed by juxtaposition with no operator symbol. // 2) / represents *ORDERED* alternation (choice). If the first // option succeeds, the others will never be checked. // 3) ? indicates that the element to the left is optional. // 4) * represents optional repetition of the construct to the left. // 5) + represents one_or_more repetition of the construct to the left. // 6) () serves to indicate the grouping of the other operators. // 7) & indicates that the element to the right must follow (but the // marked element itself does not absorb anything). // 8) ! indicates that the element to the right must not follow (the // marked element itself does not absorb anything). // 9) . represents any character. // 10) ' ' or " " represents a literal string. // 11) [] represents a character class. // // Repetitions grab as much as they can. // // // ___ GRAMMAR ___ // This grammar classifies words by their morphological class (cmevla, // gismu, lujvo, fuhivla, cmavo, and non_lojban_word). // //The final section sorts cmavo into grammatical classes (A, BAI, BAhE, ..., ZOhU). // // mi'e ((xorxes)) //___________________________________________________________________ lojban_word = expr:(CMEVLA / CMAVO / BRIVLA) { return expr; } any_word = expr:lojban_word spaces? { return expr; } zoi_open = w:lojban_word { return _zoi_assign_delim(w); } zoi_word = expr:( w:(non_space+) spaces &{ return (! _zoi_check_quote(w)); } ) {return "";} zoi_close = w:any_word &{ return (_zoi_check_delim(w)); } //___________________________________________________________________ cmevla = expr:(jbocme / zifcme) { return ["cmevla", _join(expr)]; } zifcme = (!h (nucleus / glide / h / consonant !pause / 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 //////// _cipra jmina: +iau +i'au_20150723UTC_ NIhO = &cmavo expr:( n i h o / n o h i / i h a u / i a u ) &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 //////// _+soi_20150723UTC_ SEI = &cmavo expr:( t i h o / s o i / s e i / l e h a u ) &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)];} //////// _vimcu_20150723UTC_ 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)];} // //////// _jmina la bridi ra'abri: XOI_20150723UTC_ XOI = &cmavo expr:( x o i / f i h o i ) &post_word {return ["XOI", _join(expr)];} Y = &cmavo expr:( y+ ) &post_word {return _join(expr);} ZAhO = &cmavo expr:( x 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)];}