123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140openSedlexing.Utf8letdigit=[%sedlex.regexp?'0'..'9']letnumber=[%sedlex.regexp?Plusdigit,Opt'.',Opt(Plusdigit)]letspace=[%sedlex.regexp?Plus('\n'|'\t'|' ')]letidentifier=[%sedlex.regexp?(alphabetic|'_'),Star(alphabetic|digit|'_')]letnot_double_quotes=[%sedlex.regexp?Compl'"']typetoken=|NUMBERoffloat|STRINGofstring|BOOLofbool|IDENTIFIERofstring|FUNCTIONofstring|VARIABLEofstring|OPEN_PARENT|CLOSE_PARENT|OPEN_BRACKET|CLOSE_BRACKET|OPEN_BRACE|CLOSE_BRACE|SEMICOLON|COLON|DOT|RECURSE|PIPE|UPDATE_ASSIGN|ALTERNATIVE|QUESTION_MARK|COMMA|NULL|ADD|SUB|DIV|MULT|MODULO|AND|OR|EQUAL|NOT_EQUAL|GREATER|LOWER|GREATER_EQUAL|LOWER_EQUAL|RANGE|FLATTEN|REDUCE|IF|THEN|ELSE|ELIF|END|AS|EOF[@@derivingshow]lettokenize_stringbuf=letbuffer=Buffer.create10inletrecread_stringbuf=[%sedlexmatchbufwith|{|\"|}->Buffer.add_charbuffer'"';read_stringbuf|'"'->Ok(STRING(Buffer.contentsbuffer))|not_double_quotes->Buffer.add_stringbuffer(lexemebuf);read_stringbuf|_->Error"unmatched string"]inread_stringbuflettokenize_applybuf=letidentifier=lexemebufinmatch%sedlexbufwith|'('->Ok(FUNCTIONidentifier)|_->Ok(IDENTIFIERidentifier)lettokenize_variablebuf=match%sedlexbufwith|identifier->letvar_name=lexemebufinOk(VARIABLEvar_name)|_->Error"Expected variable name after $"letrectokenizebuf=match%sedlexbufwith|eof->OkEOF|'<'->OkLOWER|"<="->OkLOWER_EQUAL|'>'->OkGREATER|">="->OkGREATER_EQUAL|"=="->OkEQUAL|"!="->OkNOT_EQUAL|"+"->OkADD|"and"->OkAND|"or"->OkOR|"-"->OkSUB|"*"->OkMULT|"/"->OkDIV|"%"->OkMODULO|"["->OkOPEN_BRACKET|"]"->OkCLOSE_BRACKET|"{"->OkOPEN_BRACE|"}"->OkCLOSE_BRACE|"|="->OkUPDATE_ASSIGN|"//"->OkALTERNATIVE|"|"->OkPIPE|";"->OkSEMICOLON|":"->OkCOLON|","->OkCOMMA|"?"->OkQUESTION_MARK|"null"->OkNULL|"true"->Ok(BOOLtrue)|"false"->Ok(BOOLfalse)|"("->OkOPEN_PARENT|")"->OkCLOSE_PARENT|"range"->OkRANGE|"flatten"->OkFLATTEN|"reduce"->OkREDUCE|"if"->OkIF|"then"->OkTHEN|"else"->OkELSE|"elif"->OkELIF|"end"->OkEND|"as"->OkAS|"."->OkDOT|".."->OkRECURSE|'$'->tokenize_variablebuf|'"'->tokenize_stringbuf|identifier->tokenize_applybuf|number->letnum=lexemebufinOk(NUMBER(Float.of_stringnum))|space->tokenizebuf|any->Error("Unexpected character '"^lexemebuf^"'")|_->Error"Unexpected character"