• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<html>
2<head>
3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
4<title>Mini XML - Error Handling</title>
5<link rel="stylesheet" href="../../../../../../../doc/src/boostbook.css" type="text/css">
6<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
7<link rel="home" href="../../../index.html" title="Spirit 2.5.8">
8<link rel="up" href="../tutorials.html" title="Tutorials">
9<link rel="prev" href="mini_xml___asts_.html" title="Mini XML - ASTs!">
10<link rel="next" href="../quick_reference.html" title="Quick Reference">
11</head>
12<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
13<table cellpadding="2" width="100%"><tr>
14<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../../boost.png"></td>
15<td align="center"><a href="../../../../../../../index.html">Home</a></td>
16<td align="center"><a href="../../../../../../../libs/libraries.htm">Libraries</a></td>
17<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
18<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
19<td align="center"><a href="../../../../../../../more/index.htm">More</a></td>
20</tr></table>
21<hr>
22<div class="spirit-nav">
23<a accesskey="p" href="mini_xml___asts_.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../tutorials.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../quick_reference.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
24</div>
25<div class="section">
26<div class="titlepage"><div><div><h4 class="title">
27<a name="spirit.qi.tutorials.mini_xml___error_handling"></a><a class="link" href="mini_xml___error_handling.html" title="Mini XML - Error Handling">Mini
28        XML - Error Handling</a>
29</h4></div></div></div>
30<p>
31          A parser will not be complete without error handling. Spirit2 provides
32          some facilities to make it easy to adapt a grammar for error handling.
33          We'll wrap up the Qi tutorial with another version of the mini xml parser,
34          this time, with error handling.
35        </p>
36<p>
37          The full cpp file for this example can be found here: <a href="../../../../../example/qi/mini_xml3.cpp" target="_top">../../example/qi/mini_xml3.cpp</a>
38        </p>
39<p>
40          Here's the grammar:
41        </p>
42<p>
43</p>
44<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Iterator</span><span class="special">&gt;</span>
45<span class="keyword">struct</span> <span class="identifier">mini_xml_grammar</span>
46  <span class="special">:</span> <span class="identifier">qi</span><span class="special">::</span><span class="identifier">grammar</span><span class="special">&lt;</span><span class="identifier">Iterator</span><span class="special">,</span> <span class="identifier">mini_xml</span><span class="special">(),</span> <span class="identifier">qi</span><span class="special">::</span><span class="identifier">locals</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">&gt;,</span> <span class="identifier">ascii</span><span class="special">::</span><span class="identifier">space_type</span><span class="special">&gt;</span>
47<span class="special">{</span>
48    <span class="identifier">mini_xml_grammar</span><span class="special">()</span>
49      <span class="special">:</span> <span class="identifier">mini_xml_grammar</span><span class="special">::</span><span class="identifier">base_type</span><span class="special">(</span><span class="identifier">xml</span><span class="special">,</span> <span class="string">"xml"</span><span class="special">)</span>
50    <span class="special">{</span>
51        <span class="keyword">using</span> <span class="identifier">qi</span><span class="special">::</span><span class="identifier">lit</span><span class="special">;</span>
52        <span class="keyword">using</span> <span class="identifier">qi</span><span class="special">::</span><span class="identifier">lexeme</span><span class="special">;</span>
53        <span class="keyword">using</span> <span class="identifier">qi</span><span class="special">::</span><span class="identifier">on_error</span><span class="special">;</span>
54        <span class="keyword">using</span> <span class="identifier">qi</span><span class="special">::</span><span class="identifier">fail</span><span class="special">;</span>
55        <span class="keyword">using</span> <span class="identifier">ascii</span><span class="special">::</span><span class="identifier">char_</span><span class="special">;</span>
56        <span class="keyword">using</span> <span class="identifier">ascii</span><span class="special">::</span><span class="identifier">string</span><span class="special">;</span>
57        <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">qi</span><span class="special">::</span><span class="identifier">labels</span><span class="special">;</span>
58
59        <span class="keyword">using</span> <span class="identifier">phoenix</span><span class="special">::</span><span class="identifier">construct</span><span class="special">;</span>
60        <span class="keyword">using</span> <span class="identifier">phoenix</span><span class="special">::</span><span class="identifier">val</span><span class="special">;</span>
61
62        <span class="identifier">text</span> <span class="special">%=</span> <span class="identifier">lexeme</span><span class="special">[+(</span><span class="identifier">char_</span> <span class="special">-</span> <span class="char">'&lt;'</span><span class="special">)];</span>
63        <span class="identifier">node</span> <span class="special">%=</span> <span class="identifier">xml</span> <span class="special">|</span> <span class="identifier">text</span><span class="special">;</span>
64
65        <span class="identifier">start_tag</span> <span class="special">%=</span>
66                <span class="char">'&lt;'</span>
67            <span class="special">&gt;&gt;</span>  <span class="special">!</span><span class="identifier">lit</span><span class="special">(</span><span class="char">'/'</span><span class="special">)</span>
68            <span class="special">&gt;</span>   <span class="identifier">lexeme</span><span class="special">[+(</span><span class="identifier">char_</span> <span class="special">-</span> <span class="char">'&gt;'</span><span class="special">)]</span>
69            <span class="special">&gt;</span>   <span class="char">'&gt;'</span>
70        <span class="special">;</span>
71
72        <span class="identifier">end_tag</span> <span class="special">=</span>
73                <span class="string">"&lt;/"</span>
74            <span class="special">&gt;</span>   <span class="identifier">lit</span><span class="special">(</span><span class="identifier">_r1</span><span class="special">)</span>
75            <span class="special">&gt;</span>   <span class="char">'&gt;'</span>
76        <span class="special">;</span>
77
78        <span class="identifier">xml</span> <span class="special">%=</span>
79                <span class="identifier">start_tag</span><span class="special">[</span><span class="identifier">_a</span> <span class="special">=</span> <span class="identifier">_1</span><span class="special">]</span>
80            <span class="special">&gt;</span>   <span class="special">*</span><span class="identifier">node</span>
81            <span class="special">&gt;</span>   <span class="identifier">end_tag</span><span class="special">(</span><span class="identifier">_a</span><span class="special">)</span>
82        <span class="special">;</span>
83
84        <span class="identifier">xml</span><span class="special">.</span><span class="identifier">name</span><span class="special">(</span><span class="string">"xml"</span><span class="special">);</span>
85        <span class="identifier">node</span><span class="special">.</span><span class="identifier">name</span><span class="special">(</span><span class="string">"node"</span><span class="special">);</span>
86        <span class="identifier">text</span><span class="special">.</span><span class="identifier">name</span><span class="special">(</span><span class="string">"text"</span><span class="special">);</span>
87        <span class="identifier">start_tag</span><span class="special">.</span><span class="identifier">name</span><span class="special">(</span><span class="string">"start_tag"</span><span class="special">);</span>
88        <span class="identifier">end_tag</span><span class="special">.</span><span class="identifier">name</span><span class="special">(</span><span class="string">"end_tag"</span><span class="special">);</span>
89
90        <span class="identifier">on_error</span><span class="special">&lt;</span><span class="identifier">fail</span><span class="special">&gt;</span>
91        <span class="special">(</span>
92            <span class="identifier">xml</span>
93          <span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span>
94                <span class="special">&lt;&lt;</span> <span class="identifier">val</span><span class="special">(</span><span class="string">"Error! Expecting "</span><span class="special">)</span>
95                <span class="special">&lt;&lt;</span> <span class="identifier">_4</span>                               <span class="comment">// what failed?</span>
96                <span class="special">&lt;&lt;</span> <span class="identifier">val</span><span class="special">(</span><span class="string">" here: \""</span><span class="special">)</span>
97                <span class="special">&lt;&lt;</span> <span class="identifier">construct</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">&gt;(</span><span class="identifier">_3</span><span class="special">,</span> <span class="identifier">_2</span><span class="special">)</span>   <span class="comment">// iterators to error-pos, end</span>
98                <span class="special">&lt;&lt;</span> <span class="identifier">val</span><span class="special">(</span><span class="string">"\""</span><span class="special">)</span>
99                <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span>
100        <span class="special">);</span>
101    <span class="special">}</span>
102
103    <span class="identifier">qi</span><span class="special">::</span><span class="identifier">rule</span><span class="special">&lt;</span><span class="identifier">Iterator</span><span class="special">,</span> <span class="identifier">mini_xml</span><span class="special">(),</span> <span class="identifier">qi</span><span class="special">::</span><span class="identifier">locals</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">&gt;,</span> <span class="identifier">ascii</span><span class="special">::</span><span class="identifier">space_type</span><span class="special">&gt;</span> <span class="identifier">xml</span><span class="special">;</span>
104    <span class="identifier">qi</span><span class="special">::</span><span class="identifier">rule</span><span class="special">&lt;</span><span class="identifier">Iterator</span><span class="special">,</span> <span class="identifier">mini_xml_node</span><span class="special">(),</span> <span class="identifier">ascii</span><span class="special">::</span><span class="identifier">space_type</span><span class="special">&gt;</span> <span class="identifier">node</span><span class="special">;</span>
105    <span class="identifier">qi</span><span class="special">::</span><span class="identifier">rule</span><span class="special">&lt;</span><span class="identifier">Iterator</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">(),</span> <span class="identifier">ascii</span><span class="special">::</span><span class="identifier">space_type</span><span class="special">&gt;</span> <span class="identifier">text</span><span class="special">;</span>
106    <span class="identifier">qi</span><span class="special">::</span><span class="identifier">rule</span><span class="special">&lt;</span><span class="identifier">Iterator</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">(),</span> <span class="identifier">ascii</span><span class="special">::</span><span class="identifier">space_type</span><span class="special">&gt;</span> <span class="identifier">start_tag</span><span class="special">;</span>
107    <span class="identifier">qi</span><span class="special">::</span><span class="identifier">rule</span><span class="special">&lt;</span><span class="identifier">Iterator</span><span class="special">,</span> <span class="keyword">void</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">),</span> <span class="identifier">ascii</span><span class="special">::</span><span class="identifier">space_type</span><span class="special">&gt;</span> <span class="identifier">end_tag</span><span class="special">;</span>
108<span class="special">};</span>
109</pre>
110<p>
111        </p>
112<p>
113          What's new?
114        </p>
115<h6>
116<a name="spirit.qi.tutorials.mini_xml___error_handling.h0"></a>
117          <span class="phrase"><a name="spirit.qi.tutorials.mini_xml___error_handling.readable_names"></a></span><a class="link" href="mini_xml___error_handling.html#spirit.qi.tutorials.mini_xml___error_handling.readable_names">Readable
118          Names</a>
119        </h6>
120<p>
121          First, when we call the base class, we give the grammar a name:
122        </p>
123<pre class="programlisting"><span class="special">:</span> <span class="identifier">mini_xml_grammar</span><span class="special">::</span><span class="identifier">base_type</span><span class="special">(</span><span class="identifier">xml</span><span class="special">,</span> <span class="string">"xml"</span><span class="special">)</span>
124</pre>
125<p>
126          Then, we name all our rules:
127        </p>
128<pre class="programlisting"><span class="identifier">xml</span><span class="special">.</span><span class="identifier">name</span><span class="special">(</span><span class="string">"xml"</span><span class="special">);</span>
129<span class="identifier">node</span><span class="special">.</span><span class="identifier">name</span><span class="special">(</span><span class="string">"node"</span><span class="special">);</span>
130<span class="identifier">text</span><span class="special">.</span><span class="identifier">name</span><span class="special">(</span><span class="string">"text"</span><span class="special">);</span>
131<span class="identifier">start_tag</span><span class="special">.</span><span class="identifier">name</span><span class="special">(</span><span class="string">"start_tag"</span><span class="special">);</span>
132<span class="identifier">end_tag</span><span class="special">.</span><span class="identifier">name</span><span class="special">(</span><span class="string">"end_tag"</span><span class="special">);</span>
133</pre>
134<h6>
135<a name="spirit.qi.tutorials.mini_xml___error_handling.h1"></a>
136          <span class="phrase"><a name="spirit.qi.tutorials.mini_xml___error_handling.on_success"></a></span><a class="link" href="mini_xml___error_handling.html#spirit.qi.tutorials.mini_xml___error_handling.on_success">On Success</a>
137        </h6>
138<p>
139          <code class="computeroutput"><span class="identifier">on_success</span></code> declares a handler
140          that is applied when a rule is succesfully matched.
141        </p>
142<pre class="programlisting"><span class="identifier">on_success</span><span class="special">(</span><span class="identifier">rule</span><span class="special">,</span> <span class="identifier">handler</span><span class="special">)</span>
143</pre>
144<p>
145          This specifies that the handler will be called when a rule is matched successfully.
146          The handler has the following signature:
147        </p>
148<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">handler</span><span class="special">(</span>
149	<span class="identifier">fusion</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span>
150		<span class="identifier">Iterator</span><span class="special">&amp;</span> <span class="identifier">first</span><span class="special">,</span>
151		<span class="identifier">Iterator</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">last</span><span class="special">,</span>
152		<span class="identifier">Iterator</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">i</span><span class="special">&gt;</span> <span class="identifier">args</span><span class="special">,</span>
153	<span class="identifier">Context</span><span class="special">&amp;</span> <span class="identifier">context</span><span class="special">)</span>
154</pre>
155<p>
156          <code class="computeroutput"><span class="identifier">first</span></code> points to the position
157          in the input sequence before the rule is matched. <code class="computeroutput"><span class="identifier">last</span></code>
158          points to the last position in the input sequence. <code class="computeroutput"><span class="identifier">i</span></code>
159          points to the position in the input sequence following the last character
160          that was consumed by the rule.
161        </p>
162<p>
163          A success handler can be used to annotate each matched rule in the grammar
164          with additional information about the portion of the input that matched
165          the rule. In a compiler application, this can be a combination of file,
166          line number and column number from the input stream for reporting diagnostics
167          or other messages.
168        </p>
169<h6>
170<a name="spirit.qi.tutorials.mini_xml___error_handling.h2"></a>
171          <span class="phrase"><a name="spirit.qi.tutorials.mini_xml___error_handling.on_error"></a></span><a class="link" href="mini_xml___error_handling.html#spirit.qi.tutorials.mini_xml___error_handling.on_error">On Error</a>
172        </h6>
173<p>
174          <code class="computeroutput"><span class="identifier">on_error</span></code> declares our error
175          handler:
176        </p>
177<pre class="programlisting"><span class="identifier">on_error</span><span class="special">&lt;</span><span class="identifier">Action</span><span class="special">&gt;(</span><span class="identifier">rule</span><span class="special">,</span> <span class="identifier">handler</span><span class="special">)</span>
178</pre>
179<p>
180          This will specify what we will do when we get an error. We will print out
181          an error message using phoenix:
182        </p>
183<pre class="programlisting"><span class="identifier">on_error</span><span class="special">&lt;</span><span class="identifier">fail</span><span class="special">&gt;</span>
184<span class="special">(</span>
185    <span class="identifier">xml</span>
186  <span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span>
187        <span class="special">&lt;&lt;</span> <span class="identifier">val</span><span class="special">(</span><span class="string">"Error! Expecting "</span><span class="special">)</span>
188        <span class="special">&lt;&lt;</span> <span class="identifier">_4</span>                               <span class="comment">// what failed?</span>
189        <span class="special">&lt;&lt;</span> <span class="identifier">val</span><span class="special">(</span><span class="string">" here: \""</span><span class="special">)</span>
190        <span class="special">&lt;&lt;</span> <span class="identifier">construct</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">&gt;(</span><span class="identifier">_3</span><span class="special">,</span> <span class="identifier">_2</span><span class="special">)</span>   <span class="comment">// iterators to error-pos, end</span>
191        <span class="special">&lt;&lt;</span> <span class="identifier">val</span><span class="special">(</span><span class="string">"\""</span><span class="special">)</span>
192        <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span>
193<span class="special">);</span>
194</pre>
195<p>
196          we choose to <code class="computeroutput"><span class="identifier">fail</span></code> in our
197          example for the <code class="computeroutput"><span class="identifier">Action</span></code>:
198          Quit and fail. Return a no_match (false). It can be one of:
199        </p>
200<div class="informaltable"><table class="table">
201<colgroup>
202<col>
203<col>
204</colgroup>
205<thead><tr>
206<th>
207                  <p>
208                    <code class="computeroutput"><span class="identifier">Action</span></code>
209                  </p>
210                </th>
211<th>
212                  <p>
213                    Description
214                  </p>
215                </th>
216</tr></thead>
217<tbody>
218<tr>
219<td>
220                  <p>
221                    fail
222                  </p>
223                </td>
224<td>
225                  <p>
226                    Quit and fail. Return a no_match.
227                  </p>
228                </td>
229</tr>
230<tr>
231<td>
232                  <p>
233                    retry
234                  </p>
235                </td>
236<td>
237                  <p>
238                    Attempt error recovery, possibly moving the iterator position.
239                  </p>
240                </td>
241</tr>
242<tr>
243<td>
244                  <p>
245                    accept
246                  </p>
247                </td>
248<td>
249                  <p>
250                    Force success, moving the iterator position appropriately.
251                  </p>
252                </td>
253</tr>
254<tr>
255<td>
256                  <p>
257                    rethrow
258                  </p>
259                </td>
260<td>
261                  <p>
262                    Rethrows the error.
263                  </p>
264                </td>
265</tr>
266</tbody>
267</table></div>
268<p>
269          <code class="computeroutput"><span class="identifier">rule</span></code> is the rule to which
270          the handler is attached. In our case, we are attaching to the <code class="computeroutput"><span class="identifier">xml</span></code> rule.
271        </p>
272<p>
273          <code class="computeroutput"><span class="identifier">handler</span></code> is the actual error
274          handling function. It expects 4 arguments:
275        </p>
276<div class="informaltable"><table class="table">
277<colgroup>
278<col>
279<col>
280</colgroup>
281<thead><tr>
282<th>
283                  <p>
284                    Arg
285                  </p>
286                </th>
287<th>
288                  <p>
289                    Description
290                  </p>
291                </th>
292</tr></thead>
293<tbody>
294<tr>
295<td>
296                  <p>
297                    first
298                  </p>
299                </td>
300<td>
301                  <p>
302                    The position of the iterator when the rule with the handler was
303                    entered.
304                  </p>
305                </td>
306</tr>
307<tr>
308<td>
309                  <p>
310                    last
311                  </p>
312                </td>
313<td>
314                  <p>
315                    The end of input.
316                  </p>
317                </td>
318</tr>
319<tr>
320<td>
321                  <p>
322                    error-pos
323                  </p>
324                </td>
325<td>
326                  <p>
327                    The actual position of the iterator where the error occurred.
328                  </p>
329                </td>
330</tr>
331<tr>
332<td>
333                  <p>
334                    what
335                  </p>
336                </td>
337<td>
338                  <p>
339                    What failed: a string describing the failure.
340                  </p>
341                </td>
342</tr>
343</tbody>
344</table></div>
345<h6>
346<a name="spirit.qi.tutorials.mini_xml___error_handling.h3"></a>
347          <span class="phrase"><a name="spirit.qi.tutorials.mini_xml___error_handling.expectation_points"></a></span><a class="link" href="mini_xml___error_handling.html#spirit.qi.tutorials.mini_xml___error_handling.expectation_points">Expectation
348          Points</a>
349        </h6>
350<p>
351          You might not have noticed it, but some of our expressions changed from
352          using the <code class="computeroutput"><span class="special">&gt;&gt;</span></code> to <code class="computeroutput"><span class="special">&gt;</span></code>. Look, for example:
353        </p>
354<pre class="programlisting"><span class="identifier">end_tag</span> <span class="special">=</span>
355        <span class="string">"&lt;/"</span>
356    <span class="special">&gt;</span>   <span class="identifier">lit</span><span class="special">(</span><span class="identifier">_r1</span><span class="special">)</span>
357    <span class="special">&gt;</span>   <span class="char">'&gt;'</span>
358<span class="special">;</span>
359</pre>
360<p>
361          What is it? It's the <span class="emphasis"><em>expectation</em></span> operator. You will
362          have some "deterministic points" in the grammar. Those are the
363          places where backtracking <span class="bold"><strong>cannot</strong></span> occur.
364          For our example above, when you get a <code class="computeroutput"><span class="string">"&lt;/"</span></code>,
365          you definitely must see a valid end-tag label next. It should be the one
366          you got from the start-tag. After that, you definitely must have a <code class="computeroutput"><span class="char">'&gt;'</span></code> next. Otherwise, there is no point in
367          proceeding and trying other branches, regardless where they are. The input
368          is definitely erroneous. When this happens, an expectation_failure exception
369          is thrown. Somewhere outward, the error handler will catch the exception.
370        </p>
371<p>
372          Try building the parser: <a href="../../../../../example/qi/mini_xml3.cpp" target="_top">../../example/qi/mini_xml3.cpp</a>.
373          You can find some examples in: <a href="../../../../../example/qi/mini_xml_samples" target="_top">../../example/qi/mini_xml_samples</a>
374          for testing purposes. "4.toyxml" has an error in it:
375        </p>
376<pre class="programlisting"><span class="special">&lt;</span><span class="identifier">foo</span><span class="special">&gt;&lt;</span><span class="identifier">bar</span><span class="special">&gt;&lt;/</span><span class="identifier">foo</span><span class="special">&gt;&lt;/</span><span class="identifier">bar</span><span class="special">&gt;</span>
377</pre>
378<p>
379          Running the example with this gives you:
380        </p>
381<pre class="programlisting"><span class="identifier">Error</span><span class="special">!</span> <span class="identifier">Expecting</span> <span class="string">"bar"</span> <span class="identifier">here</span><span class="special">:</span> <span class="string">"foo&gt;&lt;/bar&gt;"</span>
382<span class="identifier">Error</span><span class="special">!</span> <span class="identifier">Expecting</span> <span class="identifier">end_tag</span> <span class="identifier">here</span><span class="special">:</span> <span class="string">"&lt;bar&gt;&lt;/foo&gt;&lt;/bar&gt;"</span>
383<span class="special">-------------------------</span>
384<span class="identifier">Parsing</span> <span class="identifier">failed</span>
385<span class="special">-------------------------</span>
386</pre>
387</div>
388<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
389<td align="left"></td>
390<td align="right"><div class="copyright-footer">Copyright © 2001-2011 Joel de Guzman, Hartmut Kaiser<p>
391        Distributed under the Boost Software License, Version 1.0. (See accompanying
392        file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
393      </p>
394</div></td>
395</tr></table>
396<hr>
397<div class="spirit-nav">
398<a accesskey="p" href="mini_xml___asts_.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../tutorials.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../quick_reference.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
399</div>
400</body>
401</html>
402