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">>></span> <span class="identifier">expression</span> <span class="special">>></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">>></span> <span class="special">*((</span><span class="char">'*'</span> <span class="special">>></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">>></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">>></span> <span class="special">*((</span><span class="char">'+'</span> <span class="special">>></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">>></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 >> 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">>></span></code> operator 201 instead for this purpose. We take the <code class="computeroutput"><span class="special">>></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">>></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"><</span><span class="keyword">int</span><span class="special">></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"><</span><span class="keyword">int</span><span class="special">></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"><</span><span class="keyword">int</span><span class="special">>::</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"><</span><span class="keyword">int</span><span class="special">>::</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"><<</span> <span class="special">*</span><span class="identifier">it</span> <span class="special"><<</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"><<</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"><</span><span class="keyword">int</span><span class="special">></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<int>`</b></p> 263<div class="table-contents"><table class="table" summary="Different output formats for `std::vector<int>`"> 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"><<</span> 291 <span class="special">*(</span><span class="identifier">int_</span> 292 <span class="special"><<</span> <span class="char">','</span><span class="special">)</span> <span class="special"><<</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"><<</span> <span class="identifier">int_</span> 312 <span class="special"><<</span> <span class="char">')'</span> 313 <span class="special"><<</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"><<</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"><<</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_ << 383 eol)`</b></p> 384<div class="table-contents"><table class="table" summary="Different data types usable with the output format `*(int_ << 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"><</span><span class="keyword">int</span><span class="special">></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"><</span><span class="keyword">int</span><span class="special">></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"><</span><span class="keyword">long</span><span class="special">,</span> <span class="number">20</span><span class="special">></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