123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121(**The Token Module*)(**Type of tokens*)typetoken_type=|LEFT_PARENTHESIS|RIGHT_PARENTHESIS|KEYWORDofstring|QUOTE|SEMI_COLON|INT_TOKENofint|FLOAT_TOKENoffloat|NULL_TOKEN|STRING_TOKENofstring|BOOL_TOKENofbool|ARRAY_BEGIN|PARAM_BEGIN|ARRAY_END|PARAM_END|COMMENT|COMMA(**Parses a string into a token*)letstring_to_tokenstr=matchString.trimstrwith|"CHOUQUETTE"->LEFT_PARENTHESIS|"CLAFOUTIS"->RIGHT_PARENTHESIS|"PARISBREST"->QUOTE|"BAGUETTE"->SEMI_COLON|"CUPCAKE"->BOOL_TOKENtrue|"POPCAKE"->BOOL_TOKENfalse|"MUFFIN"->KEYWORD"BEGIN"|"COOKIES"->KEYWORD"END"|"ICECREAM"->KEYWORD"LABEL"|"PAINVIENNOIS"->KEYWORD"GOTO"|"SABLE"->KEYWORD"IF"|"FRAMBOISIER"->KEYWORD"THEN"|"LOAD"->KEYWORD"LOAD"|"BABAAURHUM"->ARRAY_BEGIN|"CHARLOTTEAUXFRAISES"->ARRAY_END|"SCHNECKENKUCHEN"->PARAM_END|"CRUMBLE"->PARAM_BEGIN|"//"->COMMENT|","->COMMA|str->(tryINT_TOKEN(int_of_stringstr)with|Failure_->(tryFLOAT_TOKEN(float_of_stringstr)withFailure_->NULL_TOKEN)|_->NULL_TOKEN)(**A list of token recognized by the lexer*)letrecognized_token=[",";"CHOUQUETTE";"CLAFOUTIS";"PARISBREST";"BAGUETTE";"CUPCAKE";"SCHNECKENKUCHEN";"CRUMBLE";"POPCAKE";"MUFFIN";"COOKIES";"ICECREAM";"PAINVIENNOIS";"SABLE";"FRAMBOISIER";"BABAAURHUM";"//";"LOAD";](**Transforms a token into a string*)lettoken_to_string=function|LEFT_PARENTHESIS->"{(}"|RIGHT_PARENTHESIS->"{)}"|QUOTE->"{\"}"|SEMI_COLON->"{;}"|INT_TOKENi->"{Int "^string_of_inti^"}"|FLOAT_TOKENi->"{Float "^string_of_floati^"}"|STRING_TOKENs->"{String \""^s^"\"}"|BOOL_TOKENf->"{Bool: "^string_of_boolf^"}"|KEYWORDk->"{KEYWORD: "^k^"}"|ARRAY_BEGIN->"{[}"|ARRAY_END->"{]}"|PARAM_BEGIN->"{ { }"|PARAM_END->"{ } }"|COMMENT->"{//}"|COMMA->"{,}"|NULL_TOKEN->"NULL"(**Transforms the value of a token into a string*)lettoken_to_litteral_string=function|LEFT_PARENTHESIS->"("|RIGHT_PARENTHESIS->")"|SEMI_COLON->";"|INT_TOKENi->string_of_inti^" "|STRING_TOKENs->s|FLOAT_TOKENd->string_of_floatd^" "|BOOL_TOKENf->string_of_boolf^" "|KEYWORDk->k^" "|ARRAY_BEGIN->"["|ARRAY_END->"]"|PARAM_BEGIN->"{"|PARAM_END->"}"|COMMENT->"//"|COMMA->","|_->""(**Pretty print a token*)letpretty_printppftok=Fmt.pfppf"Token %s"(token_to_stringtok)(**Prints a list of token*)letprint_token_listlist=letrecstracclist=matchlistwith|[]->acc|t::q->str(acc^token_to_stringt^" ")qinlets=str"["listinprint_string(s^"]")