1<html> 2<head> 3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 4<title>X3 Program Structure</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 X3 3.0.4"> 8<link rel="up" href="../tutorials.html" title="Tutorials"> 9<link rel="prev" href="employee.html" title="Employee - Parsing into structs"> 10<link rel="next" href="annotation.html" title="Annotations - Decorating the ASTs"> 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="employee.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="annotation.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> 24</div> 25<div class="section"> 26<div class="titlepage"><div><div><h3 class="title"> 27<a name="spirit_x3.tutorials.minimal"></a><a class="link" href="minimal.html" title="X3 Program Structure">X3 Program Structure</a> 28</h3></div></div></div> 29<p> 30 As a prerequisite in understanding this tutorial, please review the previous 31 <a class="link" href="employee.html" title="Employee - Parsing into structs">employee example</a>. This 32 example builds on top of that example. 33 </p> 34<p> 35 So far, to keep things simple, all of the tutorial programs are self contained 36 in one cpp file. In reality, you will want to separate various logical modules 37 of the parser into separate cpp and header files, decoupling the interface 38 from the implememtation. 39 </p> 40<p> 41 There are many ways to structure an X3 parser, but the "minimal" 42 example in this tutorial shows the preferred way. This example basically 43 reuses the same parser as the <a class="link" href="employee.html" title="Employee - Parsing into structs">employee 44 example</a> for the sake of familiarity, but structured to allow separate 45 compilation of the actual parser in its own definition file and cpp file. 46 The cpp files, including main see only the header files --the interfaces. 47 This is a good example on how X3 parsers are structured in a C++ application. 48 </p> 49<h5> 50<a name="spirit_x3.tutorials.minimal.h0"></a> 51 <span class="phrase"><a name="spirit_x3.tutorials.minimal.structure"></a></span><a class="link" href="minimal.html#spirit_x3.tutorials.minimal.structure">Structure</a> 52 </h5> 53<p> 54 The program is structured in a directory with the following header and cpp 55 files: 56 </p> 57<div class="informaltable"><table class="table"> 58<colgroup> 59<col> 60<col> 61</colgroup> 62<thead><tr> 63<th> 64 <p> 65 <code class="computeroutput"><span class="identifier">File</span></code> 66 </p> 67 </th> 68<th> 69 <p> 70 Description 71 </p> 72 </th> 73</tr></thead> 74<tbody> 75<tr> 76<td> 77 <p> 78 <a href="../../../../../example/x3/minimal/ast.hpp" target="_top">ast.hpp</a> 79 </p> 80 </td> 81<td> 82 <p> 83 The AST 84 </p> 85 </td> 86</tr> 87<tr> 88<td> 89 <p> 90 <a href="../../../../../example/x3/minimal/ast_adapted.hpp" target="_top">ast_adapted.hpp</a> 91 </p> 92 </td> 93<td> 94 <p> 95 Fusion adapters 96 </p> 97 </td> 98</tr> 99<tr> 100<td> 101 <p> 102 <a href="../../../../../example/x3/minimal/config.hpp" target="_top">config.hpp</a> 103 </p> 104 </td> 105<td> 106 <p> 107 Configuration 108 </p> 109 </td> 110</tr> 111<tr> 112<td> 113 <p> 114 <a href="../../../../../example/x3/minimal/employee.hpp" target="_top">employee.hpp</a> 115 </p> 116 </td> 117<td> 118 <p> 119 Main parser API 120 </p> 121 </td> 122</tr> 123<tr> 124<td> 125 <p> 126 <a href="../../../../../example/x3/minimal/employee_def.hpp" target="_top">employee_def.hpp</a> 127 </p> 128 </td> 129<td> 130 <p> 131 Parser definitions 132 </p> 133 </td> 134</tr> 135<tr> 136<td> 137 <p> 138 <a href="../../../../../example/x3/minimal/employee.cpp" target="_top">employee.cpp</a> 139 </p> 140 </td> 141<td> 142 <p> 143 Parser instantiation 144 </p> 145 </td> 146</tr> 147<tr> 148<td> 149 <p> 150 <a href="../../../../../example/x3/minimal/main.cpp" target="_top">main.cpp</a> 151 </p> 152 </td> 153<td> 154 <p> 155 Main program 156 </p> 157 </td> 158</tr> 159</tbody> 160</table></div> 161<p> 162 The contents of the files should already be familiar. It's essentially the 163 same <a class="link" href="employee.html" title="Employee - Parsing into structs">employee example</a>. 164 So I will skip the details on how the parser works and focus only on the 165 features needed for refactoring the program into a modular structure suitable 166 for real-world deployment. 167 </p> 168<h5> 169<a name="spirit_x3.tutorials.minimal.h1"></a> 170 <span class="phrase"><a name="spirit_x3.tutorials.minimal.ast"></a></span><a class="link" href="minimal.html#spirit_x3.tutorials.minimal.ast">AST</a> 171 </h5> 172<p> 173 We place the AST declaration here: 174 </p> 175<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">client</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">ast</span> 176<span class="special">{</span> 177 <span class="keyword">struct</span> <span class="identifier">employee</span> 178 <span class="special">{</span> 179 <span class="keyword">int</span> <span class="identifier">age</span><span class="special">;</span> 180 <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">forename</span><span class="special">;</span> 181 <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">surname</span><span class="special">;</span> 182 <span class="keyword">double</span> <span class="identifier">salary</span><span class="special">;</span> 183 <span class="special">};</span> 184 185 <span class="keyword">using</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">fusion</span><span class="special">::</span><span class="keyword">operator</span><span class="special"><<;</span> 186<span class="special">}}</span> 187</pre> 188<h5> 189<a name="spirit_x3.tutorials.minimal.h2"></a> 190 <span class="phrase"><a name="spirit_x3.tutorials.minimal.fusion_adapters"></a></span><a class="link" href="minimal.html#spirit_x3.tutorials.minimal.fusion_adapters">Fusion 191 adapters</a> 192 </h5> 193<p> 194 Here, we adapt the AST for Fusion, making it a first-class fusion citizen: 195 </p> 196<pre class="programlisting"><span class="identifier">BOOST_FUSION_ADAPT_STRUCT</span><span class="special">(</span><span class="identifier">client</span><span class="special">::</span><span class="identifier">ast</span><span class="special">::</span><span class="identifier">employee</span><span class="special">,</span> 197 <span class="identifier">age</span><span class="special">,</span> <span class="identifier">forename</span><span class="special">,</span> <span class="identifier">surname</span><span class="special">,</span> <span class="identifier">salary</span> 198<span class="special">)</span> 199</pre> 200<h5> 201<a name="spirit_x3.tutorials.minimal.h3"></a> 202 <span class="phrase"><a name="spirit_x3.tutorials.minimal.main_parser_api"></a></span><a class="link" href="minimal.html#spirit_x3.tutorials.minimal.main_parser_api">Main 203 parser API</a> 204 </h5> 205<p> 206 This is the main header file that all other cpp files need to include. 207 </p> 208<a name="__tutorial_spirit_declare__"></a><h5> 209<a name="spirit_x3.tutorials.minimal.h4"></a> 210 <span class="phrase"><a name="spirit_x3.tutorials.minimal.boost_spirit_declare"></a></span><a class="link" href="minimal.html#spirit_x3.tutorials.minimal.boost_spirit_declare">BOOST_SPIRIT_DECLARE</a> 211 </h5> 212<p> 213 Remember <a class="link" href="roman.html#__tutorial_spirit_define__"><code class="computeroutput"><span class="identifier">BOOST_SPIRIT_DEFINE</span></code></a>? 214 If not, then you probably want to go back and review that section to get 215 a better understanding of what's happening. 216 </p> 217<p> 218 Here in the header file, instead of <code class="computeroutput"><span class="identifier">BOOST_SPIRIT_DEFINE</span></code>, 219 we use <code class="computeroutput"><span class="identifier">BOOST_SPIRIT_DECLARE</span></code> 220 for the <span class="bold"><strong>top</strong></span> rule. Behind the scenes, what's 221 actually happening is that we are declaring a <code class="computeroutput"><span class="identifier">parse_rule</span></code> 222 function in the client namespace. For example, given a rule named <code class="computeroutput"><span class="identifier">my_rule</span></code>, <code class="computeroutput"><span class="identifier">BOOST_SPIRIT_DECLARE</span><span class="special">(</span><span class="identifier">my_rule</span><span class="special">)</span></code> expands to this code: 223 </p> 224<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Iterator</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Context</span><span class="special">></span> 225<span class="keyword">bool</span> <span class="identifier">parse_rule</span><span class="special">(</span> 226 <span class="keyword">decltype</span><span class="special">(</span><span class="identifier">my_rule</span><span class="special">)</span> 227 <span class="special">,</span> <span class="identifier">Iterator</span><span class="special">&</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">Iterator</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">last</span> 228 <span class="special">,</span> <span class="identifier">Context</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">context</span><span class="special">,</span> <span class="keyword">decltype</span><span class="special">(</span><span class="identifier">my_rule</span><span class="special">)::</span><span class="identifier">attribute_type</span><span class="special">&</span> <span class="identifier">attr</span><span class="special">);</span> 229</pre> 230<p> 231 If you went back and reviewed <a class="link" href="roman.html#__tutorial_spirit_define__">BOOST_SPIRIT_DEFINE</a>, 232 you'll see why it is exactly what we need to use for header files. <code class="computeroutput"><span class="identifier">BOOST_SPIRIT_DECLARE</span></code> generates function 233 declarations that are meant to be placed in hpp (header) files while <code class="computeroutput"><span class="identifier">BOOST_SPIRIT_DEFINE</span></code> generates function 234 definitions that are meant to be placed in cpp files. 235 </p> 236<div class="note"><table border="0" summary="Note"> 237<tr> 238<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../images/note.png"></td> 239<th align="left">Note</th> 240</tr> 241<tr><td align="left" valign="top"><p> 242 <code class="computeroutput"><span class="identifier">BOOST_SPIRIT_DECLARE</span></code> is 243 variadic and may be used for one or more rules. Example: <code class="computeroutput"><span class="identifier">BOOST_SPIRIT_DECLARE</span><span class="special">(</span><span class="identifier">r1</span><span class="special">,</span> <span class="identifier">r2</span><span class="special">,</span> <span class="identifier">r3</span><span class="special">);</span></code> 244 </p></td></tr> 245</table></div> 246<p> 247 In this example, the top rule is <code class="computeroutput"><span class="identifier">employee</span></code>. 248 We declare <code class="computeroutput"><span class="identifier">employee</span></code> in this 249 header file: 250 </p> 251<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">client</span> 252<span class="special">{</span> 253 <span class="keyword">namespace</span> <span class="identifier">parser</span> 254 <span class="special">{</span> 255 <span class="keyword">namespace</span> <span class="identifier">x3</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">spirit</span><span class="special">::</span><span class="identifier">x3</span><span class="special">;</span> 256 <span class="keyword">using</span> <span class="identifier">employee_type</span> <span class="special">=</span> <span class="identifier">x3</span><span class="special">::</span><span class="identifier">rule</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">employee</span><span class="special">,</span> <span class="identifier">ast</span><span class="special">::</span><span class="identifier">employee</span><span class="special">>;</span> 257 <span class="identifier">BOOST_SPIRIT_DECLARE</span><span class="special">(</span><span class="identifier">employee_type</span><span class="special">);</span> 258 <span class="special">}</span> 259 260 <span class="identifier">parser</span><span class="special">::</span><span class="identifier">employee_type</span> <span class="identifier">employee</span><span class="special">();</span> 261<span class="special">}</span> 262</pre> 263<p> 264 We also provide a function that returns an <code class="computeroutput"><span class="identifier">employee</span></code> 265 object. This is the parser that we will use anywhere it is needed. X3 parser 266 objects are very lightweight. They are basically simple tags with no data 267 other than the name of the rule (e.g. "employee"). Notice that 268 we are passing this by value. 269 </p> 270<h5> 271<a name="spirit_x3.tutorials.minimal.h5"></a> 272 <span class="phrase"><a name="spirit_x3.tutorials.minimal.parser_definitions"></a></span><a class="link" href="minimal.html#spirit_x3.tutorials.minimal.parser_definitions">Parser 273 Definitions</a> 274 </h5> 275<p> 276 Here is where we place the actual rules that make up our grammar: 277 </p> 278<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">parser</span> 279<span class="special">{</span> 280 <span class="keyword">namespace</span> <span class="identifier">x3</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">spirit</span><span class="special">::</span><span class="identifier">x3</span><span class="special">;</span> 281 <span class="keyword">namespace</span> <span class="identifier">ascii</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">spirit</span><span class="special">::</span><span class="identifier">x3</span><span class="special">::</span><span class="identifier">ascii</span><span class="special">;</span> 282 283 <span class="keyword">using</span> <span class="identifier">x3</span><span class="special">::</span><span class="identifier">int_</span><span class="special">;</span> 284 <span class="keyword">using</span> <span class="identifier">x3</span><span class="special">::</span><span class="identifier">lit</span><span class="special">;</span> 285 <span class="keyword">using</span> <span class="identifier">x3</span><span class="special">::</span><span class="identifier">double_</span><span class="special">;</span> 286 <span class="keyword">using</span> <span class="identifier">x3</span><span class="special">::</span><span class="identifier">lexeme</span><span class="special">;</span> 287 <span class="keyword">using</span> <span class="identifier">ascii</span><span class="special">::</span><span class="identifier">char_</span><span class="special">;</span> 288 289 <span class="identifier">x3</span><span class="special">::</span><span class="identifier">rule</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">employee</span><span class="special">,</span> <span class="identifier">ast</span><span class="special">::</span><span class="identifier">employee</span><span class="special">></span> <span class="keyword">const</span> <span class="identifier">employee</span> <span class="special">=</span> <span class="string">"employee"</span><span class="special">;</span> 290 291 <span class="keyword">auto</span> <span class="keyword">const</span> <span class="identifier">quoted_string</span> <span class="special">=</span> <span class="identifier">lexeme</span><span class="special">[</span><span class="char">'"'</span> <span class="special">>></span> <span class="special">+(</span><span class="identifier">char_</span> <span class="special">-</span> <span class="char">'"'</span><span class="special">)</span> <span class="special">>></span> <span class="char">'"'</span><span class="special">];</span> 292 293 <span class="keyword">auto</span> <span class="keyword">const</span> <span class="identifier">employee_def</span> <span class="special">=</span> 294 <span class="identifier">lit</span><span class="special">(</span><span class="string">"employee"</span><span class="special">)</span> 295 <span class="special">>></span> <span class="char">'{'</span> 296 <span class="special">>></span> <span class="identifier">int_</span> <span class="special">>></span> <span class="char">','</span> 297 <span class="special">>></span> <span class="identifier">quoted_string</span> <span class="special">>></span> <span class="char">','</span> 298 <span class="special">>></span> <span class="identifier">quoted_string</span> <span class="special">>></span> <span class="char">','</span> 299 <span class="special">>></span> <span class="identifier">double_</span> 300 <span class="special">>></span> <span class="char">'}'</span> 301 <span class="special">;</span> 302 303 <span class="identifier">BOOST_SPIRIT_DEFINE</span><span class="special">(</span><span class="identifier">employee</span><span class="special">);</span> 304<span class="special">}</span> 305 306<span class="identifier">parser</span><span class="special">::</span><span class="identifier">employee_type</span> <span class="identifier">employee</span><span class="special">()</span> 307<span class="special">{</span> 308 <span class="keyword">return</span> <span class="identifier">parser</span><span class="special">::</span><span class="identifier">employee</span><span class="special">;</span> 309<span class="special">}</span> 310</pre> 311<p> 312 In the parser definition, we use <a class="link" href="roman.html#__tutorial_spirit_define__"><code class="computeroutput"><span class="identifier">BOOST_SPIRIT_DEFINE</span></code></a> just like we 313 did in the <a class="link" href="employee.html" title="Employee - Parsing into structs">employee example</a>. 314 </p> 315<p> 316 While this is another header file, it is not meant to be included by the 317 client. Its purpose is to be included by an instantiations cpp file (see 318 below). We place this in an <code class="computeroutput"><span class="special">.</span><span class="identifier">hpp</span></code> file for flexibility, so we have the 319 freedom to instantiate the parser with different iterator types. 320 </p> 321<a name="tutorial_configuration"></a><h5> 322<a name="spirit_x3.tutorials.minimal.h6"></a> 323 <span class="phrase"><a name="spirit_x3.tutorials.minimal.configuration"></a></span><a class="link" href="minimal.html#spirit_x3.tutorials.minimal.configuration">Configuration</a> 324 </h5> 325<p> 326 Here, we declare some types for instatntaiting our X3 parser with. Rememeber 327 that Spirit parsers can work with any <a href="http://en.cppreference.com/w/cpp/named_req/ForwardIterator" target="_top"><code class="computeroutput"><span class="identifier">ForwardIterator</span></code></a>. We'll also need 328 to provide the initial context type. This is the context that X3 will use 329 to initiate a parse. For calling <code class="computeroutput"><span class="identifier">phrase_parse</span></code>, 330 you will need the <code class="computeroutput"><span class="identifier">phrase_parse_context</span></code> 331 like we do below, passing in the skipper type. 332 </p> 333<pre class="programlisting"><span class="keyword">using</span> <span class="identifier">iterator_type</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">const_iterator</span><span class="special">;</span> 334<span class="keyword">using</span> <span class="identifier">context_type</span> <span class="special">=</span> <span class="identifier">x3</span><span class="special">::</span><span class="identifier">phrase_parse_context</span><span class="special"><</span><span class="identifier">x3</span><span class="special">::</span><span class="identifier">ascii</span><span class="special">::</span><span class="identifier">space_type</span><span class="special">>::</span><span class="identifier">type</span><span class="special">;</span> 335</pre> 336<p> 337 For plain <code class="computeroutput"><span class="identifier">parse</span></code>, we simply 338 use <code class="computeroutput"><span class="identifier">x3</span><span class="special">::</span><span class="identifier">unused_type</span></code>. 339 </p> 340<h5> 341<a name="spirit_x3.tutorials.minimal.h7"></a> 342 <span class="phrase"><a name="spirit_x3.tutorials.minimal.parser_instantiation"></a></span><a class="link" href="minimal.html#spirit_x3.tutorials.minimal.parser_instantiation">Parser 343 Instantiation</a> 344 </h5> 345<p> 346 Now we instantiate our parser here, for our specific configuration: 347 </p> 348<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">client</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">parser</span> 349<span class="special">{</span> 350 <span class="identifier">BOOST_SPIRIT_INSTANTIATE</span><span class="special">(</span><span class="identifier">employee_type</span><span class="special">,</span> <span class="identifier">iterator_type</span><span class="special">,</span> <span class="identifier">context_type</span><span class="special">);</span> 351<span class="special">}}</span> 352</pre> 353<p> 354 For that, we use <code class="computeroutput"><span class="identifier">BOOST_SPIRIT_INSTANTIATE</span></code>, 355 passing in the parser type, the iterator type, and the context type. 356 </p> 357<h5> 358<a name="spirit_x3.tutorials.minimal.h8"></a> 359 <span class="phrase"><a name="spirit_x3.tutorials.minimal.boost_spirit_instantiate"></a></span><a class="link" href="minimal.html#spirit_x3.tutorials.minimal.boost_spirit_instantiate">BOOST_SPIRIT_INSTANTIATE</a> 360 </h5> 361<p> 362 Go back and review <a class="link" href="roman.html#__tutorial_spirit_define__"><code class="computeroutput"><span class="identifier">BOOST_SPIRIT_DEFINE</span></code></a> and <a class="link" href="minimal.html#__tutorial_spirit_declare__"><code class="computeroutput"><span class="identifier">BOOST_SPIRIT_DECLARE</span></code></a> to get a better 363 grasp of what's happening with <code class="computeroutput"><span class="identifier">BOOST_SPIRIT_INSTANTIATE</span></code> 364 and why it is needed. 365 </p> 366<p> 367 So what the heck is <code class="computeroutput"><span class="identifier">BOOST_SPIRIT_INSTANTIATE</span></code>? 368 What we want is to isolate the instantiation of our parsers (rules and all 369 that), into separate translation units (or cpp files, if you will). In this 370 example, we want to place our x3 employee stuff in <a href="../../../../../example/x3/minimal/employee.cpp" target="_top">employee.cpp</a>. 371 That way, we have separate compilation. Every time we update our employee 372 parser source code, we only have to build the <code class="computeroutput"><span class="identifier">employee</span><span class="special">.</span><span class="identifier">cpp</span></code> file. 373 All the rest will not be affected. By compiling only once in one translation 374 unit, we save on build times and avoid code bloat. There is no code duplication, 375 which can happen otherwise if you simply include the employee parser (<a href="../../../../../example/x3/minimal/employee.hpp" target="_top">employee.hpp</a>) everywhere. 376 </p> 377<p> 378 But how do you do that. Remember that our parser definitions are also placed 379 in its own header file for flexibility, so we have the freedom to instantiate 380 the parser with different iterator types. 381 </p> 382<p> 383 What we need to do is explicitly instantiate the <code class="computeroutput"><span class="identifier">parse_rule</span></code> 384 function we declared and defined via <code class="computeroutput"><span class="identifier">BOOST_SPIRIT_DECLARE</span></code> 385 and <code class="computeroutput"><span class="identifier">BOOST_SPIRIT_DEFINE</span></code> respectively, 386 using <code class="computeroutput"><span class="identifier">BOOST_SPIRIT_INSTANTIATE</span></code>. 387 For our particular example, <code class="computeroutput"><span class="identifier">BOOST_SPIRIT_INSTANTIATE</span></code> 388 expands to this code: 389 </p> 390<pre class="programlisting"><span class="keyword">template</span> <span class="keyword">bool</span> <span class="identifier">parse_rule</span><span class="special"><</span><span class="identifier">iterator_type</span><span class="special">,</span> <span class="identifier">context_type</span><span class="special">>(</span> 391 <span class="identifier">employee_type</span> <span class="identifier">rule_</span> 392 <span class="special">,</span> <span class="identifier">iterator_type</span><span class="special">&</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">iterator_type</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">last</span> 393 <span class="special">,</span> <span class="identifier">context_type</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">context</span><span class="special">,</span> <span class="identifier">employee_type</span><span class="special">::</span><span class="identifier">attribute_type</span><span class="special">&</span> <span class="identifier">attr</span><span class="special">);</span> 394</pre> 395<h5> 396<a name="spirit_x3.tutorials.minimal.h9"></a> 397 <span class="phrase"><a name="spirit_x3.tutorials.minimal.main_program"></a></span><a class="link" href="minimal.html#spirit_x3.tutorials.minimal.main_program">Main 398 Program</a> 399 </h5> 400<p> 401 Finally, we have our main program. The code is the same as single cpp file 402 <a class="link" href="employee.html" title="Employee - Parsing into structs">employee example</a>, but 403 here, we simply include three header files: 404 </p> 405<pre class="programlisting"><span class="preprocessor">#include</span> <span class="string">"ast.hpp"</span> 406<span class="preprocessor">#include</span> <span class="string">"ast_adapted.hpp"</span> 407<span class="preprocessor">#include</span> <span class="string">"employee.hpp"</span> 408</pre> 409<div class="orderedlist"><ol class="orderedlist" type="1"> 410<li class="listitem"> 411 <code class="computeroutput"><span class="identifier">ast</span><span class="special">.</span><span class="identifier">hpp</span></code> for the AST declaration 412 </li> 413<li class="listitem"> 414 <code class="computeroutput"><span class="identifier">ast_adapted</span><span class="special">.</span><span class="identifier">hpp</span></code> if you need to traverse the AST 415 using fusion 416 </li> 417<li class="listitem"> 418 <code class="computeroutput"><span class="identifier">employee</span><span class="special">.</span><span class="identifier">hpp</span></code> the main parser API 419 </li> 420</ol></div> 421</div> 422<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> 423<td align="left"></td> 424<td align="right"><div class="copyright-footer">Copyright © 2001-2018 Joel de Guzman, 425 Hartmut Kaiser<p> 426 Distributed under the Boost Software License, Version 1.0. (See accompanying 427 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>) 428 </p> 429</div></td> 430</tr></table> 431<hr> 432<div class="spirit-nav"> 433<a accesskey="p" href="employee.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="annotation.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> 434</div> 435</body> 436</html> 437