• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<html>
2<head>
3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
4<title>Introduction</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="../index.html" title="Spirit 2.5.8">
9<link rel="prev" href="what_s_new/spirit_1_x.html" title="Spirit Classic">
10<link rel="next" href="structure.html" title="Structure">
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="what_s_new/spirit_1_x.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.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="structure.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
24</div>
25<div class="section">
26<div class="titlepage"><div><div><h2 class="title" style="clear: both">
27<a name="spirit.introduction"></a><a class="link" href="introduction.html" title="Introduction">Introduction</a>
28</h2></div></div></div>
29<p>
30      Boost Spirit is an object-oriented, recursive-descent parser and output generation
31      library for C++. It allows you to write grammars and format descriptions using
32      a format similar to Extended Backus Naur Form (EBNF)<a href="#ftn.spirit.introduction.f0" class="footnote" name="spirit.introduction.f0"><sup class="footnote">[2]</sup></a> directly in C++. These inline grammar specifications can mix freely
33      with other C++ code and, thanks to the generative power of C++ templates, are
34      immediately executable. In retrospect, conventional compiler-compilers or parser-generators
35      have to perform an additional translation step from the source EBNF code to
36      C or C++ code.
37    </p>
38<p>
39      The syntax and semantics of the libraries' API directly form domain-specific
40      embedded languages (DSEL). In fact, Spirit exposes 3 different DSELs to the
41      user:
42    </p>
43<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
44<li class="listitem">
45          one for creating parser grammars,
46        </li>
47<li class="listitem">
48          one for the specification of the required tokens to be used for parsing,
49        </li>
50<li class="listitem">
51          and one for the description of the required output formats.
52        </li>
53</ul></div>
54<p>
55      Since the target input grammars and output formats are written entirely in
56      C++ we do not need any separate tools to compile, preprocess or integrate those
57      into the build process. <a href="http://boost-spirit.com" target="_top">Spirit</a>
58      allows seamless integration of the parsing and output generation process with
59      other C++ code. This often allows for simpler and more efficient code.
60    </p>
61<p>
62      Both the created parsers and generators are fully attributed, which allows
63      you to easily build and handle hierarchical data structures in memory. These
64      data structures resemble the structure of the input data and can directly be
65      used to generate arbitrarily-formatted output.
66    </p>
67<p>
68      The <a class="link" href="introduction.html#spirit.spiritstructure" title="Figure 1. The overall structure of the Boost Spirit library">figure</a> below depicts the
69      overall structure of the Boost Spirit library. The library consists of 4 major
70      parts:
71    </p>
72<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
73<li class="listitem">
74          <a href="../../../../../libs/spirit/classic/index.html" target="_top"><span class="emphasis"><em>Spirit.Classic</em></span></a>:
75          This is the almost-unchanged code base taken from the former Boost Spirit
76          V1.8 distribution. It has been moved into the namespace boost::spirit::classic.
77          A special compatibility layer has been added to ensure complete compatibility
78          with existing code using Spirit V1.8.
79        </li>
80<li class="listitem">
81          <span class="emphasis"><em>Spirit.Qi</em></span>: This is the parser library allowing you
82          to build recursive descent parsers. The exposed domain-specific language
83          can be used to describe the grammars to implement, and the rules for storing
84          the parsed information.
85        </li>
86<li class="listitem">
87          <span class="emphasis"><em>Spirit.Lex</em></span>: This is the library usable to create tokenizers
88          (lexers). The domain-specific language exposed by <span class="emphasis"><em>Spirit.Lex</em></span>
89          allows you to define regular expressions used to match tokens (create token
90          definitions), associate these regular expressions with code to be executed
91          whenever they are matched, and to add the token definitions to the lexical
92          analyzer.
93        </li>
94<li class="listitem">
95          <span class="emphasis"><em>Spirit.Karma</em></span>: This is the generator library allowing
96          you to create code for recursive descent, data type-driven output formatting.
97          The exposed domain-specific language is almost equivalent to the parser
98          description language used in <span class="emphasis"><em>Spirit.Qi</em></span>, except that
99          it is used to describe the required output format to generate from a given
100          data structure.
101        </li>
102</ul></div>
103<p>
104      </p>
105<div class="figure">
106<a name="spirit.spiritstructure"></a><p class="title"><b>Figure 1. The overall structure of the Boost Spirit library</b></p>
107<div class="figure-contents"><span class="inlinemediaobject"><img src=".././images/spiritstructure.png" alt="The overall structure of the Boost Spirit library"></span></div>
108</div>
109<p><br class="figure-break">
110    </p>
111<p>
112      The three components, <span class="emphasis"><em>Spirit.Qi</em></span>, <span class="emphasis"><em>Spirit.Karma</em></span>
113      and <span class="emphasis"><em>Spirit.Lex</em></span>, are designed to be used either stand alone,
114      or together. The general methodology is to use the token sequence generated
115      by <span class="emphasis"><em>Spirit.Lex</em></span> as the input for a parser generated by
116      <span class="emphasis"><em>Spirit.Qi</em></span>. On the opposite side of the equation, the hierarchical
117      data structures generated by <span class="emphasis"><em>Spirit.Qi</em></span> are used for the
118      output generators created using <span class="emphasis"><em>Spirit.Karma</em></span>. However,
119      there is nothing to stop you from using any of these components all by themselves.
120    </p>
121<p>
122      The <a class="link" href="introduction.html#spirit.spiritkarmaflow" title="Figure 2. The place of Spirit.Qi and Spirit.Karma in a data transformation flow of a typical application">figure</a> below shows the typical
123      data flow of some input being converted to some internal representation. After
124      some (optional) transformation these data are converted back into some different,
125      external representation. The picture highlights Spirit's place in this data
126      transformation flow.
127    </p>
128<p>
129      </p>
130<div class="figure">
131<a name="spirit.spiritkarmaflow"></a><p class="title"><b>Figure 2. The place of <span class="emphasis"><em>Spirit.Qi</em></span> and <span class="emphasis"><em>Spirit.Karma</em></span>
132      in a data transformation flow of a typical application</b></p>
133<div class="figure-contents"><span class="inlinemediaobject"><img src=".././images/spiritkarmaflow.png" alt="The place of Spirit.Qi and Spirit.Karma in a data transformation flow of a typical application"></span></div>
134</div>
135<p><br class="figure-break">
136    </p>
137<h4>
138<a name="spirit.introduction.h0"></a>
139      <span class="phrase"><a name="spirit.introduction.a_quick_overview_of_parsing_with__emphasis_spirit_qi__emphasis_"></a></span><a class="link" href="introduction.html#spirit.introduction.a_quick_overview_of_parsing_with__emphasis_spirit_qi__emphasis_">A
140      Quick Overview of Parsing with <span class="emphasis"><em>Spirit.Qi</em></span></a>
141    </h4>
142<p>
143      <span class="emphasis"><em>Spirit.Qi</em></span> is Spirit's sublibrary dealing with generating
144      parsers based on a given target grammar (essentially a format description of
145      the input data to read).
146    </p>
147<p>
148      A simple EBNF grammar snippet:
149    </p>
150<pre class="programlisting"><span class="identifier">group</span>       <span class="special">::=</span> <span class="char">'('</span> <span class="identifier">expression</span> <span class="char">')'</span>
151<span class="identifier">factor</span>      <span class="special">::=</span> <span class="identifier">integer</span> <span class="special">|</span> <span class="identifier">group</span>
152<span class="identifier">term</span>        <span class="special">::=</span> <span class="identifier">factor</span> <span class="special">((</span><span class="char">'*'</span> <span class="identifier">factor</span><span class="special">)</span> <span class="special">|</span> <span class="special">(</span><span class="char">'/'</span> <span class="identifier">factor</span><span class="special">))*</span>
153<span class="identifier">expression</span>  <span class="special">::=</span> <span class="identifier">term</span> <span class="special">((</span><span class="char">'+'</span> <span class="identifier">term</span><span class="special">)</span> <span class="special">|</span> <span class="special">(</span><span class="char">'-'</span> <span class="identifier">term</span><span class="special">))*</span>
154</pre>
155<p>
156      is approximated using facilities of Spirit's <span class="emphasis"><em>Qi</em></span> sublibrary
157      as seen in this code snippet:
158    </p>
159<pre class="programlisting"><span class="identifier">group</span>       <span class="special">=</span> <span class="char">'('</span> <span class="special">&gt;&gt;</span> <span class="identifier">expression</span> <span class="special">&gt;&gt;</span> <span class="char">')'</span><span class="special">;</span>
160<span class="identifier">factor</span>      <span class="special">=</span> <span class="identifier">integer</span> <span class="special">|</span> <span class="identifier">group</span><span class="special">;</span>
161<span class="identifier">term</span>        <span class="special">=</span> <span class="identifier">factor</span> <span class="special">&gt;&gt;</span> <span class="special">*((</span><span class="char">'*'</span> <span class="special">&gt;&gt;</span> <span class="identifier">factor</span><span class="special">)</span> <span class="special">|</span> <span class="special">(</span><span class="char">'/'</span> <span class="special">&gt;&gt;</span> <span class="identifier">factor</span><span class="special">));</span>
162<span class="identifier">expression</span>  <span class="special">=</span> <span class="identifier">term</span> <span class="special">&gt;&gt;</span> <span class="special">*((</span><span class="char">'+'</span> <span class="special">&gt;&gt;</span> <span class="identifier">term</span><span class="special">)</span> <span class="special">|</span> <span class="special">(</span><span class="char">'-'</span> <span class="special">&gt;&gt;</span> <span class="identifier">term</span><span class="special">));</span>
163</pre>
164<p>
165      Through the magic of expression templates, this is perfectly valid and executable
166      C++ code. The production rule <code class="computeroutput"><span class="identifier">expression</span></code>
167      is, in fact, an object that has a member function <code class="computeroutput"><span class="identifier">parse</span></code>
168      that does the work given a source code written in the grammar that we have
169      just declared. Yes, it's a calculator. We shall simplify for now by skipping
170      the type declarations and the definition of the rule <code class="computeroutput"><span class="identifier">integer</span></code>
171      invoked by <code class="computeroutput"><span class="identifier">factor</span></code>. Now, the
172      production rule <code class="computeroutput"><span class="identifier">expression</span></code>
173      in our grammar specification, traditionally called the <code class="computeroutput"><span class="identifier">start</span></code>
174      symbol, can recognize inputs such as:
175    </p>
176<pre class="programlisting"><span class="number">12345</span>
177<span class="special">-</span><span class="number">12345</span>
178<span class="special">+</span><span class="number">12345</span>
179<span class="number">1</span> <span class="special">+</span> <span class="number">2</span>
180<span class="number">1</span> <span class="special">*</span> <span class="number">2</span>
181<span class="number">1</span><span class="special">/</span><span class="number">2</span> <span class="special">+</span> <span class="number">3</span><span class="special">/</span><span class="number">4</span>
182<span class="number">1</span> <span class="special">+</span> <span class="number">2</span> <span class="special">+</span> <span class="number">3</span> <span class="special">+</span> <span class="number">4</span>
183<span class="number">1</span> <span class="special">*</span> <span class="number">2</span> <span class="special">*</span> <span class="number">3</span> <span class="special">*</span> <span class="number">4</span>
184<span class="special">(</span><span class="number">1</span> <span class="special">+</span> <span class="number">2</span><span class="special">)</span> <span class="special">*</span> <span class="special">(</span><span class="number">3</span> <span class="special">+</span> <span class="number">4</span><span class="special">)</span>
185<span class="special">(-</span><span class="number">1</span> <span class="special">+</span> <span class="number">2</span><span class="special">)</span> <span class="special">*</span> <span class="special">(</span><span class="number">3</span> <span class="special">+</span> <span class="special">-</span><span class="number">4</span><span class="special">)</span>
186<span class="number">1</span> <span class="special">+</span> <span class="special">((</span><span class="number">6</span> <span class="special">*</span> <span class="number">200</span><span class="special">)</span> <span class="special">-</span> <span class="number">20</span><span class="special">)</span> <span class="special">/</span> <span class="number">6</span>
187<span class="special">(</span><span class="number">1</span> <span class="special">+</span> <span class="special">(</span><span class="number">2</span> <span class="special">+</span> <span class="special">(</span><span class="number">3</span> <span class="special">+</span> <span class="special">(</span><span class="number">4</span> <span class="special">+</span> <span class="number">5</span><span class="special">))))</span>
188</pre>
189<p>
190      Certainly we have modified the original EBNF syntax. This is done to conform
191      to C++ syntax rules. Most notably we see the abundance of shift &gt;&gt; operators.
192      Since there are no 'empty' operators in C++, it is simply not possible to write
193      something like:
194    </p>
195<pre class="programlisting"><span class="identifier">a</span> <span class="identifier">b</span>
196</pre>
197<p>
198      as seen in math syntax, for example, to mean multiplication or, in our case,
199      as seen in EBNF syntax to mean sequencing (b should follow a). <span class="emphasis"><em>Spirit.Qi</em></span>
200      uses the shift <code class="computeroutput"><span class="special">&gt;&gt;</span></code> operator
201      instead for this purpose. We take the <code class="computeroutput"><span class="special">&gt;&gt;</span></code>
202      operator, with arrows pointing to the right, to mean "is followed by".
203      Thus we write:
204    </p>
205<pre class="programlisting"><span class="identifier">a</span> <span class="special">&gt;&gt;</span> <span class="identifier">b</span>
206</pre>
207<p>
208      The alternative operator <code class="computeroutput"><span class="special">|</span></code> and
209      the parentheses <code class="computeroutput"><span class="special">()</span></code> remain as is.
210      The assignment operator <code class="computeroutput"><span class="special">=</span></code> is used
211      in place of EBNF's <code class="computeroutput"><span class="special">::=</span></code>. Last but
212      not least, the Kleene star <code class="computeroutput"><span class="special">*</span></code>,
213      which in this case is a postfix operator in EBNF becomes a prefix. Instead
214      of:
215    </p>
216<pre class="programlisting"><span class="identifier">a</span><span class="special">*</span> <span class="comment">//... in EBNF syntax,</span>
217</pre>
218<p>
219      we write:
220    </p>
221<pre class="programlisting"><span class="special">*</span><span class="identifier">a</span> <span class="comment">//... in Spirit.</span>
222</pre>
223<p>
224      since there are no postfix stars, <code class="computeroutput"><span class="special">*</span></code>,
225      in C/C++. Finally, we terminate each rule with the ubiquitous semi-colon,
226      <code class="computeroutput"><span class="special">;</span></code>.
227    </p>
228<h4>
229<a name="spirit.introduction.h1"></a>
230      <span class="phrase"><a name="spirit.introduction.a_quick_overview_of_output_generation_with__emphasis_spirit_karma__emphasis_"></a></span><a class="link" href="introduction.html#spirit.introduction.a_quick_overview_of_output_generation_with__emphasis_spirit_karma__emphasis_">A
231      Quick Overview of Output Generation with <span class="emphasis"><em>Spirit.Karma</em></span></a>
232    </h4>
233<p>
234      Spirit not only allows you to describe the structure of the input, it also
235      enables the specification of the output format for your data in a similar way,
236      and based on a single syntax and compatible semantics.
237    </p>
238<p>
239      Let's assume we need to generate a textual representation from a simple data
240      structure such as a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span></code>. Conventional
241      code probably would look like:
242    </p>
243<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">v</span> <span class="special">(</span><span class="identifier">initialize_and_fill</span><span class="special">());</span>
244<span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;::</span><span class="identifier">iterator</span> <span class="identifier">end</span> <span class="special">=</span> <span class="identifier">v</span><span class="special">.</span><span class="identifier">end</span><span class="special">();</span>
245<span class="keyword">for</span> <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;::</span><span class="identifier">iterator</span> <span class="identifier">it</span> <span class="special">=</span> <span class="identifier">v</span><span class="special">.</span><span class="identifier">begin</span><span class="special">();</span> <span class="identifier">it</span> <span class="special">!=</span> <span class="identifier">end</span><span class="special">;</span> <span class="special">++</span><span class="identifier">it</span><span class="special">)</span>
246    <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="special">*</span><span class="identifier">it</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
247</pre>
248<p>
249      which is not very flexible and quite difficult to maintain when it comes to
250      changing the required output format. Spirit's sublibrary <span class="emphasis"><em>Karma</em></span>
251      allows you to specify output formats for arbitrary data structures in a very
252      flexible way. The following snippet is the <span class="emphasis"><em>Karma</em></span> format
253      description used to create the same output as the traditional code above:
254    </p>
255<pre class="programlisting"><span class="special">*(</span><span class="identifier">int_</span> <span class="special">&lt;&lt;</span> <span class="identifier">eol</span><span class="special">)</span>
256</pre>
257<p>
258      Here are some more examples of format descriptions for different output representations
259      of the same <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span></code>:
260    </p>
261<div class="table">
262<a name="spirit.introduction.different_output_formats_for__std__vector_int__"></a><p class="title"><b>Table 2. Different output formats for `std::vector&lt;int&gt;`</b></p>
263<div class="table-contents"><table class="table" summary="Different output formats for `std::vector&lt;int&gt;`">
264<colgroup>
265<col>
266<col>
267<col>
268</colgroup>
269<thead><tr>
270<th>
271              <p>
272                Format
273              </p>
274            </th>
275<th>
276              <p>
277                Example
278              </p>
279            </th>
280<th>
281              <p>
282                Description
283              </p>
284            </th>
285</tr></thead>
286<tbody>
287<tr>
288<td>
289              <p>
290                <code class="computeroutput"><span class="char">'['</span> <span class="special">&lt;&lt;</span>
291                <span class="special">*(</span><span class="identifier">int_</span>
292                <span class="special">&lt;&lt;</span> <span class="char">','</span><span class="special">)</span> <span class="special">&lt;&lt;</span>
293                <span class="char">']'</span></code>
294              </p>
295            </td>
296<td>
297              <p>
298                <code class="computeroutput"><span class="special">[</span><span class="number">1</span><span class="special">,</span><span class="number">8</span><span class="special">,</span><span class="number">10</span><span class="special">,]</span></code>
299              </p>
300            </td>
301<td>
302              <p>
303                Comma separated list of integers
304              </p>
305            </td>
306</tr>
307<tr>
308<td>
309              <p>
310                <code class="computeroutput"><span class="special">*(</span><span class="char">'('</span>
311                <span class="special">&lt;&lt;</span> <span class="identifier">int_</span>
312                <span class="special">&lt;&lt;</span> <span class="char">')'</span>
313                <span class="special">&lt;&lt;</span> <span class="char">','</span><span class="special">)</span></code>
314              </p>
315            </td>
316<td>
317              <p>
318                <code class="computeroutput"><span class="special">(</span><span class="number">1</span><span class="special">),(</span><span class="number">8</span><span class="special">),(</span><span class="number">10</span><span class="special">),</span></code>
319              </p>
320            </td>
321<td>
322              <p>
323                Comma separated list of integers in parenthesis
324              </p>
325            </td>
326</tr>
327<tr>
328<td>
329              <p>
330                <code class="computeroutput"><span class="special">*</span><span class="identifier">hex</span></code>
331              </p>
332            </td>
333<td>
334              <p>
335                <code class="computeroutput"><span class="number">18</span><span class="identifier">a</span></code>
336              </p>
337            </td>
338<td>
339              <p>
340                A list of hexadecimal numbers
341              </p>
342            </td>
343</tr>
344<tr>
345<td>
346              <p>
347                <code class="computeroutput"><span class="special">*(</span><span class="identifier">double_</span>
348                <span class="special">&lt;&lt;</span> <span class="char">','</span><span class="special">)</span></code>
349              </p>
350            </td>
351<td>
352              <p>
353                <code class="computeroutput"><span class="number">1.0</span><span class="special">,</span><span class="number">8.0</span><span class="special">,</span><span class="number">10.0</span><span class="special">,</span></code>
354              </p>
355            </td>
356<td>
357              <p>
358                A list of floating point numbers
359              </p>
360            </td>
361</tr>
362</tbody>
363</table></div>
364</div>
365<br class="table-break"><p>
366      We will see later in this documentation how it is possible to avoid printing
367      the trailing <code class="computeroutput"><span class="char">','</span></code>.
368    </p>
369<p>
370      Overall, the syntax is similar to <span class="emphasis"><em>Spirit.Qi</em></span> with the exception
371      that we use the <code class="computeroutput"><span class="special">&lt;&lt;</span></code> operator
372      for output concatenation. This should be easy to understand as it follows the
373      conventions used in the Standard's I/O streams.
374    </p>
375<p>
376      Another important feature of <span class="emphasis"><em>Spirit.Karma</em></span> allows you to
377      fully decouple the data type from the output format. You can use the same output
378      format with different data types as long as these conform conceptually. The
379      next table gives some related examples.
380    </p>
381<div class="table">
382<a name="spirit.introduction.different_data_types_usable_with_the_output_format____int_____eol__"></a><p class="title"><b>Table 3. Different data types usable with the output format `*(int_ &lt;&lt;
383      eol)`</b></p>
384<div class="table-contents"><table class="table" summary="Different data types usable with the output format `*(int_ &lt;&lt;
385      eol)`">
386<colgroup>
387<col>
388<col>
389</colgroup>
390<thead><tr>
391<th>
392              <p>
393                Data type
394              </p>
395            </th>
396<th>
397              <p>
398                Description
399              </p>
400            </th>
401</tr></thead>
402<tbody>
403<tr>
404<td>
405              <p>
406                <code class="computeroutput"><span class="keyword">int</span> <span class="identifier">i</span><span class="special">[</span><span class="number">4</span><span class="special">]</span></code>
407              </p>
408            </td>
409<td>
410              <p>
411                C style arrays
412              </p>
413            </td>
414</tr>
415<tr>
416<td>
417              <p>
418                <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span></code>
419              </p>
420            </td>
421<td>
422              <p>
423                Standard vector
424              </p>
425            </td>
426</tr>
427<tr>
428<td>
429              <p>
430                <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span></code>
431              </p>
432            </td>
433<td>
434              <p>
435                Standard list
436              </p>
437            </td>
438</tr>
439<tr>
440<td>
441              <p>
442                <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">array</span><span class="special">&lt;</span><span class="keyword">long</span><span class="special">,</span> <span class="number">20</span><span class="special">&gt;</span></code>
443              </p>
444            </td>
445<td>
446              <p>
447                Boost array
448              </p>
449            </td>
450</tr>
451</tbody>
452</table></div>
453</div>
454<br class="table-break"><div class="footnotes">
455<br><hr style="width:100; text-align:left;margin-left: 0">
456<div id="ftn.spirit.introduction.f0" class="footnote"><p><a href="#spirit.introduction.f0" class="para"><sup class="para">[2] </sup></a>
457        <a href="http://www.cl.cam.ac.uk/%7Emgk25/iso-14977.pdf" target="_top">ISO-EBNF</a>
458      </p></div>
459</div>
460</div>
461<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
462<td align="left"></td>
463<td align="right"><div class="copyright-footer">Copyright © 2001-2011 Joel de Guzman, Hartmut Kaiser<p>
464        Distributed under the Boost Software License, Version 1.0. (See accompanying
465        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>)
466      </p>
467</div></td>
468</tr></table>
469<hr>
470<div class="spirit-nav">
471<a accesskey="p" href="what_s_new/spirit_1_x.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.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="structure.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
472</div>
473</body>
474</html>
475