|
|
1.1 root 1: Installation Procedure
2: ----------------------
3: To install twig, you must decide in which directories to place:
4:
5: (1) the twig compiler binary, and
6: (2) the twig template files.
7:
8: Once you have made these two decisions, you should edit the makefile and
9: set the variable INSTALL to the value of (1), and the variable TEMPLATES to
10: (2). The definitions of INSTALL and TEMPLATES should be near the beginning
11: of the makefile. The installation can then be completed by typing:
12:
13: make install
14:
15: Once a user has written a twig specification, the command twig is used to
16: compile it. The compilation creates two files called walker.c,
17: containing several subroutines, and symbols.h, containing definitions.
18: Walker.c is compiled and linked with the rest of the user program, and
19: tree matching occurs when the user's program calls a subroutine called _match.
20: More details about twig specifications, and how to interface to the
21: subroutines in walker.c is given in the ``Twig Reference Manual'', AT&T Bell
22: Laboratories, Computing Science Technical Report #120.
23:
24: Addendum to the ``Twig Reference Manual''
25: -----------------------------------------
26:
27: 1. In a node declaration, the user can override the automatic numbering
28: of a node id by expliciting assigning a number using the ``= int''
29: construct. However, the user must then assign a number to all
30: of the node ids. In other words, the user must either assign
31: numbers to each of the node ids, or to none of them. The ids must
32: have unique numbers.
33:
34: 2. The default action of executing the labelled leaves from
35: right to left is inadequate. ``Execution,'' as used here, is in
36: the sense as described in the ``Twig Reference Manual.'' Although
37: one could simulate any execution order by using a top-down rule, and
38: explicitly requesting the execution of labelled leaves with the tDO
39: macro, it is tedious to do so. For example, implementing a Sethi-Ullman
40: style register allocator in such a fashion is extremely awkward.
41: To alleviate this tedium, reordering scheme has been proposed, and
42: implemented by Andrew Appel of Princeton University. It is included
43: in this version of twig.
44:
45: A function, ``_do'' performs the execution of the matches. This
46: function is part of the walker.c file generated by twig. In versions
47: of the walker without reordering, _do performs the call:
48:
49: _evalleaves(winner->lleaves);
50:
51: where winner->lleaves are the labelled leaves of the winning match.
52: Lleaves has type ``__match *[], '' and is a NULL terminated sequence
53: of matches for the labelled leaves in left to right order. Calling
54: tDO with an element of lleaves executes the match associated with
55: the labelled leaf.
56:
57: Reordering is accomplished by changing the call to _evalleaves with
58: the statement:
59:
60: REORDER(winner->lleaves);
61:
62: REORDER is a macro, or function defined by the user that may execute
63: the leaves in any order. If the user does not define REORDER then
64: twig will generate a default, which is to call _evalleaves.
65:
66: For example, if the user wishes to execute the leaves in the order of
67: decreasing cost, the following definition could be used.
68:
69: prologue {
70: ...
71: #define REORDER(list) reorder(list)
72: ...
73: }
74:
75: ...
76:
77: insert {
78:
79: reorder(list)
80: __match **list;
81: {
82: int i, j, n;
83: __match *index[16];
84:
85: /* copy list into index */
86: for(n=0; list[n]; n++) index[n] = list[n];
87:
88: /* insertion sort */
89: for(j=0;j<n;j++)
90: for(i=j; i>0; i--)
91: if(index[i]->cost > index[i-1]->cost) {
92: /* swap them */
93: __match *temp = index[i];
94: index[i] = index[i-1]; index[i-1] = p;
95: }
96:
97: /* now execute */
98: for(j=0;j<n;j++)
99: tDO(index[j]);
100: }
101:
102: }
103:
104:
105: 3. In a top-down rule, there is often a desire to execute all the
106: labelled leaves after performing some preparatory actions. This
107: could be done by saying
108:
109: tDO($%1$); tDO($%2$); ...
110:
111: However, the short hand notation, ``EVAL;'' provides the same function.
112:
113: 4. In the previous version of twig, Walker.c had a reference to
114: walker.h. Hence the user had to compile walker.c with the command:
115:
116: cc -Iinclude_dir -c walker.c
117:
118: where include_dir was the directory containing walker.h.
119: The reference to walker.h has been eliminated by inserting walker.h
120: into all the template files that could generate walker.c.
121: Therefore the new compile command is:
122:
123: cc -c walker.c
124:
125: 5. Twig assigns numbers to the node symbols, which are used to identify
126: nodes to the tree matcher. In the previous version of twig, the
127: tree matcher actually recognized ``M_NODE|number'' as the value
128: assigned to the node symbol rather than just plain ``number.''
129: This was completely undocumented. The current version fixed the
130: tree matcher to recognize ``number'' as the correct value associated
131: with a node symbol.
132:
133: 6. Twig now uses dynamic initialization of costs rather than static
134: initialization. This permits the user to declare COST as structure.
135:
136: 7. Many cost metrics used in twig programs are additive. That is,
137: the cost of a match is some constant cost plus the sum of the
138: costs of the matches at the labelled leaves. The macros ZEROCOST, and
139: ADDCOST provide an easy way to implement this. For example, if costs
140: are integers, then the definition
141:
142: #define ZEROCOST 1
143: #define ADDCOST(accum,y) (accum) += (y)
144:
145: would cause twig to generate, for rules without a cost part, code that
146: calculate the default cost as one plus the sum of the costs of the
147: matches at the labelled leaves.
148:
149: ZEROCOST, and ADDCOST must both be defined, if the above facility is
150: to be used. DEFAULT_COST must not be defined when ADDCOST is defined.
151:
152: 8. Changes made by Keutzer (allegra!keutzer) and Appel (research!appel)
153:
154: modifications by keutzer:
155:
156: char c ->int c
157: all over lex.c
158:
159: varargs added in _mtG in walker.c
160: may be too expensive for some people.
161: code is not portable to a SUN4 without it however.
162:
163: "short int"'s were changed to "short"'s for UTS compatability.
164:
165: The NODE struct pointed to by a NODEPTR now needs a "mark" field.
166:
167: A printTree(NODEPTR n) routine must also be supplied by the user.
168:
169: If you were using the values of nodes in your symbols.h file
170: then the command
171: cc -g -c -DDUMPNAMES sym.c
172: should be used to compile sym.c.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.