File: tp_3.html

package info (click to toggle)
eli-doc 4.4.0-4
  • links: PTS
  • area: main
  • in suites: sarge
  • size: 13,256 kB
  • ctags: 4,583
  • sloc: makefile: 42
file content (329 lines) | stat: -rw-r--r-- 16,595 bytes parent folder | download
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
<HTML>
<HEAD>
<!-- This HTML file has been created by texi2html 1.29
     from ../tnf/tp.tnf on 12 Febuary 2003 -->

<TITLE>Tree Parsing - Actions Carried Out During Parsing</TITLE>
</HEAD>
<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#0000EE" VLINK="#551A8B" ALINK="#FF0000" BACKGROUND="gifs/bg.gif">
<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0" VALIGN=BOTTOM>
<TR VALIGN=BOTTOM>
<TD WIDTH="160" VALIGN=BOTTOM><IMG SRC="gifs/elilogo.gif" BORDER=0>&nbsp;</TD>
<TD WIDTH="25" VALIGN=BOTTOM><img src="gifs/empty.gif" WIDTH=25 HEIGHT=25></TD>
<TD ALIGN=LEFT WIDTH="600" VALIGN=BOTTOM><IMG SRC="gifs/title.gif"></TD>
</TR>
</TABLE>

<HR size=1 noshade width=785 align=left>
<TABLE BORDER=0 CELLSPACING=2 CELLPADDING=0>
<TR>
<TD VALIGN=TOP WIDTH="160">
<h4>General Information</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="index.html">Eli: Translator Construction Made Easy</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="gindex_toc.html">Global Index</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="faq_toc.html" >Frequently Asked Questions</a> </td></tr>
</table>

<h4>Tutorials</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="EliRefCard_toc.html">Quick Reference Card</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="novice_toc.html">Guide For new Eli Users</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="news_toc.html">Release Notes of Eli</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="nametutorial_toc.html">Tutorial on Name Analysis</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="typetutorial_toc.html">Tutorial on Type Analysis</a></td></tr>
</table>

<h4>Reference Manuals</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="ui_toc.html">User Interface</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="pp_toc.html">Eli products and parameters</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="lidoref_toc.html">LIDO Reference Manual</a></td></tr>
</table>

<h4>Libraries</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="lib_toc.html">Eli library routines</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="modlib_toc.html">Specification Module Library</a></td></tr>
</table>

<h4>Translation Tasks</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="lex_toc.html">Lexical analysis specification</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="syntax_toc.html">Syntactic Analysis Manual</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="comptrees_toc.html">Computation in Trees</a></td></tr>
</table>

<h4>Tools</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="lcl_toc.html">LIGA Control Language</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="show_toc.html">Debugging Information for LIDO</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="gorto_toc.html">Graphical ORder TOol</a> </td></tr>
</table>
<p>
<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="fw_toc.html">FunnelWeb User's Manual</a> </td></tr>
</table>
<p>
<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="ptg_toc.html">Pattern-based Text Generator</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="deftbl_toc.html">Property Definition Language</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="oil_toc.html">Operator Identification Language</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="tp_toc.html">Tree Grammar Specification Language</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="clp_toc.html">Command Line Processing</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="cola_toc.html">COLA Options Reference Manual</a> </td></tr>
</table>
<p>
<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="idem_toc.html">Generating Unparsing Code</a> </td></tr>
</table>
<p>
<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="mon_toc.html">Monitoring a Processor's Execution</a> </td></tr>
</table>

<h4>Administration</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="sysadmin_toc.html">System Administration Guide</a> </td></tr>
</table>

<HR WIDTH="100%">
<CENTER>&nbsp;<A HREF="mailto:elibugs@cs.colorado.edu"><IMG SRC="gifs/button_mail.gif" NOSAVE BORDER=0 HEIGHT=32 WIDTH=32></A><A HREF="mailto:elibugs@cs.colorado.edu">Questions, Comments, ....</A></CENTER>

</TD>
<TD VALIGN=TOP WIDTH="25"><img src="gifs/empty.gif" WIDTH=25 HEIGHT=25></TD>

<TD VALIGN=TOP WIDTH="600">
<H1>Tree Parsing</H1>
<P>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT=""><A HREF="tp_2.html"><IMG SRC="gifs/prev.gif" ALT="Previous Chapter" BORDER="0"></A>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT=""><A HREF="tp_4.html"><IMG SRC="gifs/next.gif" ALT="Next Chapter" BORDER="0"></A>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT=""><A HREF="tp_toc.html"><IMG SRC="gifs/up.gif" ALT="Table of Contents" BORDER="0"></A>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT="">
<HR size=1 noshade width=600 align=left>
<A NAME="IDX23"></A>
<H1><A NAME="SEC9" HREF="tp_toc.html#SEC9">Actions Carried Out During Parsing</A></H1>
<P>
Each rule has an associated action, written as an
identifier:
<P>
<PRE>
N0 ::= s(Ni,aj)    : Action1
N0 ::= N1          : Action2
N0 ::= s(t(Ni),Nj) : Action3
</PRE>
<P>
The action associated with a rule is carried out each time the rule is used
in a derivation.
Each rule may be associated with a distinct action, or a single action may
be associated with several rules.
<P>
<H2><A NAME="SEC10" HREF="tp_toc.html#SEC10">Actions and Values</A></H2>
<P>
The action carried out for each use of a rule in a derivation is a function
application.
<A NAME="IDX25"></A>
<A NAME="IDX24"></A>
The action identifier is the name of the function, and the arguments to
which it is applied are the values of the nonterminals and attributes
appearing on the right-hand side of the pattern.
These values are taken in order from left to right.
The result of the function becomes the value of the nonterminal appearing on
the left-hand side of the pattern.
<P>
For example, consider one of the rules of the specification introduced above
(see  <A HREF="tp_2.html#SEC6">Rules Describing Tree Nodes</A>), augmented by an action called
<CODE>IntR_loadconst</CODE>:
<P>
<PRE>
IntReg ::= IntegerVal(int) : IntR_loadconst
</PRE>
For each use of the rule <CODE>IntReg ::= IntegerVal(int)</CODE> in some
derivation, the function named <CODE>IntR_loadconst</CODE> will be applied to the
integer-valued attribute of the leaf.
The result of this function application will become the value of the
<CODE>IntReg</CODE> nonterminal.
<A NAME="IDX26"></A>
<A NAME="IDX27"></A>
<P>
The types of the attribute values are stated explicitly in the rules.
<A NAME="IDX29"></A>
<A NAME="IDX28"></A>
A type is also associated with each nonterminal by means of a declaration
(see  <A HREF="tp_4.html#SEC13">Summary of the Specification Language</A>).
For example, the type associated with the nonterminal <CODE>IntReg</CODE> might
be structure of type <CODE>reg</CODE> defined as follows:
<P>
<PRE>
typedef struct { int register; PTGNode code; } reg;
</PRE>
Here the <CODE>register</CODE> field would be the number of the register holding
the result and the <CODE>code</CODE> field would be a representation of the
assembly language instructions producing the result in that register
(see  <A HREF="ptg_1.html#SEC1">Introduction of Pattern-Based Text Generator</A>).
<P>
In this case, execution of <CODE>IntR_loadconst</CODE> would allocate a register
and create a PTG node representing the assembly language instruction
loading the integer constant specified by the integer-valued attribute of
the leaf into that register.
It would return a type-<CODE>reg</CODE> structure containing that information.
This structure would then become the value of the <CODE>IntReg</CODE> nonterminal.
<P>
Here's another example of a rule, this time augmented by an action called
<CODE>IntRR_sub</CODE>:
<P>
<PRE>
IntReg ::= Minus(IntReg,IntReg) : IntRR_sub
</PRE>
The function named <CODE>IntRR_sub</CODE> will be applied to the values returned
by the two children of the <CODE>Minus</CODE> node for each use of
<CODE>IntReg ::= Minus(IntReg,IntReg)</CODE> in some derivation,
and the result will become the value of the <CODE>IntReg</CODE> nonterminal on
the left-hand side of the rule.
The first argument of <CODE>IntRR_sub</CODE> would be the value returned by the
action associated with the left child of the <CODE>Minus</CODE> node, and the
second would be the value returned by the right child.
<P>
Execution of <CODE>IntRR_sub</CODE> might allocate a register to hold the result
of the subtraction and create a PTG node representing the sequence
consisting of the PTG nodes passed to it as operands followed by
the assembly language instruction that computes the difference of two
integer values in registers and leaves the result in a register.
<CODE>IntRR_sub</CODE> would return a type-<CODE>reg</CODE> structure, which would
become the value of the <CODE>IntReg</CODE> nonterminal on the left-hand side of
the rule.
<P>
Each nonterminal is associated with a function whose
name is <CODE>TP_</CODE> followed by the name of the nonterminal.
This function takes as its only argument a tree (of type <CODE>TPNode</CODE>,
see  <A HREF="tp_1.html#SEC4">Node Construction Functions</A>), and returns a value of
the type associated with the nonterminal.
Whenever one of these functions is applied to the root of a tree,
it parses that tree.
The parse finds the cheapest derivation of the function's nonterminal
at the root of the tree.
All of the actions implied by the derivation are executed, and the result
of the function is the result delivered by the action executed at the root
of the tree.
The only guarantee one can make about the order in which the actions are
executed is that it respects the data flow constraints implied by the
function applications.
<P>
A specification with all of the rules described so far
has only two nonterminals (<CODE>IntReg</CODE> and <CODE>FltReg</CODE>).
The translator will generate two parsing functions that can be applied
to the root of a tree:
<P>
<A NAME="IDX30"></A>
<U>:</U> reg <B>TP_IntReg</B> <I>(TPNode <VAR>tree</VAR>)</I><P>
A derivation for the tree rooted in <VAR>tree</VAR> in which the root is
interpreted as an <CODE>IntReg</CODE> will be sought.
If such a derivation is possible, the actions associated with the steps for
the cheapest will be executed.
The result of the action associated with the derivation step at the root
will be returned.
Otherwise the program will terminate abnormally.
<P>
<A NAME="IDX31"></A>
<U>:</U> reg <B>TP_FltReg</B> <I>(TPNode <VAR>tree</VAR>)</I><P>
A derivation for the tree rooted in <VAR>tree</VAR> in which the root is
interpreted as a <CODE>FltReg</CODE> will be sought.
If such a derivation is possible, the actions associated with the steps for
the cheapest will be executed.
The result of the action associated with the derivation step at the root
will be returned.
Otherwise the program will terminate abnormally.
<P>
The program will terminate abnormally when a requested derivation is not
possible.
This condition always arises from a design fault; either the patterns are
incomplete, or the tree to be parsed is malformed.
<P>
<A NAME="IDX32"></A>
<H2><A NAME="SEC11" HREF="tp_toc.html#SEC11">Implementing Actions</A></H2>
<P>
An action is a function application, and the name of the action is the
function to be invoked.
The rule with which the action is associated determines the signature of
the function:
Recall that the arguments of the function are the nonterminals and
attributes appearing on the right-hand side of the associated rule, in
order from left to right.
The result of the function becomes the value of the nonterminal appearing
on the left-hand side of the associated rule.
Each nonterminal and attribute has a fixed type.
<P>
Function application can be implemented either by calling a
<A NAME="IDX33"></A>
macro or by invoking a
<A NAME="IDX34"></A>
routine.
If the action requires a routine invocation, and the
<A NAME="IDX36"></A>
<A NAME="IDX35"></A>
signature of the
routine to be invoked matches the signature determined by the rule, then
the routine name can be used directly as the action.
Often, however, there is a mismatch between the signatures.
In that case, the action can be made the name of a macro that rearranges
arguments, inserts constants, or does whatever else is needed to correct
the mismatch.
<P>
<A NAME="IDX37"></A>
<H2><A NAME="SEC12" HREF="tp_toc.html#SEC12">Commutative Actions</A></H2>
<P>
Many computers have instruction sets that are asymmetric in their treatment
of operands.
For example, a machine with two-operand instructions may allow only the
second of these operands to be a literal value.
If two values in registers are being added, the "add register"
instruction is used, but if a literal value were being added to a value in a
register the "add immediate" instruction would be necessary.
One rule characterizing an integer addition operation for such a machine,
with an action to generate the "add immediate" instruction,
might be the following:
<P>
<PRE>
IntReg ::= Plus(IntReg,IntLit) : IntRI_add
</PRE>
(Here the nonterminal <CODE>IntLit</CODE> represents the interpretation
"a literal integer".)
<P>
Notice that the children of the <CODE>Plus</CODE> node in this rule have
different interpretations; this rule cannot be used in a derivation that
interprets the left child of the <CODE>Plus</CODE> node as an <CODE>IntLit</CODE> and
the right child as an <CODE>IntReg</CODE>.
<P>
Because addition is commutative, however, it is possible to interchange
the children of the <CODE>Plus</CODE> node without changing the resulting value.
Therefore if a derivation interprets the left child of the <CODE>Plus</CODE> node
as an <CODE>IntLit</CODE> and the right child as an <CODE>IntReg</CODE>, the tree
parser should be able to simply invoke the <CODE>IntRI_add</CODE> action with the
two operands reversed.
<P>
This possibility is indicated by using <CODE>::</CODE> instead of <CODE>:</CODE>
between the rule and its associated action:
<P>
<PRE>
IntReg ::= Plus(IntReg,IntLit) :: IntRI_add
</PRE>
<P>
<HR size=1 noshade width=600 align=left>
<P>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT=""><A HREF="tp_2.html"><IMG SRC="gifs/prev.gif" ALT="Previous Chapter" BORDER="0"></A>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT=""><A HREF="tp_4.html"><IMG SRC="gifs/next.gif" ALT="Next Chapter" BORDER="0"></A>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT=""><A HREF="tp_toc.html"><IMG SRC="gifs/up.gif" ALT="Table of Contents" BORDER="0"></A>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT="">
<HR size=1 noshade width=600 align=left>
</TD>
</TR>
</TABLE>

</BODY></HTML>