Skip to content
Permalink
Branch: master
Find file Copy path
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
1599 lines (1118 sloc) 83.5 KB
// camxes.js.peg
// Copyright (c) 2013, 2014 Masato Hagiwara
// https://github.com/mhagiwara/camxes.js
//
// camxes.js can be used, modified, and re-distributed under MIT license.
// See LICENSE for the details.
// //////// _la guskant cu co'a galfi_20150604
// This is a Parsing Expression Grammar for Lojban.
// See http://bford.info/packrat/
//
// All rules have the form:
//
// name = peg_expression
//
// which means that the grammatical construct "name" is parsed using
// "peg_expression".
//
// 1) Names in lower case are grammatical constructs.
// 2) Names in UPPER CASE are selma'o (lexeme) names, and are terminals.
// 3) Concatenation is expressed by juxtaposition with no operator symbol.
// 4) / represents *ORDERED* alternation (choice). If the first
// option succeeds, the others will never be checked.
// 5) ? indicates that the element to the left is optional.
// 6) * represents optional repetition of the construct to the left.
// 7) + represents one_or_more repetition of the construct to the left.
// 8) () serves to indicate the grouping of the other operators.
//
// Longest match wins.
// How to compile using Node.js: (Added by Masato Hagiwara)
// // load peg.js and the file system module
// > var PEG = require("pegjs")
// > var fs = require("fs")
// // read peg and build a parser
// > var camxes_peg = fs.readFileSync("/path/to/camxes.js.peg").toString();
// > var camxes = PEG.buildParser(camxes_peg, {cache: true});
// // test it
// > camxes.parse("ko'a broda");
// [ 'text',
// [ 'text_1',
// [ 'paragraphs', [Object] ] ] ]
// // write to a file
// > fs.writeFileSync("/path/to/camxes.js", camxes.toSource());
// ___ GRAMMAR ___
{
var _g_zoi_delim;
function _join(arg)
{
if (typeof(arg) == "string")
return arg;
else
{
var ret = "";
for (var v in arg) { ret += _join(arg[v]); }
return ret;
}
}
function _node(label, arg)
{
var ret = [];
if (label != undefined) ret.push( label );
if (typeof( arg ) == "object" && typeof( arg[0] ) == "string" && arg[0] != "")
{
ret.push( arg );
return ret;
}
return _node_int(label, arg);
}
function _node_int(label, arg)
{
if (typeof( arg ) == "string")
return arg;
var ret = [];
if (label != undefined) ret.push( label );
for (var v in arg)
{
if (arg[v].length != 0)
ret.push( _node_int( undefined, arg[v] ) );
}
return ret;
}
function _node2(label, arg1, arg2)
{
return [label].concat(_node(arg1)).concat(_node(arg2));
}
function _node_nonempty(label, arg)
{
var _n = _node(label, arg);
return (_n.length == 1 && _n[0] == label) ? [] : _n;
}
// === ZOI functions === //
function _zoi_assign_delim(word) {
var a = word.toString().split(",");
if (a.length > 0) _g_zoi_delim = a[a.length - 1];
else _g_zoi_delim = "";
return word;
}
function _zoi_check_quote(word) {
if (typeof(word) == "object") word = word.toString();
if (!is_string(word)) {
alert("ZOI word is not a string");
return false;
} else {
return (word.toLowerCase().replace(/,/gm,"").replace(/h/g, "'") === _g_zoi_delim);
}
}
function _zoi_check_delim(word) {
if (typeof(word) == "object") word = word.toString();
if (!is_string(word)) {
alert("ZOI word is not a string");
return false;
} else {
word = word.split(",");
if (word.length > 0) word = word[word.length - 1];
else word = "";
return (word === _g_zoi_delim);
}
}
function is_string(v) {
return typeof v.valueOf() === 'string';
}
}
// //////// _vimcu ro zoi zoi comma zoi imu'ibo ri zukte noda i fau ku stika tu'a la'o zoi preproc.js zoi_20150806UTC
// text //////// _vimcu lo pa cfila i galfi zoizoi si_clause? zoi zoizoi intro_si_clause zoi i jalge fa lo nu zoizoi idasibroda zoi zoizoi dasibroda zoi dunli lo ka stura_20150807UTC
// text //////// _galfi zoizoi intro_si_clause zoi zoizoi si_clause? SI_clause* zoi tezu'e lo go'i je lo nu curmi lo nu zo si du'e mei_20150810UTC
text = expr:(intro_null free* paragraphs? si_clause? SI_clause* faho_clause EOF?) {return _node_nonempty("text", expr);}
// intro_null //////// _vimcu lo pa cfila i vimcu zoizoi intro_si_clause zoi i jalge fa lo nu zoizoi idasibroda zoi zoizoi dasibroda zoi dunli lo ka stura_20150807UTC
// intro_null //////// _jmina zoizoi (!paragraphs si_clause SI_clause*)? zoi tezu'e lo go'i je lo nu curmi lo nu zo si du'e mei_20150810UTC
// intro_null //////// _galfi zoizoi spaces? zoi zoizoi initial_spaces? zoi ja'e lo nu y bu po'o ji'a gendra_20160426UTC
intro_null = expr:(initial_spaces? su_clause* (!paragraphs si_clause SI_clause*)?) {return _node_nonempty("intro_null", expr); }
// intro_si_clause = expr:(si_clause? SI*) {return _node_nonempty("intro_si_clause", expr); } //////// _tu'a ti co'a na'e sarcu i vimcu_20150810UTC
faho_clause = expr:((FAhO_clause dot_star)?) {return _node("faho_clause", expr);}
// Please note that the "text_1" item in the text_1 production does
// *not* match the BNF. This is due to a bug in the BNF. The change
// here was made to match grammar.300
// // // curmi lu niho je li'u pei
// // // mu'a la oz cu se pagbu lo'u ni'o ca bo le'u i ku'i la paragraf cu se pagbu la fragment ji'a i ma'i lo logji saske cu na'e xambu fa lo nu lo na'e ka'e ckaji be lo ka jetnu cu simxu co jorne fi lo jonma'o i frica lo sedu'u sumti jorne ku noi ka'e se tamgau fi lo sedu'u jufra jorne i jdice lo du'u na curmi
// paragraphs //////// _iku'i va'o lo nu la paragraf cu se pagbu la fragment kei la paragraf cu na logji i va'o lo nu la paragraf cu na logji kei lo jonma'o pe la paragraf cu ka'e claxu lo ka logji i cipra curmi lo'u NIhO JOI, NIhO (BAI) BO le'u_20150824UTC
paragraphs = expr:((NIhO_clause+ paragraphs_1?)+ / paragraphs_1 (NIhO_clause+ paragraphs_1?)*) {return _node("paragraphs", expr);}
// //////// _NIhO JOI, NIhO (BAI) BO: jmina la'o zoi paragraphs_1 zoi joi la'o zoi paragraphs_2 zoi_20150824UTC
paragraphs_1 = expr:(paragraphs_2 (NIhO_clause+ joik paragraphs_2)*) {return _node("paragraphs_1", expr);}
paragraphs_2 = expr:(paragraph (NIhO_clause+ joik? tag? BO_clause paragraph)*) {return _node("paragraphs_2", expr);}
paragraph = expr:((I_clause (statement_terms / fragment)?)+ / (statement_terms / fragment) (I_clause (statement_terms / fragment)?)*) {return _node("paragraph", expr);}
// // // la'a zo VAU na'e se nitcu isemu'i bo na'e la'o zoi tail_terms zoi cu se lidne
statement_terms = expr:(statement IAU_elidible terms?) {return _node("statement_terms", expr);}
statement = expr:(statement_1 / prenex statement) {return _node("statement", expr);}
statement_1 = expr:(statement_2 (I_clause joik statement_2)*) {return _node("statement_1", expr);}
statement_2 = expr:(statement_3 (I_clause joik? tag? BO_clause statement_3)*) {return _node("statement_2", expr);}
statement_3 = expr:(sentence / tag? TUhE_clause paragraphs TUhU_elidible / gek_statement) {return _node("statement_3", expr);}
// // // ganai da'i curmi lo nu la gek lidne no gik gi lu ga ra broda gi ri brode li'u na se genturfa'i iki'ubo lo nu zo ga kuspe zo ra po'o i ka'e stika sepi'o zoi zoi !term zoi mu'a i ku'i lo gerna cu co'a no'e sampu
gek_statement = expr:(gek statement (gik statement)+ GIhI_elidible) {return _node("gek_statement", expr);}
// ([by BOI] VAU)
// ([by BOI] [joi {pa BOI}])
// ([{by BOI} {joi <pa BOI> <by BOI>}] VAU)
// ([{vei <(¹by BOI¹) (¹joi [pa BOI]¹)> VEhO} {by BOI}] VAU)
// (vei [{by BOI} {joi <pa BOI>} {joi <by BOI>}] VEhO)
// ([{<by BOI> <joi (¹pa BOI¹) (¹by BOI¹)>} da] VAU)
// fragment //////// _vimcu lo cfila pe la zantufa xisu'o0.6: i galfi zoi zoi joik zoi zoizoi !terms joik zoi tezu'e lo nu genturfa'i lu joigiragiri li'u_20150819UTC
// fragment //////// _danfu lo ge'i zei preti i jmina zoizoi !terms gek zoi i zoizoi !terms zoi cu jai se zukte fi tu'a lu joigiragiri li'u_20160719UTC
fragment = expr:(prenex / !terms gek / !terms joik / ek / gihek / NA_clause !terms !KU / terms VAU_elidible !mex / mex / relative_clauses / links / linkargs) {return _node("fragment", expr);}
prenex = expr:(terms ZOhU_clause) {return _node("prenex", expr);}
// sentence //////// _vimcu lo cfila noi ca tu'a lo 0.7 moi co'a pagbu i galfi zoizoi terms? (CU_elidible bridi_tail / gek sentence (gik sentence)+ GIhI_elidible) zoi zoizoi terms? CU_elidible bridi_tail / terms gek sentence (gik sentence)+ GIhI_elidible zoi tezu'e tu'a lu ([ge {da CU <broda VAU>} {gi <CU (¹brode VAU¹)> <i je (¹CU [brodi VAU]¹)>} GIhI] IAU) li'u e lu ([{da ge <da CU (¹broda VAU¹)> <gi (¹CU [brode VAU]¹)> GIhI} {i je <CU (¹brodi VAU¹)>}] IAU) li'u_20160520UTC
// sentence //////// _vimcu lo cfila i galfi zoizoi terms gek sentence (gik sentence)+ GIhI_elidible zoi zoizoi terms? gek sentence (gik sentence)+ GIhI_elidible tail_terms zoi tezu'e lo nu stura fa mu'a zoizoi ([ge {cu <broda VAU>} {gi <CU (¹brode vau¹)>} GIhI {ta VAU}] IAU) zoi_20161030UTC
sentence = expr:(terms? CU_elidible bridi_tail / terms? gek sentence (gik sentence)+ GIhI_elidible tail_terms) {return _node("sentence", expr);}
bridi_tail = expr:(bridi_tail_1 (joik_gihek tag? CU_elidible bridi_tail_1)*) {return _node("bridi_tail", expr);}
bridi_tail_1 = expr:(bridi_tail_2 (joik_gihek !(tag? BO_clause) !(tag? KE_clause) CU_elidible bridi_tail_2 tail_terms)*) {return _node("bridi_tail_1", expr);}
// bridi_tail_2 //////// _curmi tu'a lo'u broda babocu brode le'u i galfi zoizoi joik_gihek tag? zoi zoizoi (tag / joik_gihek tag?) zoi_20160623UTC
bridi_tail_2 = expr:(bridi_tail_3 ((tag / joik_gihek tag?) BO_clause CU_elidible bridi_tail_3 tail_terms)*) {return _node("bridi_tail_2", expr);}
bridi_tail_3 = expr:(KE_clause !(selbri_2 KEhE) bridi_tail KEhE_elidible tail_terms / selbri tail_terms / gek_bridi_tail) {return _node("bridi_tail_3", expr);}
// // // za'a nitcu fa zoizoi / tag* KE_clause free* gek_bridi_tail KEhE_elidible free* / NA_clause free* gek_bridi_tail zoi
// gek_bridi_tail //////// _vimcu lo cfila i galfi zoizoi !term zoi zoizoi !(gik (term / CU)) zoi tezuhelonu genturfahi lu ge broda gi brode gi brodi ... gi cu brodo li'u_20170103UTC
gek_bridi_tail = expr:(gek bridi_tail (gik bridi_tail)+ !(gik (term / CU)) GIhI_elidible tail_terms / tag* KE_clause gek_bridi_tail KEhE_elidible / NA_clause gek_bridi_tail) {return _node("gek_bridi_tail", expr);}
//// EXP-FIX: tag? KE --> tag* KE
//// EXP: Bridi-tail nonabsorbable terms implementation
tail_terms = expr:(term* VAU_elidible) {return _node_nonempty("tail_terms", expr); }
// // // aunai curmi lo'u terms joi terms le'u ki'u lo nu na'e sarcu fa lo nu jimpe fi lo'u ke gauku naku ke'e je ke faku caku ke'e le'u i ei la joik cu pagbu la term jenai la terms iji'a ganai da'i tezu'e lo nu sampu kei la term cu curmi tu'a zoizoi joik_ek? zoi gi lo drata ke gerna pagbu cu co'u plixau mu'u ra'ai goi
terms = expr:(term+) {return _node("terms", expr);}
/*** EXP-SELBRITCITA-FIX ***/
// term //////// _galfi zoizoi joik_ek zoi zoizoi !(joik tag BO_clause? CU) joik_ek zoi tezu'e tu'a lu ([CU {broda <da VAU>} {je ba cu <brode VAU> VAU}] IAU) li'u_20160520UTC
term = expr:(term_1 (!(joik tag BO_clause? CU) joik_ek term_1)*) {return _node("term", expr);}
term_1 = expr:(term_2 (joik_ek? BO_clause term_2)*) {return _node("term_1", expr);}
// term_2 //////// _vimcu lo cfila i va'i jmina zoizoi !joik_gihek zoi ja'e lo nu stura fa lo'u ([CU {<co'a broda> VAU} {na gi'a} CU {brode VAU} VAU] IAU) le'u_20160404UTC
// term_2 //////// _cipra: galfi zoizoi NA_clause !bridi_tail !joik_gihek KU_elidible zoi zo brigahi_20160608UTC
// term_2 //////// _jmina zoizoi !(sumti KEhE) zoi tezu'e tu'a lu ke da ke'e noi broda li'u_20170203UTC
term_2 = expr:(XOI_clause statement SEhU_elidible / KE_clause !(sumti KEhE) term+ KEhE_elidible / tag_term / !tag sumti / brigahi / gek_term) {return _node("term_2", expr);}
// //////// _cipra: jmina la briga'i i va'o lo nu zo ka'e joi lo simsa cu cmavo ma'oi NA kei zabna fa lo nu ma'oi NA ji'a claxu ma'oi KU_20160608UTC
brigahi = expr:((POIhA_clause free* selbri / NA_clause !bridi_tail !joik_gihek ) KU_elidible) {return _node("brigahi", expr); }
// tag_term //////// _la'o zoi tanru_unit_2 zoi binxo la'o zoi tanru_unit_1 zoi_20150810UTC
// tag_term //////// _curmi tu'a lo'u broda babocu brode le'u i jmina zoizoi !BO zoi_20160623UTC
// tag_term //////// _zanru tu'a la oz i ei zo jai ka'e tcita lo sumti i ku'i lu pu se manci vlipa jai se gasnu li'u ji'a ru'i ei gendra i galfi zoizoi FA_clause (joik FA_clause)* zoi zoizoi (FA_clause (joik FA_clause)* / JAI_clause tag?) zoi_20160629UTC
tag_term = expr:(!gek (tag !(!tag selbri) !gek_bridi_tail !BO / (FA_clause (joik FA_clause)* / JAI_clause tag?) !tanru_unit_1) (sumti / KU_elidible)) {return _node("tag_term", expr);}
/*** END EXP-SELBRITCITA-FIX ***/
gek_term = expr:(gek term+ (gik term+)+ GIhI_elidible) {return _node("gek_term", expr);}
/*** EXP-SELBRITCITA-FIX ***/
/*** END EXP-SELBRITCITA-FIX ***/
/// ///
sumti = expr:(sumti_1 (VUhO_clause relative_clauses)?) {return _node("sumti", expr);}
sumti_1 = expr:(sumti_2 (joik_ek sumti_2)*) {return _node("sumti_1", expr);}
sumti_2 = expr:(sumti_3 (joik_ek? tag? BO_clause sumti_3)*) {return _node("sumti_2", expr);}
// sumti_3 //////// _jmina zoi zoi relative_clauses? zoi te zu'e lo nu ma'oi VUhO na jai sarcu tu'a lo ra'abri noi se li'erla'i lo li'erla'i jonma'o sumti_20170203UTC
sumti_3 = expr:((KE_clause sumti KEhE_elidible / sumti_4 / gek sumti (gik sumti)+ GIhI_elidible) relative_clauses?) {return _node("sumti_3", expr);}
// sumti_4 //////// _vimcu zoizoi relative_clauses? zoi imu'ibo lo sumti_3 co'a se pagbu lo se go'i_20170203UTC
sumti_4 = expr:(quantifier? sumti_5 / quantifier selbri KU_elidible) {return _node("sumti_4", expr);}
// // // !(!joik_ek operator) : tu'a zoizoi !joik_ek zoi cu sarcu lo nu lu by joi (vei) pa (ve'o) by li'u cu sumti
// sumti_5 //////// _vimcu lo cfila: galfi zoizoi lerfu_string BOI_elidible free* !(BO_clause* free* operand* !(joik_ek sumti) operator) !(operand KEhE) zoi zoizoi lerfu_string BOI_elidible free* !(BO_clause* free* operand* !(joik_ek (sumti / relative_clause)) operator) !(operand KEhE) zoi tezu'e tu'a lu da poi broda sy joi noi brode li'u_20151118UTC
sumti_5 = expr:(RAhOI_clause / ZO_clause / ZOI_clause / LOhU_clause / lerfu_string BOI_elidible !(BO_clause* operand* !(joik_ek (sumti / relative_clause)) operator) !(operand KEhE) / LU_clause text LIhU_elidible / (LAhE_clause / NAhE_clause BO_clause) relative_clauses? sumti LUhU_elidible / KOhA_clause / LOhOI_clause (joik LOhOI_clause)* statement KUhAU_elidible / LE_clause sumti_tail KU_elidible / li_clause / NAhE_clause sumti_3) {return _node("sumti_5", expr);}
li_clause = expr:(LI_clause mex LOhO_elidible) {return _node("li_clause", expr); }
// sumti_tail //////// _galfi zoizoi (sumti_5 relative_clauses?)? sumti_tail_1 / relative_clauses sumti_tail_1 zoi zoizoi relative_clauses? (!quantifier sumti)? sumti_tail_1 zoi tezu'e tu'a lu ([lo {<mi (¹joi [by BOI]¹)> broda} KU] VAU) li'u enai lu ([lo {mi <joi (¹by BOI¹) KUhE> broda} KU] VAU) li'u_20151119UTC
sumti_tail = expr:(relative_clauses? (!quantifier sumti)? sumti_tail_1) {return _node("sumti_tail", expr); }
// sumti_tail_1 //////// _vimcu zoizoi relative_clauses? zoi ki'u lo nu vo'e co'a pagbu la'o zoi selbri_1 zoi_20150810UTC
// sumti_tail_1 //////// _galfi zoizoi selbri / quantifier selbri zoi zoizoi quantifier? selbri zoi_20150811UTC
// // // lo'u lo goi bai broda le'u einai se genturfa'i fi'o frica la camxes
// sumti_tail_1 //////// _zanru tu'a la oz i lo'u lo vi so'i smacu le'u ei se genturfa'i i jmina zoi zoi tag? zoi_20160629UTC
sumti_tail_1 = expr:(tag? quantifier? selbri / quantifier sumti) {return _node("sumti_tail_1", expr);}
relative_clauses = expr:(relative_clause (joik? relative_clause)*) {return _node("relative_clauses", expr); }
relative_clause = expr:(GOI_clause term GEhU_elidible / NOI_clause statement KUhO_elidible) {return _node("relative_clause", expr); }
// selbri //////// _gau melbi: zoizoi NA_clause selbri zoi muvdu ti la'o zoi selbri_1 zoi i jalge fa tu'a zoizoi selbri_1 / !gek tag selbri / NA_clause selbri zoi_20150810UTC
// selbri //////// _galfi zoizoi !gek tag selbri zoi zoizoi tag selbri zoi ki'u lo nu za'a co'u nabmi fi tu'a lu pugi broda gi brode i gipu broda gi brode li'u_20150819UTC
selbri = expr:(selbri_1 / tag selbri / NA_clause selbri) {return _node("selbri", expr); }
// selbri_1 //////// _ma'oi CEI cu .ei jongau lo selbri jenai lo selbrisle i jmina zoizoi (CEI_clause selbri)* zoi_20150810UTC
// selbri_1 //////// _jmina zoizoi relative_clauses? zoi_20150810UTC
// selbri_1 //////// _gau melbi: zoizoi NA_clause selbri zoi muvdu la'o zoi selbri zoi_20150810UTC
// selbri_1 //////// _tugni tu'a la oz: galfi zoizoi selbri_2 zoi zoizoi (!KE selbri_2 KEhE_clause linkargs / selbri_2) zoi_20160623UTC
selbri_1 = expr:((!KE selbri_2 KEhE_clause linkargs / selbri_2) relative_clauses? (CEI_clause selbri)*) {return _node("selbri_1", expr); }
selbri_2 = expr:(selbri_3 (CO_clause selbri_3)*) {return _node("selbri_2", expr); }
selbri_3 = expr:(selbri_4+) {return _node("selbri_3", expr); }
selbri_4 = expr:(selbri_5 (joik selbri_5)*) {return _node("selbri_4", expr); }
// // // xu lo sumti ja lo term zo'u gauku zo BO tsamau lo'u joi bo le'u sei la selbri_5 joi la selbri_6 cu se simsa
selbri_5 = expr:(selbri_6 (joik tag? BO_clause selbri_6)*) {return _node("selbri_5", expr); }
selbri_6 = expr:(tanru_unit (BO_clause tanru_unit)*) {return _node("selbri_6", expr); }
// tanru_unit = expr:(tanru_unit_1 (CEI_clause tanru_unit_1)*) {return _node("tanru_unit", expr); } //////// _ma'oi CEI cu .ei jongau lo selbri jenai lo selbrisle i vimcu_20150810UTC
// tanru_unit_1 //////// _ma'oi CEI cu .ei jongau lo selbri jenai lo selbrisle i binxo la'o zoi tanru_unit zoi_20150810UTC
// tanru_unit //////// _la'o zoi tanru_unit_2 zoi binxo la'o zoi tanru_unit_1 zoi_20150810UTC
tanru_unit = expr:(tanru_unit_1 linkargs?) {return _node("tanru_unit", expr); }
// tanru_unit_2 //////// _la'o zoi tanru_unit_2 zoi binxo la'o zoi tanru_unit_1 zoi_20150810UTC
// tanru_unit_1 //////// _jmina zoizoi MUhOI_clause zoi_20150819UTC
// tanru_unit_1 //////// _jmina zoizoi LUhEI_clause text LIhAU_elidible zoi_20150827UTC
// tanru_unit_1 //////// _vimcu lo cfila i galfi zoizoi !term zoi zoizoi !(gik? (term / CU)) zoi tezuhelonu genturfahi lu ge broda gi brode gi brodi ... gi cu brodo li'u_20170103UTC
tanru_unit_1 = expr:(CMEVLA_clause / BRIVLA_clause / GOhA_clause / KE_clause selbri_2 KEhE_elidible / NAhE_clause? gek selbri_2 (gik selbri_2)+ !(gik? (term / CU)) GIhI_elidible / MUhOI_clause / GOhOI_clause / LUhEI_clause text LIhAU_elidible / ME_clause (sumti / operator+ / mex / tag) MEhU_elidible MOI_clause? / mex MOI_clause / (FA_clause (joik FA_clause)* / SE_clause) tanru_unit_1 / JAI_clause tag? tanru_unit_1 / NAhE_clause tanru_unit_1 / NU_clause (joik NU_clause)* statement KEI_elidible) {return _node("tanru_unit_1", expr); }
linkargs = expr:(BE_clause term links? BEhO_elidible) {return _node("linkargs", expr);}
links = expr:(BEI_clause term links?) {return _node("links", expr);}
quantifier = expr:(!sumti_5 !selbri mex relative_clauses?) {return _node("quantifier", expr); }
// // // ganai da'i curmi tu'a zoizoi mex_1* zoi gi me zoizoi ([by BOI] [su'i {re BOI} {by BOI}] VEhO) zoi i xauzma fa zoizoi ([{<by BOI> <su'i (¹re BOI¹)> VEhO} {by BOI}] VAU) zoi i ku'i va'o tu'a zoizoi VEI_clause? zoi tu'a zo ve'o cu se curmi i ku'i na'e melbi
mex = expr:(mex_1 (operator+ mex_1?)*) {return _node("mex", expr); }
// // // operator+ :
// // // ([pa BOI] [pi'i pi'i] [pa BOI])
// // // ([pa BOI] [pi'i {pe'o pi'i <pa BOI> KUhE}])
mex_1 = expr:((KE_clause mex_2+ KEhE_elidible / mex_2 (BO_clause mex_2)*) (BIhE_clause operator+ (KE_clause mex_2+ KEhE_elidible / mex_2 (BO_clause mex_2)*)?)*) {return _node("mex_1", expr); }
mex_2 = expr:(operand / mex_rp / mex_forethought) {return _node("mex_2", expr); }
mex_rp = FUhA_clause mex_2+ operator (mex_2* operator)* KUhE_elidible
// This is just to make for clearer parse trees
mex_forethought = !(lerfu_string BOI_elidible) operator mex_2+ mex_forethought? KUhE_elidible / PEhO_clause operator mex_2+ mex_forethought? KUhE_elidible
// Right recursive version.
operator = expr:(SE_clause operator / NAhE_clause operator / MAhO_clause (mex / selbri / sumti) TEhU_elidible / VUhU_clause / joik_ek) {return _node("operator", expr); }
// // // (na'e (pa da)) , (vei (na'e pa)) da
// // // la'a na nitcu lo'u mo'e operand te'u le'u iki'ubo lu vu'u tu'o li'u mekso
operand = expr:(number BOI_elidible / lerfu_string BOI_elidible / VEI_clause mex VEhO_elidible / MOhE_clause (selbri / sumti) TEhU_elidible / (LAhE_clause / NAhE_clause BO_clause) mex LUhU_elidible / NAhE_clause operand) {return _node("operand", expr); }
number = expr:(PA_clause+) {return _node("number", expr); }
lerfu_string = expr:(lerfu_word+) {return _node("lerfu_string", expr); }
// ** BU clauses are part of BY_clause
lerfu_word = expr:(BY_clause / LAU_clause lerfu_word / TEI_clause lerfu_string FOI_clause) {return _node("lerfu_word", expr); }
ek = expr:(NA_clause? SE_clause? A_clause) {return _node("ek", expr); }
gihek = expr:(NA_clause? SE_clause? GIhA_clause) {return _node("gihek", expr); }
joik = expr:(GAhO_clause? NA_clause? SE_clause? JOI_clause GAhO_clause?) {return _node("joik", expr); }
joik_ek = expr:(joik / ek) {return _node("joik_ek", expr); }
joik_gihek = expr:(joik / gihek) {return _node("joik_gihek", expr); }
// gek //////// _curmi tu'a lo'u gonaibo le'u tezu'e lo nu lu gonai broda gi brode gi brodi li'u lu gonaibo broda gi brode gi brodi li'u frica lo ka smuni i sa'unai lo pamoi cu smudu'i lu go na broda gi brode gi brodi li'u ije lo remoi cu smudu'i la'e lo pamei be zo broda jo'u zo brode jo'u zo brodi i galfi zoizoi SE_clause? GA_clause / GI_clause (joik / tag) (BO_clause)? / (joik / tag) GI_clause (BO_clause)? zoi zoizoi (SE_clause? GA_clause / GI_clause (joik / tag) / (joik / tag) GI_clause) BO_clause? zoi_20160617UTC
gek = expr:((SE_clause? GA_clause / GI_clause (joik / tag) / (joik / tag) GI_clause) BO_clause?) {return _node("gek", expr); }
gik = expr:(GI_clause) {return _node("gik", expr); }
tag = expr:(tcita_selci+ (joik tcita_selci+)*) {return _node("tag", expr); }
// tcita_selci //////// _jmina zoizoi ? zoi zoizoi mex ROI_clause zoi tezu'e lo nu lo'u jai re'u broda le'u gendra_20170706UTC_
tcita_selci = expr:((NAhE_clause / SE_clause) tcita_selci / BAI_clause / mex? ROI_clause / FIhO_clause selbri FEhU_elidible) {return _node("tcita_selci", expr); }
// free //////// _galfi zoizoi selbri relative_clauses? zoi zoizoi selbri zoi ki'u lo nu zoizoi relative_clauses? zoi co'a pagbu la'o zoi selbri_1 zoi_20150810UTC
// // // _au zo sei cmavo ma'oi COI ije ma'oi SEI co'a se cmene zo SOI i ku'i va'o la'e di'u lo sumti na'e ka'e jbini zo sei ce lo selbrisni ja'e lo nu lo so'i pu jufra cu co'u gendra i no'e jdice_20160426
free = expr:(SEI_clause statement SEhU_elidible / vocative relative_clauses? selbri DOhU_elidible / vocative sumti? DOhU_elidible / mex_2 MAI_clause / TO_clause text TOI_elidible / xi_clause / LOhAI_clause / (UI_clause !BU_clause)+) {return _node("free", expr); }
xi_clause = expr:(XI_clause mex_2) {return _node("xi_clause", expr); }
vocative = expr:(COI_clause+) {return _node("vocative", expr); }
// ****************
// Magic Words
// ****************
bu_clause = expr:(pre_clause post:bu_clause_no_pre) {return _node("bu_clause", expr); }
bu_clause_no_pre = expr:((si_word / SU spaces?) bu_tail+ lerfu_post_clause) {return _node("bu_clause_no_pre", expr); }
bu_tail = expr:BU_clause+ {return _node("bu_tail", expr); }
dot_star = expr:(.*) { ret = ""; for (i in expr) ret += (expr[i] === " ") ? "_" : expr[i]; return ret; }
// __ General Morphology Issues
//
// 1. Spaces (including '.y') and UI are eaten *after* a word.
//
// 3. BAhE is eaten *before* a word.
// Handling of what can go after a cmavo
post_clause = expr:(spaces? !BU_clause free*) {return _node_nonempty("post_clause", expr); }
number_post_clause = expr:(spaces? !BU_clause (!number free)*) {return _node_nonempty("number_post_clause", expr); }
lerfu_post_clause = expr:(spaces? !BU_clause (!lerfu_string free)*) {return _node_nonempty("lerfu_post_clause", expr); }
vocative_post_clause = expr:(spaces? !BU_clause (!vocative free)*) {return _node_nonempty("vocative_post_clause", expr); }
pre_clause = BAhE_clause? si_clause?
// Handling of spaces and things like spaces.
// ___ SPACE ___
// Do *NOT* delete the line above!
// SU clauses
su_clause = expr:((erasable_clause / su_valsi)* SU_clause) {return _node("su_clause", expr); }
// Handling of SI and interactions with zo and lo'u...le'u
si_clause = ((erasable_clause / si_word) si_clause? SI_clause)+
erasable_clause = expr:(bu_clause_no_pre !BU_clause) {return _node("erasable_clause", expr); }
su_valsi = expr:(si_word / !SU_clause !FAhO_clause any_word spaces?) {return _node("su_valsi", expr); }
// si_word //////// _galfi zoi ly ZOI ly zoi ly (ZOI / MUhOI) ly_20150819UTC
// si_word //////// _vimcu lo cfila no'u mu'a zoizoi ([RAhOI:ra'oi vla:tai] VAU) zoi i galfi zoizoi (initial_rafsi / gismu / CVV_final_rafsi / stressed_initial_rafsi short_final_rafsi) zoi zoizoi (y_rafsi / y_less_rafsi / gismu) zoi_20160414UTC
// si_word //////// vimcu lo cfila i galfi zoizoi RAhOI spaces? (y_rafsi / y_less_rafsi / gismu) zoi zoizoi RAhOI spaces? (y_rafsi / long_rafsi / y_less_rafsi / gismu) zoi_20160909UTC
si_word = (CMEVLA / BRIVLA / RAhOI spaces? (y_rafsi / long_rafsi / y_less_rafsi / gismu) / GOhOI spaces? any_word / ZO spaces? any_word / (LOhAI spaces? (!LOhAI !LEhAI any_word)*)? (LOhAI spaces? (!LOhAI !LEhAI any_word)*)? LEhAI / LOhU spaces? (!LEhU any_word)* LEhU / (ZOI / MUhOI) spaces? zoi_open spaces? zoi_word* zoi_close / !BU !SI !SU !FAhO CMAVO) spaces?
// ___ ELIDIBLE TERMINATORS ___
BEhO_elidible = expr:(BEhO_clause?) {return (expr == "") ? ["BEhO"] : _node("BEhO", expr);}
BOI_elidible = expr:(BOI_clause?) {return (expr == "") ? ["BOI"] : _node("BOI", expr);}
CU_elidible = expr:(CU_clause?) {return (expr == "") ? ["CU"] : _node("CU", expr);}
DOhU_elidible = expr:(DOhU_clause?) {return (expr == "") ? ["DOhU"] : _node("DOhU", expr);}
FEhU_elidible = expr:(FEhU_clause?) {return (expr == "") ? ["FEhU"] : _node("FEhU", expr);}
// FOI and FUhO are never elidible
GEhU_elidible = expr:(GEhU_clause?) {return (expr == "") ? ["GEhU"] : _node("GEhU", expr);}
GIhI_elidible = expr:(GIhI_clause?) {return (expr == "") ? ["GIhI"] : _node("GIhI", expr);}
IAU_elidible = expr:(IAU_clause?) {return (expr == "") ? ["IAU"] : _node("IAU", expr);}
KEI_elidible = expr:(KEI_clause?) {return (expr == "") ? ["KEI"] : _node("KEI", expr);}
KEhE_elidible = expr:(KEhE_clause?) {return (expr == "") ? ["KEhE"] : _node("KEhE", expr);}
KU_elidible = expr:(KU_clause?) {return (expr == "") ? ["KU"] : _node("KU", expr);}
KUhAU_elidible = expr:(KUhAU_clause?) {return (expr == "") ? ["KUhAU"] : _node("KUhAU", expr);}
KUhE_elidible = expr:(KUhE_clause?) {return (expr == "") ? ["KUhE"] : _node("KUhE", expr);}
KUhO_elidible = expr:(KUhO_clause?) {return (expr == "") ? ["KUhO"] : _node("KUhO", expr);}
// LEhU is never elidible
// //////// jmina zoizoi LIhAU_elidible zoi_20150827UTC
LIhAU_elidible = expr:(LIhAU_clause?) {return (expr == "") ? ["LIhAU"] : _node("LIhAU", expr);}
LIhU_elidible = expr:(LIhU_clause?) {return (expr == "") ? ["LIhU"] : _node("LIhU", expr);}
LOhO_elidible = expr:(LOhO_clause?) {return (expr == "") ? ["LOhO"] : _node("LOhO", expr);}
LUhU_elidible = expr:(LUhU_clause?) {return (expr == "") ? ["LUhU"] : _node("LUhU", expr);}
MEhU_elidible = expr:(MEhU_clause?) {return (expr == "") ? ["MEhU"] : _node("MEhU", expr);}
SEhU_elidible = expr:(SEhU_clause?) {return (expr == "") ? ["SEhU"] : _node("SEhU", expr);}
TEhU_elidible = expr:(TEhU_clause?) {return (expr == "") ? ["TEhU"] : _node("TEhU", expr);}
TOI_elidible = expr:(TOI_clause?) {return (expr == "") ? ["TOI"] : _node("TOI", expr);}
TUhU_elidible = expr:(TUhU_clause?) {return (expr == "") ? ["TUhU"] : _node("TUhU", expr);}
VAU_elidible = expr:(VAU_clause?) {return (expr == "") ? ["VAU"] : _node("VAU", expr);}
VEhO_elidible = expr:(VEhO_clause?) {return (expr == "") ? ["VEhO"] : _node("VEhO", expr);}
// ___ SELMAHO ___
// Do *NOT* delete the line above!
BRIVLA_clause = expr:(BRIVLA_pre BRIVLA_post) {return (expr.length == 2) ? _node2("BRIVLA_clause", expr[0], expr[1]) : _node("BRIVLA_clause", expr[0]); }
BRIVLA_pre = pre_clause BRIVLA spaces?
BRIVLA_post = post_clause
CMEVLA_clause = pre:CMEVLA_pre post:CMEVLA_post {return _node2("CMEVLA_clause", pre, post); }
CMEVLA_pre = pre_clause CMEVLA spaces?
CMEVLA_post = post_clause
CMAVO_clause = pre:CMAVO_pre post:CMAVO_post {return _node2("CMAVO_clause", pre, post); }
CMAVO_pre = pre_clause CMAVO spaces?
CMAVO_post = post_clause
// eks; basic afterthought logical connectives
A_clause = pre:A_pre post:A_post {return _node2("A_clause", pre, post); }
A_pre = pre_clause A spaces?
A_post = post_clause
// modal operators
BAI_clause = pre:BAI_pre post:BAI_post {return _node2("BAI_clause", pre, post); }
BAI_pre = pre_clause BAI spaces?
BAI_post = post_clause
// next word intensifier
BAhE_clause = expr:(BAhE_pre BAhE_post)+ {return _node("BAhE_clause", expr); }
BAhE_pre = BAhE spaces?
BAhE_post = si_clause? !BU_clause
// sumti link to attach sumti to a selbri
BE_clause = pre:BE_pre post:BE_post {return _node2("BE_clause", pre, post); }
BE_pre = pre_clause BE spaces?
BE_post = post_clause
// multiple sumti separator between BE, BEI
BEI_clause = pre:BEI_pre post:BEI_post {return _node2("BEI_clause", pre, post); }
BEI_pre = pre_clause BEI spaces?
BEI_post = post_clause
// terminates BEBEI specified descriptors
BEhO_clause = pre:BEhO_pre post:BEhO_post {return _node2("BEhO_clause", pre, post); }
BEhO_pre = pre_clause BEhO spaces?
BEhO_post = post_clause
// prefix for high_priority MEX operator
BIhE_clause = pre:BIhE_pre post:BIhE_post {return _node2("BIhE_clause", pre, post); }
BIhE_pre = pre_clause BIhE spaces?
BIhE_post = post_clause
// interval component of JOI
// joins two units with shortest scope
BO_clause = pre:BO_pre post:BO_post {return _node2("BO_clause", pre, post); }
BO_pre = pre_clause BO spaces?
BO_post = post_clause
// number or lerfu_string terminator
BOI_clause = pre:BOI_pre post:BOI_post {return _node2("BOI_clause", pre, post); }
BOI_pre = pre_clause BOI spaces?
BOI_post = post_clause
// turns any word into a BY lerfu word
BU_clause = pre:BU_pre post:BU_post {return _node2("BU_clause", pre, post); }
BU_pre = pre_clause BU spaces?
BU_post = spaces?
// individual lerfu words
BY_clause = expr:(BY_pre BY_post / bu_clause) {return (expr[0] == "bu_clause") ? ["BY_clause", expr] : _node2("BY_clause", expr[0], expr[1]); }
BY_pre = pre_clause BY spaces?
BY_post = lerfu_post_clause
// specifies actualitypotentiality of tense
// afterthought intensity marker
// pro_bridi assignment operator
CEI_clause = pre:CEI_pre post:CEI_post {return _node2("CEI_clause", pre, post); }
CEI_pre = pre_clause CEI spaces?
CEI_post = post_clause
// afterthought term list connective
// names; require consonant end, then pause no
// LA or DOI selma'o embedded, pause before if
// vowel initial and preceded by a vowel
// tanru inversion
CO_clause = pre:CO_pre post:CO_post {return _node2("CO_clause", pre, post); }
CO_pre = pre_clause CO spaces?
CO_post = post_clause
COI_clause = pre:COI_pre post:COI_post {return _node2("COI_clause", pre, post); }
COI_pre = pre_clause COI spaces?
COI_post = vocative_post_clause
// vocative marker permitted inside names; must
// always be followed by pause or DOI
// separator between head sumti and selbri
CU_clause = pre:CU_pre post:CU_post {return _node2("CU_clause", pre, post); }
CU_pre = pre_clause CU spaces?
CU_post = post_clause
// tensemodal question
// cancel anaphoracataphora assignments
// vocative marker
// DOI_clause = pre:DOI_pre post:DOI_post {return _node2("DOI_clause", pre, post); }
// DOI_pre = pre_clause DOI spaces?
// DOI_post = post_clause
// terminator for DOI_marked vocatives
DOhU_clause = pre:DOhU_pre post:DOhU_post {return _node2("DOhU_clause", pre, post); }
DOhU_pre = pre_clause DOhU spaces?
DOhU_post = post_clause
// modifier head generic case tag
FA_clause = pre:FA_pre post:FA_post {return _node2("FA_clause", pre, post); }
FA_pre = pre_clause FA spaces?
FA_post = post_clause
// superdirections in space
// normally elided 'done pause' to indicate end
// of utterance string
FAhO_clause = expr:(pre_clause FAhO spaces?) {return _node("FAhO_clause", expr);}
// space interval mod flag
// ends bridi to modal conversion
FEhU_clause = pre:FEhU_pre post:FEhU_post {return _node2("FEhU_clause", pre, post); }
FEhU_pre = pre_clause FEhU spaces?
FEhU_post = post_clause
// marks bridi to modal conversion
FIhO_clause = pre:FIhO_pre post:FIhO_post {return _node2("FIhO_clause", pre, post); }
FIhO_pre = pre_clause FIhO spaces?
FIhO_post = post_clause
// end compound lerfu
FOI_clause = pre:FOI_pre post:FOI_post {return _node2("FOI_clause", pre, post); }
FOI_pre = pre_clause FOI spaces?
FOI_post = post_clause
// reverse Polish flag
FUhA_clause = pre:FUhA_pre post:FUhA_post {return _node2("FUhA_clause", pre, post); }
FUhA_pre = pre_clause FUhA spaces?
FUhA_post = post_clause
// open long scope for indicator
// close long scope for indicator
// geks; forethought logical connectives
GA_clause = pre:GA_pre post:GA_post {return _node2("GA_clause", pre, post); }
GA_pre = pre_clause GA spaces?
GA_post = post_clause
// openclosed interval markers for BIhI
GAhO_clause = pre:GAhO_pre post:GAhO_post {return _node2("GAhO_clause", pre, post); }
GAhO_pre = pre_clause GAhO spaces?
GAhO_post = post_clause
// marker ending GOI relative clauses
GEhU_clause = pre:GEhU_pre post:GEhU_post {return _node2("GEhU_clause", pre, post); }
GEhU_pre = pre_clause GEhU spaces?
GEhU_post = post_clause
// forethought medial marker
GI_clause = pre:GI_pre post:GI_post {return _node2("GI_clause", pre, post); }
GI_pre = pre_clause GI spaces?
GI_post = post_clause
// logical connectives for bridi_tails
GIhA_clause = pre:GIhA_pre post:GIhA_post {return _node2("GIhA_clause", pre, post); }
GIhA_pre = pre_clause GIhA spaces?
GIhA_post = post_clause
// famyma'o zoizoi gek ... (gik ...)+ zoi
GIhI_clause = pre:GIhI_pre post:GIhI_post {return _node2("GIhI_clause", pre, post); }
GIhI_pre = pre_clause GIhI spaces?
GIhI_post = post_clause
// attaches a sumti modifier to a sumti
GOI_clause = pre:GOI_pre post:GOI_post {return _node2("GOI_clause", pre, post); }
GOI_pre = pre_clause GOI spaces?
GOI_post = post_clause
// pro_bridi
GOhA_clause = pre:GOhA_pre post:GOhA_post {return _node2("GOhA_clause", pre, post); }
GOhA_pre = pre_clause GOhA spaces?
GOhA_post = post_clause
GOhOI_clause = pre:GOhOI_pre post:GOhOI_post {return _node2("GOhOI_clause", pre, post); }
GOhOI_pre = pre_clause GOhOI spaces? any_word spaces?
GOhOI_post = post_clause
// GEK for tanru units, corresponds to JEKs
// sentence link
I_clause = expr:(I_pre I_post) {return _node("I_clause", expr); }
I_pre = pre_clause I spaces?
I_post = post_clause
IAU_clause = pre:IAU_pre post:IAU_post {return _node2("IAU_clause", pre, post); }
IAU_pre = pre_clause IAU spaces?
IAU_post = post_clause
// jeks; logical connectives within tanru
// modal conversion flag
JAI_clause = pre:JAI_pre post:JAI_post {return _node2("JAI_clause", pre, post); }
JAI_pre = pre_clause JAI spaces?
JAI_post = post_clause
// flags an array operand
// non_logical connectives
JOI_clause = pre:JOI_pre post:JOI_post {return _node2("JOI_clause", pre, post); }
JOI_pre = pre_clause JOI spaces?
JOI_post = post_clause
// left long scope marker
KE_clause = pre:KE_pre post:KE_post {return _node2("KE_clause", pre, post); }
KE_pre = pre_clause KE spaces?
KE_post = post_clause
// right terminator for KE groups
KEhE_clause = pre:KEhE_pre post:KEhE_post {return _node2("KEhE_clause", pre, post); }
KEhE_pre = pre_clause KEhE spaces?
KEhE_post = post_clause
// right terminator, NU abstractions
KEI_clause = pre:KEI_pre post:KEI_post {return _node2("KEI_clause", pre, post); }
KEI_pre = pre_clause KEI spaces?
KEI_post = post_clause
// multiple utterance scope for tenses
// sumti anaphora
KOhA_clause = pre:KOhA_pre post:KOhA_post {return _node2("KOhA_clause", pre, post); }
KOhA_pre = pre_clause KOhA spaces?
KOhA_post = post_clause
// right terminator for descriptions, etc.
KU_clause = pre:KU_pre post:KU_post {return _node2("KU_clause", pre, post); }
KU_pre = pre_clause KU spaces?
KU_post = post_clause
KUhAU_clause = pre:KUhAU_pre post:KUhAU_post {return _node2("KUhAU_clause", pre, post); }
KUhAU_pre = pre_clause KUhAU spaces?
KUhAU_post = post_clause
// MEX forethought delimiter
KUhE_clause = pre:KUhE_pre post:KUhE_post {return _node2("KUhE_clause", pre, post); }
KUhE_pre = pre_clause KUhE spaces?
KUhE_post = post_clause
// right terminator, NOI relative clauses
KUhO_clause = pre:KUhO_pre post:KUhO_post {return _node2("KUhO_clause", pre, post); }
KUhO_pre = pre_clause KUhO spaces?
KUhO_post = post_clause
// name descriptors
// lerfu prefixes
LAU_clause = pre:LAU_pre post:LAU_post {return _node2("LAU_clause", pre, post); }
LAU_pre = pre_clause LAU spaces?
LAU_post = post_clause
// sumti qualifiers
LAhE_clause = pre:LAhE_pre post:LAhE_post {return _node2("LAhE_clause", pre, post); }
LAhE_pre = pre_clause LAhE spaces?
LAhE_post = post_clause
// sumti descriptors
LE_clause = pre:LE_pre post:LE_post {return _node2("LE_clause", pre, post); }
LE_pre = pre_clause LE spaces?
LE_post = post_clause
// possibly ungrammatical text right quote
LEhU_clause = pre:LEhU_pre post:LEhU_post {return _node2("LEhU_clause", pre, post); }
LEhU_pre = pre_clause LEhU spaces?
LEhU_post = spaces?
// convert number to sumti
LI_clause = pre:LI_pre post:LI_post {return _node2("LI_clause", pre, post); }
LI_pre = pre_clause LI spaces?
LI_post = post_clause
// //////// _jmina zoizoi LIhAU_clause, LIhAU_pre, LIhAU_post zoi_20150827UTC
// famyma'o ma'oi LUhEI
LIhAU_clause = pre:LIhAU_pre post:LIhAU_post {return _node2("LIhAU_clause", pre, post); }
LIhAU_pre = pre_clause LIhAU spaces?
LIhAU_post = post_clause
// grammatical text right quote
LIhU_clause = pre:LIhU_pre post:LIhU_post {return _node2("LIhU_clause", pre, post); }
LIhU_pre = pre_clause LIhU spaces?
LIhU_post = post_clause
LOhAI_clause = pre:LOhAI_pre post:LOhAI_post {return _node2("LOhAI_clause", pre, post); }
LOhAI_pre = pre_clause (LOhAI spaces? (!LOhAI !LEhAI any_word)*)? (LOhAI spaces? (!LOhAI !LEhAI any_word)*)? LEhAI spaces?
LOhAI_post = post_clause
// elidable terminator for LI
LOhO_clause = pre:LOhO_pre post:LOhO_post {return _node2("LOhO_clause", pre, post); }
LOhO_pre = pre_clause LOhO spaces?
LOhO_post = post_clause
// lo nu galfi lo bridi lo sumti cu cfari
LOhOI_clause = pre:LOhOI_pre post:LOhOI_post {return _node2("LOhOI_clause", pre, post); }
LOhOI_pre = pre_clause LOhOI spaces?
LOhOI_post = post_clause
// possibly ungrammatical text left quote
LOhU_clause = pre:LOhU_pre post:LOhU_post {return _node2("LOhU_clause", pre, post); }
LOhU_pre = pre_clause LOhU spaces? (!LEhU any_word)* LEhU_clause spaces?
LOhU_post = post_clause
// grammatical text left quote
LU_clause = pre:LU_pre post:LU_post {return _node2("LU_clause", pre, post); }
LU_pre = pre_clause LU spaces?
LU_post = post_clause
// //////// _jmina zoizoi LUhEI_clause, LUhEI_pre, LUhEI_post zoi_20150827UTC
// galfi lo se li'erla'i selsku lo selbrisle
LUhEI_clause = pre:LUhEI_pre post:LUhEI_post {return _node2("LUhEI_clause", pre, post); }
LUhEI_pre = pre_clause LUhEI spaces?
LUhEI_post = post_clause
// LAhE close delimiter
LUhU_clause = pre:LUhU_pre post:LUhU_post {return _node2("LUhU_clause", pre, post); }
LUhU_pre = pre_clause LUhU spaces?
LUhU_post = post_clause
// change MEX expressions to MEX operators
MAhO_clause = pre:MAhO_pre post:MAhO_post {return _node2("MAhO_clause", pre, post); }
MAhO_pre = pre_clause MAhO spaces?
MAhO_post = post_clause
// change numbers to utterance ordinals
MAI_clause = pre:MAI_pre post:MAI_post {return _node2("MAI_clause", pre, post); }
MAI_pre = pre_clause MAI spaces?
MAI_post = post_clause
// converts a sumti into a tanru_unit
ME_clause = pre:ME_pre post:ME_post {return _node2("ME_clause", pre, post); }
ME_pre = pre_clause ME spaces?
ME_post = post_clause
// terminator for ME
MEhU_clause = pre:MEhU_pre post:MEhU_post {return _node2("MEhU_clause", pre, post); }
MEhU_pre = pre_clause MEhU spaces?
MEhU_post = post_clause
// change sumti to operand, inverse of LI
MOhE_clause = pre:MOhE_pre post:MOhE_post {return _node2("MOhE_clause", pre, post); }
MOhE_pre = pre_clause MOhE spaces?
MOhE_post = post_clause
// motion tense marker
// change number to selbri
MOI_clause = pre:MOI_pre post:MOI_post {return _node2("MOI_clause", pre, post); }
MOI_pre = pre_clause MOI spaces?
MOI_post = post_clause
// //////// _galfi lo na'e lojbo lo selbrisle: jmina la'o zoi MUhOI_clause, MUhOI_pre, MUhOI_post zoi_20150819UTC
MUhOI_clause = pre:MUhOI_pre post:MUhOI_post {return _node2("MUhOI_clause", pre, post); }
MUhOI_pre = pre_clause MUhOI spaces? zoi_open spaces? zoi_word* zoi_close spaces?
MUhOI_post = post_clause
// bridi negation
NA_clause = pre:NA_pre post:NA_post {return _node2("NA_clause", pre, post); }
NA_pre = pre_clause NA spaces?
NA_post = post_clause
// attached to words to negate them
// scalar negation
NAhE_clause = pre:NAhE_pre post:NAhE_post {return _node2("NAhE_clause", pre, post); }
NAhE_pre = pre_clause NAhE spaces?
NAhE_post = post_clause
// change a selbri into an operator
// change selbri to operand; inverse of MOI
// new paragraph; change of subject
NIhO_clause = expr:(NIhO_pre NIhO_post) {return _node("NIhO_clause", expr); }
NIhO_pre = pre_clause NIhO spaces?
NIhO_post = post_clause
// attaches a subordinate clause to a sumti
NOI_clause = pre:NOI_pre post:NOI_post {return _node2("NOI_clause", pre, post); }
NOI_pre = pre_clause NOI spaces?
NOI_post = post_clause
// abstraction
NU_clause = pre:NU_pre post:NU_post {return _node2("NU_clause", pre, post); }
NU_pre = pre_clause NU spaces?
NU_post = post_clause
// change operator to selbri; inverse of MOhE
// marks the start of a termset
// marks the middle and end of a termset
// numbers and numeric punctuation
PA_clause = pre:PA_pre post:PA_post {return _node2("PA_clause", pre, post); }
PA_pre = pre_clause PA spaces?
PA_post = number_post_clause
// afterthought termset connective prefix
// forethought (Polish) flag
PEhO_clause = pre:PEhO_pre post:PEhO_post {return _node2("PEhO_clause", pre, post); }
PEhO_pre = pre_clause PEhO spaces?
PEhO_post = post_clause
// //////// _cipra: jmina la'o zoi POIhA_clause zoi_20160608UTC
POIhA_clause = pre:POIhA_pre post:POIhA_post {return _node2("POIhA_clause", pre, post); }
POIhA_pre = pre_clause POIhA spaces?
POIhA_post = post_clause
// directions in time
RAhOI_clause = pre:RAhOI_pre post:RAhOI_post {return _node2("RAhOI_clause", pre, post); }
// RAhOI_pre //////// _vimcu lo cfila no'u mu'a zoizoi ([RAhOI:ra'oi vla:tai] VAU) zoi i galfi zoizoi (initial_rafsi / gismu / CVV_final_rafsi / stressed_initial_rafsi short_final_rafsi) zoi zoizoi (y_rafsi / y_less_rafsi / gismu) zoi_20160414UTC
// RAhOI_pre //////// vimcu lo cfila i galfi zoizoi RAhOI spaces? (y_rafsi / y_less_rafsi / gismu) zoi zoizoi RAhOI spaces? (y_rafsi / long_rafsi / y_less_rafsi / gismu) zoi_20160909UTC
RAhOI_pre = pre_clause RAhOI spaces? (y_rafsi / long_rafsi / y_less_rafsi / gismu) spaces?
RAhOI_post = post_clause
// flag for modified interpretation of GOhI
// converts number to extensional tense
ROI_clause = pre:ROI_pre post:ROI_post {return _node2("ROI_clause", pre, post); }
ROI_pre = pre_clause ROI spaces?
ROI_post = post_clause
// metalinguistic eraser to the beginning of
// the current utterance
// conversions
SE_clause = pre:SE_pre post:SE_post {return _node2("SE_clause", pre, post); }
SE_pre = pre_clause SE spaces?
SE_post = post_clause
// metalinguistic bridi insert marker
SEI_clause = pre:SEI_pre post:SEI_post {return _node2("SEI_clause", pre, post); }
SEI_pre = pre_clause SEI spaces?
SEI_post = post_clause
// metalinguistic bridi end marker
SEhU_clause = pre:SEhU_pre post:SEhU_post {return _node2("SEhU_clause", pre, post); }
SEhU_pre = pre_clause SEhU spaces?
SEhU_post = post_clause
// metalinguistic single word eraser
SI_clause = expr:(spaces? SI spaces?) {return _node("SI_clause", expr); }
// reciprocal sumti marker
// metalinguistic eraser of the entire text
SU_clause = pre:SU_pre post:SU_post {return _node2("SU_clause", pre, post); }
SU_pre = pre_clause SU spaces?
SU_post = post_clause
// tense interval properties
// closing gap for MEX constructs
TEhU_clause = pre:TEhU_pre post:TEhU_post {return _node2("TEhU_clause", pre, post); }
TEhU_pre = pre_clause TEhU spaces?
TEhU_post = post_clause
// start compound lerfu
TEI_clause = pre:TEI_pre post:TEI_post {return _node2("TEI_clause", pre, post); }
TEI_pre = pre_clause TEI spaces?
TEI_post = post_clause
// left discursive parenthesis
TO_clause = pre:TO_pre post:TO_post {return _node2("TO_clause", pre, post); }
TO_pre = pre_clause TO spaces?
TO_post = post_clause
// right discursive parenthesis
TOI_clause = pre:TOI_pre post:TOI_post {return _node2("TOI_clause", pre, post); }
TOI_pre = pre_clause TOI spaces?
TOI_post = post_clause
// multiple utterance scope mark
TUhE_clause = pre:TUhE_pre post:TUhE_post {return _node2("TUhE_clause", pre, post); }
TUhE_pre = pre_clause TUhE spaces?
TUhE_post = post_clause
// multiple utterance end scope mark
TUhU_clause = pre:TUhU_pre post:TUhU_post {return _node2("TUhU_clause", pre, post); }
TUhU_pre = pre_clause TUhU spaces?
TUhU_post = post_clause
// attitudinals, observationals, discursives
UI_clause = pre:UI_pre post:UI_post {return _node2("UI_clause", pre, post); }
UI_pre = pre_clause UI spaces?
UI_post = post_clause
// distance in space_time
// end simple bridi or bridi_tail
VAU_clause = pre:VAU_pre post:VAU_post {return _node2("VAU_clause", pre, post); }
VAU_pre = pre_clause VAU spaces?
VAU_post = post_clause
// left MEX bracket
VEI_clause = pre:VEI_pre post:VEI_post {return _node2("VEI_clause", pre, post); }
VEI_pre = pre_clause VEI spaces?
VEI_post = post_clause
// right MEX bracket
VEhO_clause = pre:VEhO_pre post:VEhO_post {return _node2("VEhO_clause", pre, post); }
VEhO_pre = pre_clause VEhO spaces?
VEhO_post = post_clause
// MEX operator
VUhU_clause = pre:VUhU_pre post:VUhU_post {return _node2("VUhU_clause", pre, post); }
VUhU_pre = pre_clause VUhU spaces?
VUhU_post = post_clause
// space_time interval size
// space_time dimensionality marker
VUhO_clause = pre:VUhO_pre post:VUhO_post {return _node2("VUhO_clause", pre, post); }
VUhO_pre = pre_clause VUhO spaces?
VUhO_post = post_clause
// glue between logically connected sumti and relative clauses
// subscripting operator
XI_clause = pre:XI_pre post:XI_post {return _node2("XI_clause", pre, post); }
XI_pre = pre_clause XI spaces?
XI_post = post_clause
XOI_clause = pre:XOI_pre post:XOI_post {return _node2("XOI_clause", pre, post); }
XOI_pre = pre_clause XOI spaces?
XOI_post = post_clause
// hesitation
// Very very special case. Handled in the morphology section.
// Y_clause = spaces? Y spaces?
// event properties _ inchoative, etc.
// ZAhO_clause = pre:ZAhO_pre post:ZAhO_post {return _node2("ZAhO_clause", pre, post); }
// ZAhO_pre = pre_clause ZAhO spaces?
// ZAhO_post = post_clause
// time interval size tense
// lujvo glue
// time distance tense
// conjoins relative clauses
// single word metalinguistic quote marker
ZO_clause = pre:ZO_pre post:ZO_post {return _node2("ZO_clause", pre, post); }
ZO_pre = pre_clause ZO spaces? any_word spaces?
ZO_post = post_clause
// delimited quote marker
ZOI_clause = pre:ZOI_pre post:ZOI_post {return _node2("ZOI_clause", pre, post); }
ZOI_pre = pre_clause ZOI spaces? zoi_open spaces? zoi_word* zoi_close spaces?
ZOI_post = post_clause
// prenex terminator (not elidable)
ZOhU_clause = pre:ZOhU_pre post:ZOhU_post {return _node2("ZOhU_clause", pre, post); }
ZOhU_pre = pre_clause ZOhU spaces?
ZOhU_post = post_clause
// ___ MORPHOLOGY ___
CMEVLA = expr:cmevla {return ["CMEVLA", expr];}
BRIVLA = expr:(gismu_2 / lujvo / fuhivla) {return ["BRIVLA", expr];}
gismu_2 = expr:(gismu) {return ["gismu", expr];}
// CMAVO //////// _jmina zoizoi MUhOI zoi_20150819UTC
// CMAVO //////// _jmina zoizoi LIhAU / LUhEI zoi_20150827UTC
// CMAVO //////// _cipra: jmina ma'oi POIhA_20160608UTC
CMAVO = expr:(A / BAI / BAhE / BE / BEI / BEhO / BIhE / BO / BOI / BU / BY / CEI / CO / COI / CU / DOhU / FA / FAhO / FEhU / FIhO / FOI / FUhA / GA / GAhO / GEhU / GI / GIhA / GIhI / GOI / GOhA / GOhOI / I / IAU / JAI / JOI / KE / KEhE / KEI / KOhA / KU / KUhAU / KUhE / KUhO / LAU / LAhE / LEhAI / LE / LEhU / LI / LIhAU / LIhU / LOhAI / LOhO / LOhOI / LOhU / LU / LUhEI / LUhU / MAhO / MAI / ME / MEhU / MOhE / MOI / MUhOI / NA / NAhE / NIhO / NOI / NU / PA / PEhO / POIhA / RAhOI / ROI / SE / SEI / SEhU / SI / SU / TEhU / TEI / TO / TOI / TUhE / TUhU / UI / VAU / VEI / VEhO / VUhU / VUhO / XI / XOI / ZO / ZOI / ZOhU / cmavo) {return ["CMAVO", expr];}
// This is a Parsing Expression Grammar for the morphology of Lojban.
// See http://www.pdos.lcs.mit.edu/~baford/packrat/
//
// All rules have the form
//
// name = peg_expression
//
// which means that the grammatical construct "name" is parsed using
// "peg_expression".
//
// 1) Concatenation is expressed by juxtaposition with no operator symbol.
// 2) / represents *ORDERED* alternation (choice). If the first
// option succeeds, the others will never be checked.
// 3) ? indicates that the element to the left is optional.
// 4) * represents optional repetition of the construct to the left.
// 5) + represents one_or_more repetition of the construct to the left.
// 6) () serves to indicate the grouping of the other operators.
// 7) & indicates that the element to the right must follow (but the
// marked element itself does not absorb anything).
// 8) ! indicates that the element to the right must not follow (the
// marked element itself does not absorb anything).
// 9) . represents any character.
// 10) ' ' or " " represents a literal string.
// 11) [] represents a character class.
//
// Repetitions grab as much as they can.
//
//
// ___ GRAMMAR ___
// This grammar classifies words by their morphological class (cmevla,
// gismu, lujvo, fuhivla, cmavo, and non_lojban_word).
//
//The final section sorts cmavo into grammatical classes (A, BAI, BAhE, ..., ZOhU).
//
// mi'e ((xorxes))
//___________________________________________________________________
lojban_word = expr:(CMEVLA / CMAVO / BRIVLA) { return expr; }
any_word = expr:lojban_word spaces? { return expr; }
zoi_open = w:lojban_word { return _zoi_assign_delim(w); }
zoi_word = expr:( w:(non_space+) spaces &{ return (! _zoi_check_quote(w)); } ) {return "";}
zoi_close = w:any_word &{ return (_zoi_check_delim(w)); }
//___________________________________________________________________
cmevla = expr:(jbocme / zifcme) { return ["cmevla", _join(expr)]; }
// zifcme //////// _vimcu zoizoi / digit zoi iki'ubo la digit cu se galfi la'o zoi preproc.js zoi_20150806UTC
zifcme = (!h (nucleus / glide / h / consonant !pause)* consonant &pause)
// jbocme //////// _vimcu zoizoi / digit zoi iki'ubo la digit cu se galfi la'o zoi preproc.js zoi_20150806UTC
jbocme = (&zifcme any_syllable* &pause)
//___________________________________________________________________
cmavo = expr:(!cmevla !CVCy_lujvo cmavo_form &post_word) { return _join(expr); }
CVCy_lujvo = expr:(CVC_rafsi y h? initial_rafsi* brivla_core / stressed_CVC_rafsi y short_final_rafsi) { return _join(expr); }
// cmavo_form //////// _vimcu zoizoi / digit zoi iki'ubo la digit cu se galfi la'o zoi preproc.js zoi_20150806UTC
cmavo_form = expr:(!h !cluster onset (nucleus h)* (!stressed nucleus / nucleus !cluster) / y+) { return _join(expr); }
//___________________________________________________________________
brivla = expr:(!cmavo initial_rafsi* brivla_core) { return _join(expr); }
brivla_core = expr:(fuhivla / gismu / CVV_final_rafsi / stressed_initial_rafsi short_final_rafsi) { return _join(expr); }
stressed_initial_rafsi = expr:(stressed_extended_rafsi / stressed_y_rafsi / stressed_y_less_rafsi) { return _join(expr); }
initial_rafsi = expr:(extended_rafsi / y_rafsi / !any_extended_rafsi y_less_rafsi !any_extended_rafsi) { return _join(expr); }
//___________________________________________________________________
any_extended_rafsi = expr:(fuhivla / extended_rafsi / stressed_extended_rafsi) { return _join(expr); }
fuhivla = expr:(fuhivla_head stressed_syllable consonantal_syllable* final_syllable) { return _join(expr); }
stressed_extended_rafsi = expr:(stressed_brivla_rafsi / stressed_fuhivla_rafsi) { return _join(expr); }
extended_rafsi = expr:(brivla_rafsi / fuhivla_rafsi) { return _join(expr); }
stressed_brivla_rafsi = expr:(&unstressed_syllable brivla_head stressed_syllable h y) { return _join(expr); }
brivla_rafsi = expr:(&(syllable consonantal_syllable* syllable) brivla_head h y h?) { return _join(expr); }
// stressed_fuhivla_rafsi //////// _galfi zoizoi &consonant zoi zoizoi consonantal_syllable* !h zoi sei la mezohe cu stika to zoizoi https://github.com/Ilmen-vodhr/ilmentufa/commit/9ae16d8cd6ef5f47bf5e4f740e75f321dd828226 zoi toi_20150810UTC
stressed_fuhivla_rafsi = expr:(fuhivla_head stressed_syllable consonantal_syllable* !h onset y) { return _join(expr); }
// fuhivla_rafsi //////// _galfi zoizoi &consonant zoi zoizoi !h zoi sei la mezohe cu stika to zoizoi https://github.com/Ilmen-vodhr/ilmentufa/commit/9ae16d8cd6ef5f47bf5e4f740e75f321dd828226 zoi toi_20150810UTC
fuhivla_rafsi = expr:(&unstressed_syllable fuhivla_head !h onset y h?) { return _join(expr); }
fuhivla_head = expr:(!rafsi_string brivla_head) { return _join(expr); }
brivla_head = expr:(!cmavo !slinkuhi !h &onset unstressed_syllable*) { return _join(expr); }
slinkuhi = expr:(!rafsi_string consonant rafsi_string) { return _join(expr); }
rafsi_string = expr:(y_less_rafsi* (gismu / CVV_final_rafsi / stressed_y_less_rafsi short_final_rafsi / y_rafsi / stressed_y_rafsi / stressed_y_less_rafsi? initial_pair y / hy_rafsi / stressed_hy_rafsi)) { return _join(expr); }
//___________________________________________________________________
gismu = expr:((initial_pair stressed_vowel / consonant stressed_vowel consonant) &final_syllable consonant vowel &post_word) { return _join(expr); }
CVV_final_rafsi = expr:(consonant stressed_vowel h &final_syllable vowel &post_word) { return _join(expr); }
short_final_rafsi = expr:(&final_syllable (consonant diphthong / initial_pair vowel) &post_word) { return _join(expr); }
stressed_y_rafsi = expr:((stressed_long_rafsi / stressed_CVC_rafsi) y) { return _join(expr); }
stressed_y_less_rafsi = expr:(stressed_CVC_rafsi !y / stressed_CCV_rafsi / stressed_CVV_rafsi) { return _join(expr); }
stressed_long_rafsi = expr:(initial_pair stressed_vowel consonant / consonant stressed_vowel consonant consonant) { return _join(expr); }
stressed_CVC_rafsi = expr:(consonant stressed_vowel consonant) { return _join(expr); }
stressed_CCV_rafsi = expr:(initial_pair stressed_vowel) { return _join(expr); }
stressed_CVV_rafsi = expr:(consonant (unstressed_vowel h stressed_vowel / stressed_diphthong) r_hyphen?) { return _join(expr); }
y_rafsi = expr:((long_rafsi / CVC_rafsi) y h?) { return _join(expr); }
y_less_rafsi = expr:(!y_rafsi !stressed_y_rafsi !hy_rafsi !stressed_hy_rafsi (CVC_rafsi / CCV_rafsi / CVV_rafsi) !h) { return _join(expr); }
hy_rafsi = expr:((long_rafsi vowel / CCV_rafsi / CVV_rafsi) h y h?)
stressed_hy_rafsi = expr:((long_rafsi stressed_vowel / stressed_CCV_rafsi / stressed_CVV_rafsi) h y)
long_rafsi = expr:(initial_pair unstressed_vowel consonant / consonant unstressed_vowel consonant consonant) { return _join(expr); }
CVC_rafsi = expr:(consonant unstressed_vowel consonant) { return _join(expr); }
CCV_rafsi = expr:(initial_pair unstressed_vowel) { return _join(expr); }
CVV_rafsi = expr:(consonant (unstressed_vowel h unstressed_vowel / unstressed_diphthong) r_hyphen?) { return _join(expr); }
r_hyphen = expr:(r &consonant / n &r) { return _join(expr); }
//___________________________________________________________________
final_syllable = expr:(onset !y !stressed nucleus !cmevla &post_word) {return _join(expr);}
stressed_syllable = expr:(&stressed syllable / syllable &stress) {return _join(expr);}
stressed_diphthong = expr:(&stressed diphthong / diphthong &stress) {return _join(expr);}
stressed_vowel = expr:(&stressed vowel / vowel &stress) {return _join(expr);}
unstressed_syllable = expr:(!stressed syllable !stress / consonantal_syllable) {return _join(expr);}
unstressed_diphthong = expr:(!stressed diphthong !stress) {return _join(expr);}
unstressed_vowel = expr:(!stressed vowel !stress) {return _join(expr);}
//// FIX: Xorxes' fix for fu'ivla rafsi stress
// stress //////// _jmina zoizoi / glide zoi sei la mezohe cu stika to zoizoi https://github.com/Ilmen-vodhr/ilmentufa/commit/9ae16d8cd6ef5f47bf5e4f740e75f321dd828226 zoi toi_20150810UTC
stress = expr:((consonant / glide)* h? y? syllable pause) {return _join(expr);}
stressed = expr:(onset [AEIOU]) {return _join(expr);}
any_syllable = expr:(onset nucleus coda? / consonantal_syllable) {return _join(expr);}
syllable = expr:(onset !y nucleus coda?) {return _join(expr);}
//// FIX: preventing {bla'ypre} from being a valid lujvo
consonantal_syllable = expr:(consonant &syllabic coda) {return _join(expr);}
coda = expr:(!any_syllable consonant &any_syllable / syllabic? consonant? &pause) {return _join(expr);}
onset = expr:(h / glide / initial) {return _join(expr);}
nucleus = expr:(vowel / diphthong / y !nucleus) {return _join(expr);}
//_________________________________________________________________
glide = expr:(i / u) &nucleus {return expr;}
// diphthong //////// _xu tu'a zoizoi !glide zoi sarcu i la'a lu zo oiia li'u je lu zo oiua li'u je lu zo oiian li'u cu na raktu i ei jalge fa tu'a lu zo oi ia li'u je lu zo oi ua li'u je lu zo oiian li'u mu'a i cipra_20150806UTC
// diphthong //////// _pe'i da na'e ka'e te frica lu aian li'u zoizoi aiian li'u isemu'ibo galfi fi zoizoi (a i !i / a u !u / e i !i / o i !i) !nucleus zoi sei la mezohe cu stika to zoizoi https://github.com/Ilmen-vodhr/ilmentufa/commit/9ae16d8cd6ef5f47bf5e4f740e75f321dd828226 zoi toi_20150810UTC
diphthong = expr:(a i !i / a u !u / e i !i / o i !i) !nucleus {return _join(expr);}
vowel = expr:(a / e / i / o / u) !nucleus {return expr;}
a = [aA] {return "a";}
e = [eE] {return "e";}
i = [iI] {return "i";}
o = [oO] {return "o";}
u = [uU] {return "u";}
// y //////// _galfi zoizoi !nucleus zoi zoizoi !(!y nucleus) zoi ja'e lo nu lu yyyyyyyyy li'u ji'a ei gendra_20160426UTC
y = [yY] !(!y nucleus) {return "y";}
//___________________________________________________________________
cluster = expr:(consonant consonant+) {return _join(expr);}
initial_pair = expr:(&initial consonant consonant !consonant) {return _join(expr);}
initial = expr:(affricate / sibilant? other? liquid?) !consonant !glide {return _join(expr);}
affricate = expr:(t c / t s / d j / d z) {return _join(expr);}
liquid = expr:(l / r) {return _join(expr);}
other = expr:(p / t !l / k / f / x / b / d !l / g / v / m / n !liquid) {return _join(expr);}
sibilant = expr:(c / s !x / (j / z) !n !liquid) {return _join(expr); }
consonant = expr:(voiced / unvoiced / syllabic) {return expr;}
syllabic = expr:(l / m / n / r) {return expr;}
voiced = expr:(b / d / g / j / v / z) {return expr;}
unvoiced = expr:(c / f / k / p / s / t / x) {return expr;}
l = [lL] !h !glide !l {return "l";}
// m //////// _vimcu zoi zoi !z zoi tezu'e lo nu curmi tu'a lu mz li'u_20160602UTC
m = [mM] !h !glide !m {return "m";}
n = [nN] !h !glide !n !affricate {return "n";}
r = [rR] !h !glide !r {return "r";}
b = [bB] !h !glide !b !unvoiced {return "b";}
d = [dD] !h !glide !d !unvoiced {return "d";}
g = [gG] !h !glide !g !unvoiced {return "g";}
v = [vV] !h !glide !v !unvoiced {return "v";}
j = [jJ] !h !glide !j !z !unvoiced {return "j";}
z = [zZ] !h !glide !z !j !unvoiced {return "z";}
s = [sS] !h !glide !s !c !voiced {return "s";}
c = [cC] !h !glide !c !s !x !voiced {return "c";}
x = [xX] !h !glide !x !c !k !voiced {return "x";}
k = [kK] !h !glide !k !x !voiced {return "k";}
f = [fF] !h !glide !f !voiced {return "f";}
p = [pP] !h !glide !p !voiced {return "p";}
t = [tT] !h !glide !t !voiced {return "t";}
h = ['h] &nucleus {return "'";}
//___________________________________________________________________
// digit = expr:([0123456789] !h !nucleus) {return _join(expr);} //////// _vimcu iki'ubo la digit cu se galfi la'o zoi preproc.js zoi_20150806UTC
post_word = expr:(pause / !nucleus lojban_word) {return _join(expr);}
pause = expr:(space_char+ / EOF) {return _join(expr);}
// // // za'a sarcu
EOF = expr:(!.) {return _join(expr);}
// comma = [,] {return "";} //////// _vimcu imu'ibo zukte noda_20150806UTC
non_lojban_word = expr:(!lojban_word non_space+) {return _join(expr);}
// // // mamukti
non_space = expr:(!space_char .) {return _join(expr);}
//Unicode_style and escaped chars not compatible with cl_peg
space_char = [.\t\n\r?!\u0020] {return "";}
// space_char = [.?! ] / space_char1 / space_char2
// space_char1 = ' '
// space_char2 = ''
//___________________________________________________________________
spaces = expr:(!Y initial_spaces) {return _join(expr);}
initial_spaces = expr:((space_char / !ybu Y)+ EOF? / EOF) {return _join(expr);}
ybu = expr:(Y space_char* BU) {return "ybu";}
lujvo = expr:(!gismu !fuhivla brivla) {return _node("lujvo", expr);}
//___________________________________________________________________
A = &cmavo expr:( a / e / o / u ) &post_word {return ["A", _join(expr)];}
// BAI //////// _+gai'i +ki'oi +mu'ai +po'a +pu'ai +xo'u_20150820UTC
// BAI //////// _cipra: -caha -kahe -pu'i -nu'o -bi'ai : muvdu ma'oi NA tezu'e lo nu sarxe lo modal logji pe la kripkes_20160607UTC
BAI = &cmavo expr:( z u h e / z u h a u / z u h a / z u / z o h i / z o h a / z i / z e i h a / z e h u / z e h o / z e h i / z e h e / z e h a i / z e h a / z a u / z a h o / z a h a i / z a / x o h u / x a u / x a h o / v u h a / v u / v i h u / v i h i / v i h e / v i h a / v i / v e h u / v e h i / v e h e / v e h a / v a h u / v a h o / v a / t u h i / t o h o / t i h u h i / t i h u h e / t i h u h a / t i h u / t i h i / t i h a / t e h i / t e h e / t a i / t a h i / t a h e / s i h u / s a u / r u h u / r u h i / r i h u / r i h i / r i h a / r e h o / r a i / r a h i / r a h a / p u h o / p u h e / p u h a u / p u h a i / p u h a / p u / p o h i / p o h a / p i h o / p a h u / p a h o / p a h a / n i h i / n i h a / n e h u / n e h i / n e h a / n a u / n a h o / m u h u / m u h a i / m u h i / m o h u / m e h e / m e h a / m a u / m a h i / m a h e / l i h i h e / l i h e / l e h a / l a h u / k u h u / k o i / k o h a u / k i h u / k i h o i / k i h i / k i / k a i / k a h i / k a h a i / k a h a / j i h u / j i h o / j i h e / j a h i / j a h e / g u h a u / g a u / g a i h i / g a h u / g a h a / f i h e / f a u / f a h e / f a h a / d u h o i / d u h o / d u h i / d u h a / d o h e / d i h o / d i h i / d i h a / d e i h a / d e h i h u / d e h i h o / d e h i h i / d e h i h e / d e h i h a / d e h i / d e h a / c u h u / c u h e / c o h u / c o h i / c o h a / c i h u / c i h o / c i h e / c a u / c a h u / c a h o / c a h i / c a / b u h u / b e h i / b e h e i / b e h a u / b e h a / b a u / b a i / b a h o / b a h i / b a h a u / b a ) &post_word {return ["BAI", _join(expr)];}
// BAhE //////// _+ba'ei_20150820UTC
BAhE = &cmavo expr:( z a i h e / z a h e / p e h e / b a h e i / b a h e ) &post_word {return ["BAhE", _join(expr)];}
BE = &cmavo expr:( b e ) &post_word {return ["BE", _join(expr)];}
BEI = &cmavo expr:( b e i ) &post_word {return ["BEI", _join(expr)];}
BEhO = &cmavo expr:( b e h o ) &post_word {return ["BEhO", _join(expr)];}
BIhE = &cmavo expr:( b i h e ) &post_word {return ["BIhE", _join(expr)];}
BO = &cmavo expr:( c e h e / b o ) &post_word {return ["BO", _join(expr)];}
BOI = &cmavo expr:( b o i ) &post_word {return ["BOI", _join(expr)];}
BU = &cmavo expr:( b u ) &post_word {return ["BU", _join(expr)];}
// BY //////// _vimcu zoizoi / digit h y zoi iki'ubo la digit cu se galfi la'o zoi preproc.js zoi_20150806UTC
// BY //////// _+xe'e'y_20150820UTC
// BY //////// _+iy'y +jo'au'o +ro'au'o_20150820UTC
// BY //////// _+fai'e'ai'y +su'ai'y +su'au'y_20150820UTC
// BY //////// _-soi'a'y (to pa'a lo nu zo soi'a muvdu ma'oi FIhO ma'oi PA toi)_20160602UTC
BY = &cmavo expr:( z y / z e h y / z a h u h y / y h y / ybu / x y / x o h y / x o h e h y / x i h i h e i h y / x e i h y / x e h e h y / x a h y / v y / v o h y / v o h e i h a h y / v i h e i h e h y / v a u h a u h o h y / v a i h y / v a h e i h a h y / u y / u i h y / u h y / t y / t u h o h y / t o h a / t e h o h y / t a u h u h y / s y / s u h o i h y / s u h o h y / s u h e h y / s u h a u h y / s u h a i h y / s o i h u h y / s o 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 o h a u h o / r e i h y / r e h y / r a u h y / r a h e h y / p y / p u h e h u h o h y / p i h y / p e i h i h a h y / p a i h y / p a h y / p a h a u h o h y / o h y / n y / n o h y / n o h o h y / n o h e h u h y / n o h a i h y / n i h u h y / n i h e h o i h y / n i h e h e i h y / n a h a / m y / m u h y / m u h i h a i h y / m o h a h y / m e h i h y / m a i h e h e h y / m a h u h y / l y / l o h a / k y / k o i h o h y / k i h o h y / k e i h o h y / k a u h o h y / k a i h o h y / k a h o h y / k a h o h a i h y / k a h e i h a h y / j y / j o h o / j o h a u h o / j i h i h y / j e h o / j a u h y / i y h y / i y / i h y / g y / g o h o h i h a h y / g e h o / g a u h i h o h y / g a i h y / g a h e / g a h a u h y / f y / f u h a h a u h y / f u h a h a i h y / f i h u h y / f e i h y / f a i h u h y / f a i h u h a h y / f a i h e h a u h y / f a i h e h a i h y / e h y / d y / d u h e h y / d a u h y / d a h a h y / c y / c i h y / c i h i h y / c e h i h y / b y / b u h o h e / b i h y / a h y ) &post_word {return ["BY", _join(expr)];}
CEI = &cmavo expr:( c e i ) &post_word {return ["CEI", _join(expr)];}
CO = &cmavo expr:( c o ) &post_word {return ["CO", _join(expr)];}
// COI //////// _+goi'e_20150820UTC
COI = &cmavo expr:( v i h o / t a i h i / t a h a / s a u h e i / s a h e i / r e h i / p e h u / o h a i / n u h e / m u h o / m i h e / k i h e / k i h a i / k e h o / j u h i / j o h a u / j e h e / g o i h e / f i h i h e / f i h i / f e h o / f a u h u / d o i h o i / d o i / d i h a i / d a h o i / d a h e i / c o i / c o h o i / c o h o / c i h o i / b u h o i / b e h e / a h o i ) &post_word {return ["COI", _join(expr)];}
CU = &cmavo expr:( c u ) &post_word {return ["CU", _join(expr)];}
DOhU = &cmavo expr:( d o h u ) &post_word {return ["DOhU", _join(expr)];}
FA = &cmavo expr:( f a i / f a / f e / f o / f u / f i h a / f i ) &post_word {return ["FA", _join(expr)];}
FAhO = &cmavo expr:( f a h o ) &post_word {return ["FAhO", _join(expr)];}
FEhU = &cmavo expr:( f e h u ) &post_word {return ["FEhU", _join(expr)];}
// FIhO //////// _+soi'a +poi'o'a +poi'a +noi'o'a +noi'a_20160602UTC
// FIhO //////// _cipra: -soi'a -poi'o'a -poi'a -noi'o'a -noi'a_20160608UTC
FIhO = &cmavo expr:( f i h o ) &post_word {return ["FIhO", _join(expr)];}
FOI = &cmavo expr:( f o i ) &post_word {return ["FOI", _join(expr)];}
FUhA = &cmavo expr:( f u h a ) &post_word {return ["FUhA", _join(expr)];}
GA = &cmavo expr:( g u h e / g u h i / g u h o / g u h a / g u h u / g e h i / g u / g o / g e / g a ) &post_word {return ["GA", _join(expr)];}
GAhO = &cmavo expr:( k e h i / g a h o ) &post_word {return ["GAhO", _join(expr)];}
GEhU = &cmavo expr:( g e h u ) &post_word {return ["GEhU", _join(expr)];}
GI = &cmavo expr:( g i ) &post_word {return ["GI", _join(expr)];}
GIhA = &cmavo expr:( g i h e / g i h o / g i h a / g i h u ) &post_word {return ["GIhA", _join(expr)];}
GIhI = &cmavo expr:( g i h i ) &post_word {return ["GIhI", _join(expr)];}
// GOI //////// _+voi'e_20150820UTC
GOI = &cmavo expr:( v o i h e / p o h u / p o h e / p o / p e / n o h u / n e / g o i ) &post_word {return ["GOI", _join(expr)];}
GOhA = &cmavo expr:( c e i h i / g a i h o / x e h u / m o / n e i / g o h u / g o h o / g o h i / n o h a / g o h e / g o h a / d u / b u h a / b u h e / b u h i / c o h e ) &post_word {return ["GOhA", _join(expr)];}
// GOhOI //////// _+bo'ei_20150820UTC
GOhOI = &cmavo expr:( z e h o i / t a h a i / g o h o i / b o h e i ) &post_word {return ["GOhOI", _join(expr)];}
I = &cmavo expr:( i ) &post_word {return ["I", _join(expr)];}
IAU = &cmavo expr:( i h a u / i a u ) &post_word {return ["IAU", _join(expr)];}
// JAI //////// _+jo'ai_20161116UTC
JAI = &cmavo expr:( j o h a i / j a h e i / j a i ) &post_word {return ["JAI", _join(expr)];}
// JOI //////// _+ji'o'e +y'i_20150820UTC
JOI = &cmavo expr:( z i h e / y h i / x o i h u / p i h u / m i h i / k u h a / j u h e / j u / j o i / j o h u / j o h e i h i / j o h e i / j o h e / j o / j i h o h e / j i / j e h i / j e / j a / f a h u h a i / f a h u / c e h o i / c e h o / c e / b i h o / b i h i ) &post_word {return ["JOI", _join(expr)];}
// KE //////// _+ke'ai +ke'ei +ke'oi_20150820UTC
KE = &cmavo expr:( p i h a i / n u h i / k e h o i / k e h e i / k e h a i / k e / f e i h u ) &post_word {return ["KE", _join(expr)];}
// KEhE //////// _+ke'ei'a_20150820UTC
KEhE = &cmavo expr:( n u h u / k e h e i h a / k e h e ) &post_word {return ["KEhE", _join(expr)];}
KEI = &cmavo expr:( k e i ) &post_word {return ["KEI", _join(expr)];}
// KOhA //////// _+bo'a +bo'e +bo'i +bo'o +bo'u +ca'au +tu'oi +zi'oi_20150820UTC
KOhA = &cmavo expr:( z u h i h a / z u h i / z u h a i / z o h e / z i h o i / z i h o / z a i h o / x a i / v o h u / v o h o / v o h i / v o h e / v o h a / t u h o i / t u / t i / t a / r u / r i h a u / r i / r a / n e i h o / n a u h u / m i h o i / m i h o / m i h a i / m i h a / m i / m a i h i / m a h a / m a / l a u h 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 / c a h a u / b o h u / b o h o / b o h i / b o h e / b o h a ) &post_word { return ["KOhA", _join(expr)];}
KU = &cmavo expr:( k u ) &post_word {return ["KU", _join(expr)];}
KUhAU = &cmavo expr:( k u h a u ) &post_word {return ["KUhAU", _join(expr)];}
// KUhE //////// _+te'oi'oi +tei'u_20150820UTC
KUhE = &cmavo expr:( t e i h u / t e h o i h o i / k u h e ) &post_word {return ["KUhE", _join(expr)];}
KUhO = &cmavo expr:( k u h o ) &post_word {return ["KUhO", _join(expr)];}
LAU = &cmavo expr:( c e h a / l a u / z a i / t a u ) &post_word {return ["LAU", _join(expr)];}
// LAhE //////// _+la'e'au +tau'e_20150820UTC
// LAhE //////// _+moi'a_20160525UTC
LAhE = &cmavo expr:( z o h e i / v u h i / t u h a / t a u h e / m o i 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 h a u / l a h e / d u h a u ) &post_word {return ["LAhE", _join(expr)];}
// LE //////// _+lei'e +loi'e_20150820UTC
LE = &cmavo expr:( z o h a u / r i h o i / m o i h o i / m o h o i / m e h e i / l o i h i / l o i h e / l o i / l o h i / l o h e i / l o h e / l o / l e i h i / l e i h e / l e i / l e h i / l e h e i / l e h e / l e / l a i / l a h i / l a h e i / l a ) &post_word { return ["LE", _join(expr)];}
LEhAI = &cmavo expr:( l e h a i ) &post_word {return ["LEhAI", _join(expr)];}
LEhU = &cmavo expr:( l e h u ) &post_word {return ["LEhU", _join(expr)];}
// LI //////// _+bo'ai +li'ei +mai'o_20150820UTC
LI = &cmavo expr:( m e h o / m a i h o / l i h e i / l i h a i / l i / b o h a i ) &post_word {return ["LI", _join(expr)];}
// //////// jmina ma'oi LIhAU_20150827UTC
LIhAU = &cmavo expr:( l i h a u ) &post_word {return ["LIhAU", _join(expr)];}
LIhU = &cmavo expr:( l i h u ) &post_word {return ["LIhU", _join(expr)];}
LOhAI = &cmavo expr:( l o h a i / s a h a i ) &post_word {return ["LOhAI", _join(expr)];}
LOhO = &cmavo expr:( l o h o ) &post_word {return ["LOhO", _join(expr)];}
// LOhOI //////// _+xau'a +mau'a_20160525UTC
LOhOI = &cmavo expr:( x u h u / x a u h a / m a u h a / l o h o i ) &post_word {return ["LOhOI", _join(expr)];}
//LOhOI = &cmavo expr:( x u h u / l o h o i ) &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)];}
// //////// _jmina ma'oi LUhEI_20150827UTC
LUhEI = &cmavo expr:( l u h e i ) &post_word {return ["LUhEI", _join(expr)];}
LUhU = &cmavo expr:( l u h u ) &post_word {return ["LUhU", _join(expr)];}
MAhO = &cmavo expr:( n a h u / m a h o ) &post_word {return ["MAhO", _join(expr)];}
MAI = &cmavo expr:( b a h a i / m o h o / m a i ) &post_word {return ["MAI", _join(expr)];}
ME = &cmavo expr:( x o h i / n u h a / m e h a u / m e ) &post_word {return ["ME", _join(expr)];}
MEhU = &cmavo expr:( m e h u ) &post_word {return ["MEhU", _join(expr)];}
// MOhE //////// _+boi'au_20150820UTC
MOhE = &cmavo expr:( n i h e / m o h e / b o i h a u ) &post_word {return ["MOhE", _join(expr)];}
MOI = &cmavo expr:( m o i h o / m e i / m o i / s i h e / c u h o / v a h e ) &post_word {return ["MOI", _join(expr)];}
// //////// _jmina ma'oi MUhOI_20150819UTC
MUhOI = &cmavo expr:( m u h o i ) &post_word {return ["MUhOI", _join(expr)];}
// NA //////// _+cau'a_20150820UTC
// NA //////// _cipra: +caha +kahe +pu'i +nu'o +bi'ai : muvdu fi ma'oi BAI tezu'e lo nu sarxe lo modal logji pe la kripkes_20160607UTC
NA = &cmavo expr:( x u h o h e / p u h i / n u h o / n a / k a h e / j a h a / c a u h a / c a h a / b i h a i ) &post_word {return ["NA", _join(expr)];}
// NAhE //////// _+cau'e_20150820UTC
NAhE = &cmavo expr:( t o h e / s a i h e / r e i h e / p a i h e / n o i h e / n o h e / n a h e i / n a h e / m o h i / j e h a i / j e h a / f e h e / c a u h o h e / c a u h e / c a i h e ) &post_word {return ["NAhE", _join(expr)];}
NIhO = &cmavo expr:( n i h o / n o h i ) &post_word {return ["NIhO", _join(expr)];}
// NOI //////// _+no'oi +po'oi_20150820UTC
NOI = &cmavo expr:( v o i h i / v o i / p o i / p o h o i / n o i / n o h o i ) &post_word {return ["NOI", _join(expr)];}
// NU //////// _+ka'ei +kai'ei +ni'ai_20150820UTC
NU = &cmavo expr:( z u h o / z a h i / s u h u / s i h o / p u h u / p o i h i / n u / n i h a i / n i / m u h e / l i h i / k a i h u / k a i h e i / k a h e i / k a / j e i / d u h u / b u h a i ) &post_word {return ["NU", _join(expr)];}
// PA //////// _vimcu zoizoi / digit zoi iki'ubo la digit cu se galfi la'o zoi preproc.js zoi_20150806UTC
// PA //////// _+xe'e_20150820UTC
// PA //////// _+fai'e'ai +su'ai +su'au_20150820UTC
// PA //////// _-soi'a (to muvdu ma'oi FIhO toi)_20160602UTC
// PA //////// _-ce'i -fi'u -ma'u -ni'u -pi -ra'e (to muvdu ma'oi VUhU i zo ki'o jo'u zo me'i jo'u zo za'u na muvdu i ki'u bo xai ka'e kansa no drata nacle'u toi)_20170709UTC_
// PA //////// _+pi +ra'e (to co'u cipra i au lu da xi papire li'u noi claxu zo vei cu gendra toi)_20171125UTC_
// PA //////// _-me'i -za'u (to muvdu fi ma'oi PA i gau ku zo me'i jo'u zo za'u cu ei kansa lo drata nacle'u i au tarmi fa lu ([li {me'i <(¹[a bu] BOI¹) (¹pi'e [pa BOI] KUhE¹)> KUhE} LOhO] VAU) li'u toi)_20171125UTC_
PA = &cmavo expr:( z e / x o h e / x o / x i h i h e i / x e i / x e h e / x a / v o h e i h a / v o / v i h e i h e / v a u h a u h o / v a i / v a h e i h a / t u h o / t e h o / t a u h u / s u h o i / s u h o / s u h e / s u h a u / s u h a i / s o i h u / 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 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 a i h e h e / 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 e i / f a i h u h a / f a i h u / f a i h e h a u / f a i h e h a i / d u h e / d a u / d a h a / c i h i / c i / b i ) &post_word {return ["PA", _join(expr)];}
PEhO = &cmavo expr:( k e i h a i / p e h o ) &post_word {return ["PEhO", _join(expr)];}
// //////// _cipra: jmina ma'oi POIhA_20160608UTC
POIhA = &cmavo expr:( s o i h a / p o i h o h a / p o i h a / n o i h o h a / n o i h a ) &post_word {return ["POIhA", _join(expr)];}
RAhOI = &cmavo expr:( r a h o i ) &post_word {return ["RAhOI", _join(expr)];}
// ROI //////// _+xu'au_20150820UTC
ROI = &cmavo expr:( x u h a u / v a h e i / r o i / r e h u / m u h e i / d e h e i / b a h o i ) &post_word {return ["ROI", _join(expr)];}
// SE //////// _-su'ai +tau'o_20150820UTC
SE = &cmavo expr:( x o h a i / x e / v o h a i / v e / t o h a i / t e / t a u h o / s u h e i / s e h u h o / s e h o h e / s e / r e h a u h e ) &post_word {return ["SE", _join(expr)];}
// SEI //////// _+cei'e +noi'a +poi'a_20150820UTC
// SEI //////// _-poi'a -noi'a (to muvdu ma'oi FIhO toi)_20160602UTC
SEI = &cmavo expr:( t i h o / s o i / s e i / l e h a u / c e i h e ) &post_word {return ["SEI", _join(expr)];}
// SEhU //////// _+xe'au_20150820UTC
SEhU = &cmavo expr:( x e h a u / s e h u ) &post_word {return ["SEhU", _join(expr)];}
SI = &cmavo expr:( z e h e i / z e i / s i h u h i / s i ) &post_word {return ["SI", _join(expr)];}
SU = &cmavo expr:( s u ) &post_word {return ["SU", _join(expr)];}
// TEhU //////// _+ku'oi'u_20150820UTC
TEhU = &cmavo expr:( t e h u / k u h o i h u ) &post_word {return ["TEhU", _join(expr)];}
TEI = &cmavo expr:( t e i ) &post_word {return ["TEI", _join(expr)];}
// TO //////// _+mau'e +noi'i_20150820UTC
TO = &cmavo expr:( t o h i / t o / n o i h i / m a u h e ) &post_word {return ["TO", _join(expr)];}
// TOI //////// _+mau'o +ge'u'i_20150820UTC
TOI = &cmavo expr:( t o i / m a u h o / g e h u h i ) &post_word {return ["TOI", _join(expr)];}
TUhE = &cmavo expr:( t u h e ) &post_word {return ["TUhE", _join(expr)];}
TUhU = &cmavo expr:( t u h u ) &post_word {return ["TUhU", _join(expr)];}
// UI //////// _-xe'e_20150820UTC
// UI //////// _+cau'i +dau'a +de'ai +de'au +de'oi +doi'a +ge'ei +ji'au +ke'e'u +ki'a'au'u'au'i +koi'e +oi'u +pei'e +ta'oi +toi'e +toi'o +uei'e +xau'e'o +xau'o'o_20150820UTC
// UI //////// _+lau'i +nu'oi + pu'ei +ca'ai_20160629UTC
UI = &cmavo expr:( z u h u / z o h o / z i h a i / z i h a / z a i h a / z a h a / x y h y / x u h u h i / x u / x o h o / x a u h o h o / x a u h e h o / x a i h a / x a h i / x a h a h a / x a h a / v u h e / v e i h i / v a h i / u u / u o / u i / u h u / u h o / u h i / u h e / u h a i / u h a / u e i h e / u e h i / u e / u a u / u a i / u a / t o i h o / t o i h e / t o h u / t i h e / t e h i h o / t a h u / t a h o i / t a h o / t a h e i / s u h a / s i h 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 i / s a h u / s a h e / s a h a / s a / r u h e / r u h a / r o h u / r o h o / r o h i / r o h e / r o h a / r i h e / r e h e / r a h u / r a h o / r a h i h a u / p u h e i / p o h o / p e i h o / p e i h e / p e i h a / p e i / p e h i / p e h a i / p e h a / p a u / p a h e / o i h u / o i h o / o i h a / o i / o h u / o h o / o h i / o h e / o h a / n u h o i / n i h a u / n e h e / n e h a u / n a i / n a h o i / n a h i / m u h a / m o i h i / m i h u / m e h a i / m a u h u / m a u h i / l i h o i / l i h o / l i h a / l e h o / l a u h i / l a i h i / l a h a / k u h i / k o i h e / k o h o i / k i h a h a u h u h a u h i / k i h a / k e h u / k e h e h u / k a u / k a i h e / k a i h a / k a h u / j u h o i / j u h o / j u h a / j o h a / j i h e i / j i h a u / j i h a / j e i h u / j e h u / j e h a u / j a h o / j a h a i / i u / i o / i i / i h u / i h o / i h i / i h e / i h a / i e h i / i e / i a h u / i a / g e h e i / g e h e / g a h i / f u h o / f u h i / f u h e i h u / f u h e i h o / f u h e i h i / f u h e i h e / f u h e i h a / f u h e i / f u h e / f u h a u / f a i h a / e i / e h u / e h o / e h i / e h e / e h a / d o i h a / d o h a i / d o h a / d e h o i / d e h a u / d e h a i / d a u h i / d a u h a / d a i h o / d a i h i / d a i / d a h o / d a h i / c u h i / c u h e i h u / c u h e i h o i / c u h e i h o / c u h e i h i / c u h e i h e i / c u h e i h e / c u h e i h a i / c u h e i h a / c u h e i / c i h a u h u h a u h i / c i h a i / c a u h i / c a i / c a h e / c a h a i / b u h o / b u h a h a / b o h o i / b i h u / b i h a / b e h u / b a h u / b a h a / a u h u / a u / a i / a h u / a h o / a h i / a h e / a h a ) &post_word {return ["UI", _join(expr)];}
VAU = &cmavo expr:( v a u ) &post_word {return ["VAU", _join(expr)];}
VEI = &cmavo expr:( v e i ) &post_word {return ["VEI", _join(expr)];}
VEhO = &cmavo expr:( v e h o ) &post_word {return ["VEhO", _join(expr)];}
// VUhU //////// _+boi'ai +de'au'u +fau'au +fe'au'u +ga'u'au +ja'oi +ka'o'ei +kei'au +kei'i +ni'a'au +si'oi'e +te'au +vi'oi'au_20150820UTC
// VUhU //////// _+ce'i +fi'u +ma'u +ni'u +pi +ra'e (to muvdu fi ma'oi PA i zo ki'o jo'u zo me'i jo'u zo za'u na muvdu i ki'u bo xai ka'e kansa no drata nacle'u toi)_20170709UTC_
// VUhU //////// _-pi -ra'e (to co'u cipra i au lu da xi papire li'u noi claxu zo vei cu gendra toi)_20171125UTC_
// VUhU //////// _+me'i +za'u (to muvdu fi ma'oi PA i gau ku zo me'i jo'u zo za'u cu ei kansa lo drata nacle'u i au tarmi fa lu ([li {me'i <(¹[a bu] BOI¹) (¹pi'e [pa BOI] KUhE¹)> KUhE} LOhO] VAU) li'u toi)_20171125UTC_
VUhU = &cmavo expr:( z i h a h o / z a h u / z a h e i / x o h e i / v u h u / v o h a u h u / v i h o i h a u / v a h a / t o h e i h a u / t e h a u h u / t e h a u / t e h a / t a i h i h e / t a i h e h i / s u h i / s i h o i h e / s i h i / s e h i h a h o / s a h o / s a h i / r i h o / r e h a / p i h i / p i h e i h o i / p i h e i h a u / p i h e / p i h a / p a u h o i / p a u h e i / p a u h a h u / p a h i / n i h u / n i h a h a u / n e h o i / n e h o / m e h i / m e h e i h o / m a h u / m a h o h e / k u h a u h a / k e i h i / k e i h a u / k a h o h e i / k a h a u / j u h u / j o i h i / j o h i / j a u h a u / j a h o i / g u h a u h i / g u h a i / g e i / g e h a / g a h u h a u / f u h u / f i h u / f e h i / f e h a u h u / f e h a / f a u h a u / f a h i / f a h a u / f a h a i / d u h e i / d i h e i h o h a u / d e i h a u h o / d e h o / d e h a u h u / d a h a h a u / c u h a u h e i / c u h a i / c u h a / c i h a i h u / c e h i / b o i h a i / b e h e i h o i / b a i h i / b a i h e i ) &post_word {return ["VUhU", _join(expr)];}
VUhO = &cmavo expr:( v u h o ) &post_word {return ["VUhO", _join(expr)];}
// XI //////// _+fau'e_20150820UTC
XI = &cmavo expr:( x i h i / x i h e / x i / t e h a i / f a u h e ) &post_word {return ["XI", _join(expr)];}
XOI = &cmavo expr:( x o i / f i h o i ) &post_word {return ["XOI", _join(expr)];}
// Y //////// _+ie'o_20160602UTC
Y = &cmavo expr:( y+ / i e h o ) &post_word {return _join(expr);}
ZO = &cmavo expr:( z o / r a h a i / m a h o i ) &post_word {return ["ZO", _join(expr)];}
ZOI = &cmavo expr:( z o i / l a h o ) &post_word {return ["ZOI", _join(expr)];}
// ZOhU //////// _+ge'ai +ke'au_20150820UTC
ZOhU = &cmavo expr:( z o h u / k e h a u / g e h a i / c e h a i ) &post_word {return ["ZOhU", _join(expr)];}
You can’t perform that action at this time.