% file: o2_overview.mp % flow control of O2, O2linker, and c++ input boxes u:=1cc; pair sep,fldsep; sep := (0,3u); fldsep := (3u,0); beginfig(1); boxit.ipoptions(btex options etex); % compile options boxit.ipgrammars(btex $\sum$ xxx.lex grammars etex); % input grammars boxit.docs(btex $\sum$ doc. files of xxx.[mp,w] for mpost, cweave etex); % doc grammars boxit.ipT(btex Terminal vocabulary etex); % T boxit.o(btex \strut$O_{2}$ etex); % yacco2 compiler / compiler boxit.err(btex xxx\_errors.log etex); % error log boxit.tr(btex xxx\_tracings.log etex); % trace log and o2 chatter boxit.occ(btex xxx[,sym,tbl].cpp files etex); % yacco2 xxx[,sym,tbl].cpp files boxit.fsc(btex T-Alphabet and xxx.fsc files etex); % yacco2 linker files boxit.ipfsc(btex yyy.fsc \strut$O_{2}$linker make file etex); % linker make file to build boxit.olinker(btex \strut$O_{2}$linker etex); % o2linker boxit.olinkerop(btex \strut$O_{2}$linker tables etex); % linker fsc + thd dispatch tble boxit.cpp(btex CC etex); % c++ compiler boxit.objs(btex $\sum$ dispatch threads table, grammars's lr1 tables, each fsm and rhs procedure etex); % place the boxes ipoptions.e + fldsep = ipgrammars.w; ipgrammars.e + fldsep = ipT.w; ypart ipgrammars.n = ypart ipT.n; ypart ipoptions.n = ypart ipgrammars.n; .5[ipgrammars.e,ipgrammars.w] - sep = .5[o.e,o.w]; occ.e + fldsep = fsc.w; fsc.e + fldsep = ipfsc.w; .5[o.e,o.w] - sep = .5[occ.e,fsc.w]; ypart occ.n = ypart fsc.n = ypart ipfsc.n; .5[ipfsc.e,ipfsc.w] - sep = .5[olinker.e,olinker.w]; .5[olinker.e,olinker.w] - sep = .5[olinkerop.e,olinkerop.w]; docs.e + fldsep = olinker.w; ypart docs.n = ypart olinker.n; tr.e + fldsep = o.w; o.e + fldsep = err.w; ypart olinkerop.c - ypart sep = ypart cpp.c; objs.n -2fldsep = .5[cpp.e,cpp.w] - sep ; xx = .5(xpart olinkerop.w - xpart occ.e); yy = ypart olinkerop.w; (xx,yy) - sep = .5[cpp.e,cpp.w]; % form the boxes drawunboxed(ipoptions); draw ipoptions.sw -- ipoptions.se -- ipoptions.ne -- ipoptions.nw -- ipoptions.sw dashed withdots; %drawboxed(ipoptions); drawboxed(ipgrammars); drawboxed(ipT); drawboxed(o); drawboxed(err); drawboxed(tr); drawboxed(occ); drawboxed(fsc); drawboxed(ipfsc); drawboxed(olinker); drawboxed(olinkerop); drawboxed(cpp); drawboxed(objs); drawboxed(docs); % draw lined arrows between the boxes drawarrow ipoptions.se -- o.nw dashed withdots; drawarrow ipT.w -- ipgrammars.e dashed withdots; drawarrow ipgrammars.s -- o.n; pair mopt,ldeltaopt,rdeltaopt; mopt := .5[o.e,o.w] - .5(0,ypart sep); ldeltaopt := (xpart occ.n, ypart mopt); rdeltaopt := (xpart fsc.n, ypart mopt); drawarrow o.e -- err.w dashed withdots scaled 2; drawarrow o.w -- tr.e dashed withdots scaled 2; draw o.s -- mopt; draw mopt -- ldeltaopt; draw mopt -- rdeltaopt; drawarrow ldeltaopt -- occ.n; drawarrow rdeltaopt -- fsc.n; drawarrow fsc.e -- ipfsc.w dashed withdots; drawarrow ipfsc.s -- olinker.n; drawarrow olinker.s -- olinkerop.n; y = ypart objs.n - ypart cpp.s; drawarrow cpp.s -- cpp.s + (0,y); pair m,l,r; numeric yy; yy := ypart cpp.c + ypart .5sep; m := (xpart cpp.n,yy); l := (xpart occ.s, yy); r := (xpart olinkerop.s, yy); draw occ.s -- l; draw olinkerop.s -- r; draw l -- r; drawarrow m -- cpp.n; drawarrow o.s -- (xpart o.s, ypart docs.n); endfig; end;