• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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">&lt;&lt;;</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">&lt;</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">&gt;</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">&amp;</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">Iterator</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">last</span>
228  <span class="special">,</span> <span class="identifier">Context</span> <span class="keyword">const</span><span class="special">&amp;</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">&amp;</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">&lt;</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">&gt;;</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">&lt;</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">&gt;</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">&gt;&gt;</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">&gt;&gt;</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">&gt;&gt;</span> <span class="char">'{'</span>
296        <span class="special">&gt;&gt;</span>  <span class="identifier">int_</span> <span class="special">&gt;&gt;</span> <span class="char">','</span>
297        <span class="special">&gt;&gt;</span>  <span class="identifier">quoted_string</span> <span class="special">&gt;&gt;</span> <span class="char">','</span>
298        <span class="special">&gt;&gt;</span>  <span class="identifier">quoted_string</span> <span class="special">&gt;&gt;</span> <span class="char">','</span>
299        <span class="special">&gt;&gt;</span>  <span class="identifier">double_</span>
300        <span class="special">&gt;&gt;</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">&lt;</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">&gt;::</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">&lt;</span><span class="identifier">iterator_type</span><span class="special">,</span> <span class="identifier">context_type</span><span class="special">&gt;(</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">&amp;</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">iterator_type</span> <span class="keyword">const</span><span class="special">&amp;</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">&amp;</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">&amp;</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