Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file treeprint.ml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296openSpotlib.SpotmoduleToken=struct(** Display machine with Format like capability *)typet=|Stringofstring|Boxofint*t(** "@[<n>...@]" *)|VBoxofint*t(** "@[<vn>...@]" *)|Cut(** "@," (known also as Good Break) *)|Space(** "@ " *)|Flush(** "@." *)|Seqoftlist|NOPopenFormat(* self tokenize *)letrecdump_self=function|Strings->String("String \""^String.escapeds^"\"")|Box(n,t)->Box(2,Seq[String"Box (";Cut;String(string_of_intn^",");Space;dump_selft;String")"])|VBox(n,t)->Box(2,Seq[String"VBox (";Cut;String(string_of_intn^",");Space;dump_selft;String")"])|Cut->String"Cut"|Space->String"Space"|Flush->String"Flush"|Seqts->Box(2,Seq([String"Seq [";Cut;SeqList.(intersperse(Seq[String";";Space])(mapdump_selfts));Cut;String"]"]))|NOP->String"NOP"letrecformatppf=function|Strings->stringppfs|Box(n,tk)->boxppfn;formatppftk;close_boxppf()|VBox(n,tk)->vboxppfn;formatppftk;close_boxppf()|Cut->cutppf|Space->spaceppf|Flush->flushppf;newlineppf|Seqtks->List.iter(formatppf)tks|NOP->()letdumpppft=formatppf&dump_selftopenBufferletrecbufferbuf=function|Strings->add_stringbufs|Box(_,tk)|VBox(_,tk)->bufferbuftk|Seqtks->List.iter(bufferbuf)tks|Cut|NOP->()|Space->add_charbuf' '|Flush->add_charbuf'\n'(* CR jfuruse: probably add too many? *)letshowtoken=letbuf=Buffer.create100inbufferbuftoken;Buffer.contentsbufendtypetoken=Token.topenToken(** Primitive operators *)typeassoc=Left|Right|Noassoctypelevel=floattype'at=assoc->level->'a(* monadic *)type'at_='atincludeMonad.Make(structtype'at='at_letbindatf=funal->f(atal)alletreturna=fun__->aend)openInfixtypeppr=tokentletbox:int->ppr->ppr=funoffsettal->Box(offset,tal)letvbox:int->ppr->ppr=funoffsettal->VBox(offset,tal)letdo_Seqxs=Seq(List.concat_map(function|Seqys->ys|y->[y])xs)let(++):ppr->ppr->ppr=funp1p2al->do_Seq[p1al;p2al]letcut:ppr=fun_out_ops_out_lev->Cutletspace:ppr=fun_out_pos_out_lev->Spaceletflush:ppr=fun_out_pos_out_lev->Flushletseq:pprlist->ppr=funpsal->do_Seq(List.map(funp->pal)ps)letstring:string->ppr=funs_out_pos_out_lev->Stringsletnop:ppr=fun_out_pos_out_lev->NOPletleft:'at->'at=funp_al->pLeftlletright:'at->'at=funp_al->pRightlletnoassoc:'at->'at=funp_al->pNoassoclletlevel:level->'at->'at=funlpa_l->palletreset:'at->'at=funt->noassoc(level0.0t)letcheck_against_current_level:level->[`Weaker|`Stronger|`Same]t=funlev_out_posout_lev->matchcompareout_levlevwith|1->`Weaker|-1->`Stronger|0->`Same|_->assertfalseletneed_paren:assoc->level->boolt=funassoclevout_posout_lev->matchcompareout_levlevwith|1->true|-1->false|0->beginmatchout_pos,assocwith|Left,Left->false|Right,Right->false|_->trueend|_->assertfalsetypeparens=string*stringletparens="(",")"letparenbox:?parens:parens->assoc->level->ppr->ppr=fun?(parens=parens)assoclevt->need_parenassoclev>>=function|true->box1&string(fstparens)++resett++string(sndparens)|false->t(** Common utilities *)letbinop:?parens:parens->assoc->level->op:ppr->ppr->ppr->ppr=fun?parensassoclev~op:seplr->parenbox?parensassoclev(levellev(leftl++sep++rightr))letlist:?parens:parens->level->ppr->pprlist->ppr=fun?parenslevsepf_elems->parenbox?parensNoassoclev(levellev(seq(List.interspersesepf_elems)))letprefix:?parens:parens->level->op:ppr->ppr->ppr=fun?parenslev~op:preft->lett=parenbox?parensRightlev(pref++levellev(rightt))in(* [uminus (uminus 1)] should not be printed out neither "- - 1" or "--1",
but "- -1" *)check_against_current_levellev>>=function|`Same->space++t|`Weaker|`Stronger->tletpostfix:?parens:parens->level->op:ppr->ppr->ppr=fun?parenslev~op:postft->lett=parenbox?parensLeftlev(levellev(leftt)++postf)in(* [uminus (uminus 1)] should not be printed out neither "- - 1" or "--1",
but "- -1" *)check_against_current_levellev>>=function|`Same->t++space|`Weaker|`Stronger->tletparensleftrightppr=stringleft++level(-1.0)ppr++stringrightmoduleOCaml=structletmbinopassoclevsep=binopassoclev~op:(space++stringsep++space)(*
%nonassoc IN
%nonassoc below_SEMI
%nonassoc SEMI /* below EQUAL ({lbl=...; lbl=...}) */
*)letsequence=list0.25(string";"++space)(*
%nonassoc LET /* above SEMI ( ...; let ... in ...) */
%nonassoc below_WITH
%nonassoc FUNCTION WITH /* below BAR (match ... with ...) */
%nonassoc AND /* above WITH (module rec A: SIG with ... and ...) */
%nonassoc THEN /* below ELSE (if ... then ...) */
%nonassoc ELSE /* (if ... then ... else ...) */
*)letif_then_elsee1e2e3=list0.5space[string"if";resete1;string"then";e2;string"else";e3]letif_thene1e2=list0.5space[string"if";resete1;string"then";e2](*
%nonassoc LESSMINUS /* below COLONEQUAL (lbl <- x := e) */
%right COLONEQUAL /* expr (e := e := e) */
%nonassoc AS
*)letty_as=mbinopNoassoc0.6"as"(*
%left BAR /* pattern (p|p|p) */
%nonassoc below_COMMA
%left COMMA /* expr/expr_comma_list (e,e,e) */
*)lettuple=list0.8(string","++space(* CR jfuruse: should be break *))(*
%right MINUSGREATER /* core_type2 (t -> t -> t) */
*)let(^->)=mbinopRight0.9"->"(*
%right OR BARBAR /* expr (e || e || e) */
%right AMPERSAND AMPERAMPER /* expr (e && e && e) */
%nonassoc below_EQUAL
%left INFIXOP0 EQUAL LESS GREATER /* expr (e OP e OP e) */
%right INFIXOP1 /* expr (e OP e OP e) */
%right COLONCOLON /* expr (e :: e :: e) */
%left INFIXOP2 PLUS PLUSDOT MINUS MINUSDOT /* expr (e OP e OP e) */
%left INFIXOP3 STAR /* expr (e OP e OP e) */
%right INFIXOP4 /* expr (e OP e OP e) */
*)let(+)=mbinopLeft1.0"+"let(-)=mbinopLeft1.0"-"let(*)=mbinopLeft2.0"*"letty_tuple=list2.0(space++string"* ")(*
%nonassoc prec_unary_minus prec_unary_plus /* unary - */
*)letmprefixlevop=prefixlev~op:(stringop)letuminus=mprefix5.0"-"(*
%nonassoc prec_constant_constructor /* cf. simple_expr (C versus C x) */
%nonassoc prec_constr_appl /* above AS BAR COLONCOLON COMMA */
%nonassoc below_SHARP
%nonassoc SHARP /* simple_expr/toplevel_directive */
%nonassoc below_DOT
%nonassoc DOT
/* Finally, the first tokens of simple_expr are above everything else. */
%nonassoc BACKQUOTE BANG BEGIN CHAR FALSE FLOAT INT INT32 INT64
LBRACE LBRACELESS LBRACKET LBRACKETBAR LIDENT LPAREN
NEW NATIVEINT PREFIXOP STRING TRUE UIDENT
*)letapp=binopLeft100.0~op:space(* CR jfuruse: contiguous spaces must be contracted *)end(** Drivers *)letformat?(assoc=Noassoc)?(level=0.0)pprppfv=Token.formatppf(pprvassoclevel)letbufferpprbuf?(assoc=Noassoc)?(level=0.0)v=Token.bufferbuf(pprvassoclevel)letshowppr?(assoc=Noassoc)?(level=0.0)v=Token.show(pprvassoclevel)moduleMakeDrivers(M:sigtypetvalppr:t->pprend)=structopenMletformatppfv=Token.formatppf(pprvNoassoc0.0)letdumpppfv=Token.dumpppf(pprvNoassoc0.0)letbufferbuf?(assoc=Noassoc)?(level=0.0)v=Token.bufferbuf(pprvassoclevel)letshow?(assoc=Noassoc)?(level=0.0)v=Token.show(pprvassoclevel)end