123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108(* elpi: embedded lambda prolog interpreter *)(* license: GNU Lesser General Public License Version 2.1 or later *)(* ------------------------------------------------------------------------- *)(* extensible syntax *)typefixity=Infixl|Infixr|Infix|Prefix|Postfixletpp_fixityfmt=function|Infixl->Format.fprintffmt"Infix left associative"|Infixr->Format.fprintffmt"Infix right associative"|Infix->Format.fprintffmt"Infix not associative"|Prefix->Format.fprintffmt"Prefix not associative"|Postfix->Format.fprintffmt"Postfix not associative"letfixity_of_string=function|"infixl"->Infixl|"infixr"->Infixr|"infix"->Infix|"prefix"->Prefix|"prefixr"->Prefix|"postfix"->Postfix|"postfixl"->Postfix|_->assertfalse(* family of tokens *)typeextensible={start:string;mk_token:string->Tokens.token;token:string;non_enclosed:bool;at_least_one_char:bool;fixed:stringlist;}typefixed={token:string;the_token:string;mk_token:Tokens.token;}typemixfix_kind=Fixedoffixed|Extensibleofextensibletypemixfix={tokens:mixfix_kindlist;fixity:fixity;}letmkFixtokenthe_tokenmk_token=Fixed{token;the_token;mk_token}letmkExttokenstart?(non_enclosed=false)?(at_least_one_char=false)?(fixed=[])mk_token=Extensible{start;mk_token;token;non_enclosed;at_least_one_char;fixed}letmixfix_symbols:mixfixlist=[{tokens=[mkFix"VDASH"":-"VDASH;mkFix"QDASH""?-"QDASH];fixity=Infix};{tokens=[mkFix"OR"";"OR];fixity=Infixr};{tokens=[mkFix"CONJ"","CONJ;mkFix"CONJ2""&"CONJ2];fixity=Infixr};{tokens=[mkFix"ARROW""->"ARROW];fixity=Infixr};{tokens=[mkFix"DARROW""=>"DARROW];fixity=Infixr};{tokens=[mkFix"EQ""="EQ;mkFix"EQ2""=="EQ2;mkExt"FAMILY_LT""<"~fixed:["=<";"r<";"i<";"s<";"r=<";"i=<";"s=<"](funx->FAMILY_LTx);mkExt"FAMILY_GT"">"~fixed:["r>";"i>";"s>";"r>=";"i>=";"s>="](funx->FAMILY_GTx);mkFix"IS""is"IS;];fixity=Infix};{tokens=[mkFix"CONS""::"CONS];fixity=Infixr};{tokens=[mkExt"FAMILY_TICK""'"~non_enclosed:true(funx->FAMILY_TICKx)];fixity=Infix};{tokens=[mkExt"FAMILY_EXP""^"(funx->FAMILY_EXPx);mkExt"FAMILY_PLUS""+"~fixed:["r+";"i+";"s+"](funx->FAMILY_PLUSx);mkFix"MINUS""-"MINUS;mkFix"MINUSr""r-"MINUSr;mkFix"MINUSi""i-"MINUSi;mkFix"MINUSs""s-"MINUSs;];fixity=Infixl};{tokens=[mkExt"FAMILY_TIMES""*"~fixed:["r*";"i*";"s*"](funx->FAMILY_TIMESx);mkFix"SLASH""/"SLASH;mkFix"DIV""div"DIV;mkFix"MOD""mod"MOD;];fixity=Infixl};{tokens=[mkExt"FAMILY_MINUS""--"(funx->FAMILY_MINUSx)];fixity=Infixr};{tokens=[mkExt"FAMILY_BTICK""`"~non_enclosed:true(funx->FAMILY_BTICKx)];fixity=Infix};{tokens=[mkExt"FAMILY_EQ""=="~at_least_one_char:true(funx->FAMILY_EQx)];fixity=Infixr};{tokens=[mkExt"FAMILY_OR""||"(funx->FAMILY_ORx)];fixity=Infixr};{tokens=[mkExt"FAMILY_AND""&&"(funx->FAMILY_ANDx)];fixity=Infixr};{tokens=[mkExt"FAMILY_SHARP""#"(funx->FAMILY_SHARPx)];fixity=Infixl};{tokens=[mkExt"FAMILY_TILDE""~"~fixed:["r~";"i~"](funx->FAMILY_TILDEx)];fixity=Prefix};{tokens=[mkExt"FAMILY_QMARK""?"(funx->FAMILY_QMARKx)];fixity=Postfix};];;