1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
% 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;
|