• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
2<html>
3<head>
4<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
5<title>Getting started with Boost.Metaparse</title>
6<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css">
7<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
8<link rel="home" href="../index.html" title="The Boost C++ Libraries BoostBook Documentation Subset">
9<link rel="up" href="../metaparse.html" title="Chapter 24. Boost.Metaparse">
10<link rel="prev" href="preface.html" title="Preface">
11<link rel="next" href="user_manual.html" title="User manual">
12</head>
13<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
14<table cellpadding="2" width="100%"><tr>
15<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td>
16<td align="center"><a href="../../../index.html">Home</a></td>
17<td align="center"><a href="../../../libs/libraries.htm">Libraries</a></td>
18<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
19<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
20<td align="center"><a href="../../../more/index.htm">More</a></td>
21</tr></table>
22<hr>
23<div class="spirit-nav">
24<a accesskey="p" href="preface.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../metaparse.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="user_manual.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
25</div>
26<div class="section">
27<div class="titlepage"><div><div><h2 class="title" style="clear: both">
28<a name="metaparse.getting_started_with_boost_metap"></a><a name="getting_started"></a><a class="link" href="getting_started_with_boost_metap.html" title="Getting started with Boost.Metaparse">Getting
29    started with Boost.Metaparse</a>
30</h2></div></div></div>
31<div class="toc"><dl class="toc">
32<dt><span class="section"><a href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.1_introduction">1.
33      Introduction</a></span></dt>
34<dt><span class="section"><a href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.2_the_text_to_parse">2.
35      The text to parse</a></span></dt>
36<dt><span class="section"><a href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.3_creating_a_simple_parser">3.
37      Creating a simple parser</a></span></dt>
38<dt><span class="section"><a href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.4_parsing_simple_expressions">4.
39      Parsing simple expressions</a></span></dt>
40<dt><span class="section"><a href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.5_parsing_longer_expressions">5.
41      Parsing longer expressions</a></span></dt>
42<dt><span class="section"><a href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.6_adding_support_for_other_opera">6.
43      Adding support for other operators</a></span></dt>
44<dt><span class="section"><a href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.7_dealing_with_precedence">7.
45      Dealing with precedence</a></span></dt>
46<dt><span class="section"><a href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.8_dealing_with_associativity">8.
47      Dealing with associativity</a></span></dt>
48<dt><span class="section"><a href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.9_dealing_with_unary_operators">9.
49      Dealing with unary operators</a></span></dt>
50<dt><span class="section"><a href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.10_dealing_with_parens">10.
51      Dealing with parens</a></span></dt>
52<dt><span class="section"><a href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.11_dealing_with_invalid_input">11.
53      Dealing with invalid input</a></span></dt>
54<dt><span class="section"><a href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.12_summary">12.
55      Summary</a></span></dt>
56<dt><span class="section"><a href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.copy_paste_friendly_code_example">Copy-paste
57      friendly code examples</a></span></dt>
58<dt><span class="section"><a href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.definitions_before_each_section">Definitions
59      before each section</a></span></dt>
60</dl></div>
61<div class="section">
62<div class="titlepage"><div><div><h3 class="title">
63<a name="metaparse.getting_started_with_boost_metap.1_introduction"></a><a class="link" href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.1_introduction" title="1. Introduction">1.
64      Introduction</a>
65</h3></div></div></div>
66<div class="toc"><dl class="toc">
67<dt><span class="section"><a href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.1_introduction.1_1_testing_environment">1.1.
68        Testing environment</a></span></dt>
69<dt><span class="section"><a href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.1_introduction.1_2_using_a_regular_testing_envi">1.2.
70        Using a "regular" testing environment</a></span></dt>
71</dl></div>
72<p>
73        This tutorial shows you how to build a parser for a small calculator language
74        from the ground up. The goal is not to have a complete calculator, but to
75        show you the most common situations one can face while building a parser
76        using Metaparse. This tutorial assumes, that you have some template metaprogramming
77        experience.
78      </p>
79<div class="section">
80<div class="titlepage"><div><div><h4 class="title">
81<a name="metaparse.getting_started_with_boost_metap.1_introduction.1_1_testing_environment"></a><a class="link" href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.1_introduction.1_1_testing_environment" title="1.1. Testing environment">1.1.
82        Testing environment</a>
83</h4></div></div></div>
84<p>
85          While you are using Metaparse, you will be writing parsers turning an input
86          text into a type. These types can later be processed by further template
87          metaprograms. While you are working on your parsers, you'll probably want
88          to look at the result of parsing a test input. This tutorial assumes that
89          you can use <a href="http://metashell.org" target="_top">Metashell</a>. Since
90          the <a href="http://metashell.org/about/demo" target="_top">online demo</a> makes
91          the Boost headers available, you can use that in the tutorial as well.
92        </p>
93<p>
94          If you install Metashell on your computer, make sure that you have the
95          Boost libraries and the <code class="computeroutput"><span class="identifier">getting_started</span></code>
96          example of Metaparse on the include path. For example, you can start Metashell
97          with the following arguments:
98        </p>
99<pre class="programlisting"><span class="error">$</span> <span class="identifier">metashell</span> <span class="special">-</span><span class="identifier">I</span><span class="error">$</span><span class="identifier">BOOST_ROOT</span> <span class="special">-</span><span class="identifier">I</span><span class="error">$</span><span class="identifier">BOOST_ROOT</span><span class="special">/</span><span class="identifier">libs</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">example</span><span class="special">/</span><span class="identifier">getting_started</span>
100</pre>
101<p>
102          <code class="computeroutput"><span class="error">$</span><span class="identifier">BOOST_ROOT</span></code>
103          refers to the <span class="emphasis"><em>boost root directory</em></span> (where you have
104          checked out the Boost source code).
105        </p>
106<p>
107          This tutorial is long and therefore you might want to make shorter or longer
108          breaks while reading it. To make it easy for you to stop at a certain point
109          and continue later (or to start in the middle if you are already familiar
110          with the basics) Metaparse has a <code class="computeroutput"><span class="identifier">getting_started</span></code>
111          directory in the <code class="computeroutput"><span class="identifier">example</span></code>s.
112          This contains the definitions for each section of this tutorial.
113        </p>
114<p>
115          If you're about to start (or continue) this guide from section 5.2.1, you
116          can include <code class="computeroutput"><span class="number">5</span><span class="identifier">_2_1</span><span class="special">.</span><span class="identifier">hpp</span></code>.
117          This will define everything you need to start with that section.
118        </p>
119<div class="note"><table border="0" summary="Note">
120<tr>
121<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
122<th align="left">Note</th>
123</tr>
124<tr><td align="left" valign="top"><p>
125            You have access to these headers in the online Metashell demo as well.
126            For example you can include the <code class="computeroutput"><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">getting_started</span><span class="special">/</span><span class="number">5</span><span class="identifier">_2_1</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span></code> header to start from section 5.2.1.
127          </p></td></tr>
128</table></div>
129</div>
130<div class="section">
131<div class="titlepage"><div><div><h4 class="title">
132<a name="metaparse.getting_started_with_boost_metap.1_introduction.1_2_using_a_regular_testing_envi"></a><a class="link" href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.1_introduction.1_2_using_a_regular_testing_envi" title='1.2. Using a "regular" testing environment'>1.2.
133        Using a "regular" testing environment</a>
134</h4></div></div></div>
135<div class="toc"><dl class="toc">
136<dt><span class="section"><a href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.1_introduction.1_2_using_a_regular_testing_envi.1_2_1_enforcing_an_error_message">1.2.1.
137          Enforcing an error message or a warning containing the result of the metafunction
138          call</a></span></dt>
139<dt><span class="section"><a href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.1_introduction.1_2_using_a_regular_testing_envi.1_2_2_displaying_the_result_of_t">1.2.2.
140          Displaying the result of the metafunction call at runtime</a></span></dt>
141</dl></div>
142<p>
143          If you have no access to Metashell or you prefer using your regular C++
144          development environment while processing this tutorial, this is also possible.
145        </p>
146<p>
147          The tutorial (and usually experimenting with Metaparse) requires that you
148          evaluate different template metaprogramming expressions and check their
149          result, which is a type. Thus, to try the examples of this tutorial you
150          need a way to be able to display the result of evaluating a template metaprogram.
151          This section shows you two options.
152        </p>
153<div class="section">
154<div class="titlepage"><div><div><h5 class="title">
155<a name="metaparse.getting_started_with_boost_metap.1_introduction.1_2_using_a_regular_testing_envi.1_2_1_enforcing_an_error_message"></a><a class="link" href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.1_introduction.1_2_using_a_regular_testing_envi.1_2_1_enforcing_an_error_message" title="1.2.1. Enforcing an error message or a warning containing the result of the metafunction call">1.2.1.
156          Enforcing an error message or a warning containing the result of the metafunction
157          call</a>
158</h5></div></div></div>
159<p>
160            You can either use <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">print</span></code>
161            or <code class="computeroutput"><span class="identifier">mpllibs</span><span class="special">::</span><span class="identifier">metamonad</span><span class="special">::</span><span class="identifier">fail_with_type</span></code> to enforce a warning
162            or an error message containing the result of a metaprogram evaluation.
163            For example to see what <a class="link" href="reference.html#BOOST_METAPARSE_STRING"><code class="computeroutput"><span class="identifier">BOOST_METAPARSE_STRING</span></code></a><code class="computeroutput"><span class="special">(</span><span class="string">"11 + 2"</span><span class="special">)</span></code> refers to, you can create a <code class="computeroutput"><span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span></code> with the following content:
164          </p>
165<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">string</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
166<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">print</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
167
168<span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">print</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"11 + 2"</span><span class="special">)&gt;</span> <span class="identifier">x</span><span class="special">;</span>
169</pre>
170<p>
171            If you try to compile it, the compiler will display warnings containing
172            the type the expression <a class="link" href="reference.html#BOOST_METAPARSE_STRING"><code class="computeroutput"><span class="identifier">BOOST_METAPARSE_STRING</span></code></a><code class="computeroutput"><span class="special">(</span><span class="string">"11 + 2"</span><span class="special">)</span></code> constructs. To use this technique for
173            this tutorial, you need to add all the includes and definitions the tutorial
174            suggests typing in the shell to your <code class="computeroutput"><span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span></code>
175            file. When the shell suggests to try to call some metafunction (or you'd
176            like to try something out), you need to replace the template argument
177            of <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">print</span></code> with the expression in question
178            and recompile the code.
179          </p>
180</div>
181<div class="section">
182<div class="titlepage"><div><div><h5 class="title">
183<a name="metaparse.getting_started_with_boost_metap.1_introduction.1_2_using_a_regular_testing_envi.1_2_2_displaying_the_result_of_t"></a><a class="link" href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.1_introduction.1_2_using_a_regular_testing_envi.1_2_2_displaying_the_result_of_t" title="1.2.2. Displaying the result of the metafunction call at runtime">1.2.2.
184          Displaying the result of the metafunction call at runtime</a>
185</h5></div></div></div>
186<p>
187            You can also display the result of metaprograms at runtime. You can use
188            the <a href="http://boost.org/libs/type_index" target="_top">Boost.TypeIndex</a>
189            library to do this. For example to see what <a class="link" href="reference.html#BOOST_METAPARSE_STRING"><code class="computeroutput"><span class="identifier">BOOST_METAPARSE_STRING</span></code></a><code class="computeroutput"><span class="special">(</span><span class="string">"11 + 2"</span><span class="special">)</span></code> refers to, you can create a <code class="computeroutput"><span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span></code> with the following content:
190          </p>
191<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">string</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
192<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">type_index</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
193<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">iostream</span><span class="special">&gt;</span>
194
195<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
196<span class="special">{</span>
197  <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span>
198    <span class="special">&lt;&lt;</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">typeindex</span><span class="special">::</span><span class="identifier">type_id_with_cvr</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"11 + 2"</span><span class="special">)&gt;()</span>
199    <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
200<span class="special">}</span>
201</pre>
202<p>
203            If you compile and run this code, it will display the type on the standard
204            output.
205          </p>
206</div>
207</div>
208</div>
209<div class="section">
210<div class="titlepage"><div><div><h3 class="title">
211<a name="metaparse.getting_started_with_boost_metap.2_the_text_to_parse"></a><a class="link" href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.2_the_text_to_parse" title="2. The text to parse">2.
212      The text to parse</a>
213</h3></div></div></div>
214<p>
215        With Metaparse you can create template metaprograms parsing an input text.
216        To pass the input text to the metaprograms, you need to represent them as
217        types. For example let's represent the text <code class="computeroutput"><span class="string">"Hello
218        world"</span></code> as a type. The most straightforward way of doing
219        it would be creating a variadic template class taking the characters of the
220        text as template arguments:
221      </p>
222<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">char</span><span class="special">...</span> <span class="identifier">Cs</span><span class="special">&gt;</span>
223<span class="keyword">struct</span> <span class="identifier">string</span><span class="special">;</span>
224</pre>
225<p>
226        The text <code class="computeroutput"><span class="string">"11 + 2"</span></code> can
227        be represented the following way:
228      </p>
229<pre class="programlisting"><span class="identifier">string</span><span class="special">&lt;</span><span class="char">'1'</span><span class="special">,</span> <span class="char">'1'</span><span class="special">,</span> <span class="char">' '</span><span class="special">,</span> <span class="char">'+'</span><span class="special">,</span> <span class="char">' '</span><span class="special">,</span> <span class="char">'2'</span><span class="special">&gt;</span>
230</pre>
231<p>
232        Metaparse provides this type for you. Run the following command in Metashell:
233      </p>
234<pre class="programlisting"><span class="special">&gt;</span> <span class="special">#</span><span class="identifier">include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">string</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
235</pre>
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="../../../doc/src/images/note.png"></td>
239<th align="left">Note</th>
240</tr>
241<tr><td align="left" valign="top"><p>
242          Note that the <code class="computeroutput"><span class="special">&gt;</span></code> character
243          at the beginning of the above code example is the prompt of Metashell.
244          It is added to the code examples as a hint to what you should run in Metashell
245          (or add to your test <code class="computeroutput"><span class="identifier">cpp</span></code>
246          file if you are using a regular development environment).
247        </p></td></tr>
248</table></div>
249<div class="note"><table border="0" summary="Note">
250<tr>
251<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
252<th align="left">Note</th>
253</tr>
254<tr><td align="left" valign="top"><p>
255          Note that in the <a href="http://abel.web.elte.hu/shell/metashell.html" target="_top">online-demo</a>
256          of Metashell you can paste code into the shell by right-clicking on the
257          shell somewhere and choosing <span class="emphasis"><em>Paste from browser</em></span> in
258          the context menu.
259        </p></td></tr>
260</table></div>
261<p>
262        This will make this type available for you. Now you can try running the following
263        command:
264      </p>
265<pre class="programlisting"><span class="special">&gt;</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">metaparse</span><span class="special">::</span><span class="identifier">string</span><span class="special">&lt;</span><span class="char">'1'</span><span class="special">,</span> <span class="char">'1'</span><span class="special">,</span> <span class="char">' '</span><span class="special">,</span> <span class="char">'+'</span><span class="special">,</span> <span class="char">' '</span><span class="special">,</span> <span class="char">'2'</span><span class="special">&gt;</span>
266</pre>
267<p>
268        The shell will echo (almost) the same type back to you. The only difference
269        is that it is in a sub-namespace indicating the version of Metaparse being
270        used.
271      </p>
272<p>
273        The nice thing about this representation is that metaprograms can easily
274        access the individual characters of the text. The not so nice thing about
275        this representation is that if you want to write the text <code class="computeroutput"><span class="string">"Hello
276        world"</span></code> in your source code, you have to type a lot.
277      </p>
278<p>
279        Metaparse provides a macro that can turn a string literal into an instance
280        of <a class="link" href="reference.html#string"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">metaparse</span><span class="special">::</span><span class="identifier">string</span></code></a>.
281        This is the <a class="link" href="reference.html#BOOST_METAPARSE_STRING"><code class="computeroutput"><span class="identifier">BOOST_METAPARSE_STRING</span></code></a>
282        macro. You get it by including <code class="computeroutput"><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">string</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span></code>.
283        Let's try it by running the following command in Metashell:
284      </p>
285<pre class="programlisting"><span class="special">&gt;</span> <span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"11 + 2"</span><span class="special">)</span>
286</pre>
287<p>
288        You will get the same result as you got by instantiating <a class="link" href="reference.html#string"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">metaparse</span><span class="special">::</span><span class="identifier">string</span></code></a> yourself.
289      </p>
290</div>
291<div class="section">
292<div class="titlepage"><div><div><h3 class="title">
293<a name="metaparse.getting_started_with_boost_metap.3_creating_a_simple_parser"></a><a class="link" href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.3_creating_a_simple_parser" title="3. Creating a simple parser">3.
294      Creating a simple parser</a>
295</h3></div></div></div>
296<div class="toc"><dl class="toc">
297<dt><span class="section"><a href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.3_creating_a_simple_parser.3_1_dealing_with_invalid_input">3.1.
298        Dealing with invalid input</a></span></dt>
299<dt><span class="section"><a href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.3_creating_a_simple_parser.3_2_dealing_with_input_containin">3.2.
300        Dealing with input containing more than what is needed</a></span></dt>
301<dt><span class="section"><a href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.3_creating_a_simple_parser.3_3_accepting_optional_whitespac">3.3.
302        Accepting optional whitespaces at the end of the input</a></span></dt>
303</dl></div>
304<div class="note"><table border="0" summary="Note">
305<tr>
306<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
307<th align="left">Note</th>
308</tr>
309<tr><td align="left" valign="top"><p>
310          Note that you can find everything that has been included and defined so
311          far <a class="link" href="getting_started_with_boost_metap.html#before_3">here</a>.
312        </p></td></tr>
313</table></div>
314<p>
315        Let's try creating a parser. We will start with creating a parser for something
316        simple: we will be parsing integer numbers, such as the text <code class="computeroutput"><span class="string">"13"</span></code>. You can think of this first
317        parsing exercise as a <span class="emphasis"><em>template metaprogramming string-to-int conversion</em></span>
318        because we expect to get the value <code class="computeroutput"><span class="number">13</span></code>
319        as the result of parsing.
320      </p>
321<div class="note"><table border="0" summary="Note">
322<tr>
323<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
324<th align="left">Note</th>
325</tr>
326<tr><td align="left" valign="top"><p>
327          You know the difference between <code class="computeroutput"><span class="string">"13"</span></code>
328          and <code class="computeroutput"><span class="number">13</span></code> in C++. One of them
329          is a character array, the other one is an integral value. But what is the
330          difference between them in template metaprogramming? They are represented
331          by different types. For example <code class="computeroutput"><span class="string">"13"</span></code>
332          is represented by <a class="link" href="reference.html#string"><code class="computeroutput"><span class="identifier">string</span></code></a><code class="computeroutput"><span class="special">&lt;</span><span class="char">'1'</span><span class="special">,</span>
333          <span class="char">'3'</span><span class="special">&gt;</span></code>
334          while <code class="computeroutput"><span class="number">13</span></code> is represented by
335          <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">integral_constant</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">13</span><span class="special">&gt;</span></code>.
336        </p></td></tr>
337</table></div>
338<p>
339        To build a parser, we need to specify the grammar to use. Metaparse provides
340        building blocks (called parsers) we can use to do this and one of them is
341        the <a class="link" href="reference.html#int_"><code class="computeroutput"><span class="identifier">int_</span></code></a>
342        parser which does exactly what we need: it parses integers. To make it available,
343        we need to include it:
344      </p>
345<pre class="programlisting"><span class="special">&gt;</span> <span class="special">#</span><span class="identifier">include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">int_</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
346</pre>
347<p>
348        Our grammar is simple: <a class="link" href="reference.html#int_"><code class="computeroutput"><span class="identifier">int_</span></code></a>.
349        (Don't worry, we'll parse more complicated languages later).
350      </p>
351<p>
352        A parser is a <a class="link" href="reference.html#metafunction_class">template metafunction class</a>.
353        It can be used directly, but its interface is designed for completeness and
354        not for ease of use. Metaparse provides the <a class="link" href="reference.html#build_parser"><code class="computeroutput"><span class="identifier">build_parser</span></code></a> <a class="link" href="reference.html#metafunction">metafunction</a>
355        that adds a wrapper to parsers with a simple interface.
356      </p>
357<div class="note"><table border="0" summary="Note">
358<tr>
359<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
360<th align="left">Note</th>
361</tr>
362<tr><td align="left" valign="top"><p>
363          In this tutorial, we will always be wrapping our parsers with this. We
364          will call these wrapped parsers parsers as well. If you are interested
365          in it, you can learn about the complete interface of parsers <a class="link" href="reference.html#parser">here</a>.
366        </p></td></tr>
367</table></div>
368<p>
369        Let's create a parser using <a class="link" href="reference.html#int_"><code class="computeroutput"><span class="identifier">int_</span></code></a>
370        and <a class="link" href="reference.html#build_parser"><code class="computeroutput"><span class="identifier">build_parser</span></code></a>:
371      </p>
372<pre class="programlisting"><span class="special">&gt;</span> <span class="special">#</span><span class="identifier">include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">build_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
373<span class="special">&gt;</span> <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">metaparse</span><span class="special">;</span>
374<span class="special">&gt;</span> <span class="keyword">using</span> <span class="identifier">exp_parser1</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
375</pre>
376<p>
377        <a class="link" href="getting_started_with_boost_metap.html#getting_started_0">copy-paste friendly version</a>
378      </p>
379<p>
380        First we need to include <code class="computeroutput"><span class="identifier">build_parser</span><span class="special">.</span><span class="identifier">hpp</span></code> to
381        make <a class="link" href="reference.html#build_parser"><code class="computeroutput"><span class="identifier">build_parser</span></code></a>
382        available. Then we make our lives easier by running <code class="computeroutput"><span class="keyword">using</span>
383        <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">metaparse</span><span class="special">;</span></code>. The third command defines the parser: we
384        need to instantiate the <a class="link" href="reference.html#build_parser"><code class="computeroutput"><span class="identifier">build_parser</span></code></a>
385        template class with our parser (<a class="link" href="reference.html#int_"><code class="computeroutput"><span class="identifier">int_</span></code></a>
386        in this case) as argument.
387      </p>
388<p>
389        Now that we have a parser, let's parse some text with it (if you haven't
390        done it yet, include <code class="computeroutput"><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">string</span><span class="special">.</span><span class="identifier">hpp</span></code>):
391      </p>
392<pre class="programlisting"><span class="special">&gt;</span> <span class="identifier">exp_parser1</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"13"</span><span class="special">)&gt;::</span><span class="identifier">type</span>
393<span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">13</span><span class="special">&gt;</span>
394</pre>
395<p>
396        <code class="computeroutput"><span class="identifier">exp_parser1</span></code> is a <a class="link" href="reference.html#metafunction_class">template
397        metafunction class</a> taking the input text as it's argument and it returns
398        the integral representation of the number in the string. Try it with different
399        numbers and see how it converts them.
400      </p>
401<div class="section">
402<div class="titlepage"><div><div><h4 class="title">
403<a name="metaparse.getting_started_with_boost_metap.3_creating_a_simple_parser.3_1_dealing_with_invalid_input"></a><a class="link" href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.3_creating_a_simple_parser.3_1_dealing_with_invalid_input" title="3.1. Dealing with invalid input">3.1.
404        Dealing with invalid input</a>
405</h4></div></div></div>
406<div class="note"><table border="0" summary="Note">
407<tr>
408<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
409<th align="left">Note</th>
410</tr>
411<tr><td align="left" valign="top"><p>
412            Note that you can find everything that has been included and defined
413            so far <a class="link" href="getting_started_with_boost_metap.html#before_3_1">here</a>.
414          </p></td></tr>
415</table></div>
416<p>
417          Have you tried parsing an invalid input? Something that is not a number,
418          such as:
419        </p>
420<pre class="programlisting"><span class="special">&gt;</span> <span class="identifier">exp_parser1</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"thirteen"</span><span class="special">)&gt;::</span><span class="identifier">type</span>
421<span class="special">&lt;&lt;</span> <span class="identifier">compilation</span> <span class="identifier">error</span> <span class="special">&gt;&gt;</span>
422</pre>
423<p>
424          Well, <code class="computeroutput"><span class="string">"thirteen"</span></code>
425          <span class="emphasis"><em>is</em></span> a number, but our parser does not speak English,
426          so it is considered as invalid input. As a result of this, compilation
427          fails and you get a compilation error from Metashell.
428        </p>
429<p>
430          In the <a href="../#dealing-with-invalid-input-1" target="_top">Dealing with invalid
431          input</a> section we will go into further details on error handling.
432        </p>
433</div>
434<div class="section">
435<div class="titlepage"><div><div><h4 class="title">
436<a name="metaparse.getting_started_with_boost_metap.3_creating_a_simple_parser.3_2_dealing_with_input_containin"></a><a class="link" href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.3_creating_a_simple_parser.3_2_dealing_with_input_containin" title="3.2. Dealing with input containing more than what is needed">3.2.
437        Dealing with input containing more than what is needed</a>
438</h4></div></div></div>
439<div class="note"><table border="0" summary="Note">
440<tr>
441<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
442<th align="left">Note</th>
443</tr>
444<tr><td align="left" valign="top"><p>
445            Note that you can find everything that has been included and defined
446            so far <a class="link" href="getting_started_with_boost_metap.html#before_3_2">here</a>.
447          </p></td></tr>
448</table></div>
449<p>
450          Let's try to give the parser two numbers instead of one:
451        </p>
452<pre class="programlisting"><span class="special">&gt;</span> <span class="identifier">exp_parser1</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"11 13"</span><span class="special">)&gt;::</span><span class="identifier">type</span>
453<span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">11</span><span class="special">&gt;</span>
454</pre>
455<p>
456          You might be surprised by this: the parser did not return an error. It
457          parsed the first number, <code class="computeroutput"><span class="number">11</span></code>
458          and ignored <code class="computeroutput"><span class="number">13</span></code>. The way <a class="link" href="reference.html#int_"><code class="computeroutput"><span class="identifier">int_</span></code></a>
459          works is that it parses the number at the beginning of the input text and
460          ignores the rest of the input.
461        </p>
462<p>
463          So <code class="computeroutput"><span class="identifier">exp_parser1</span></code> has a bug:
464          our little language consists of <span class="emphasis"><em>one</em></span> number, not a
465          <span class="emphasis"><em>list of numbers</em></span>. Let's fix our parser to treat more
466          than one numbers as an invalid input:
467        </p>
468<pre class="programlisting"><span class="special">&gt;</span> <span class="special">#</span><span class="identifier">include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">entire_input</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
469</pre>
470<p>
471          This gives us the <a class="link" href="reference.html#entire_input"><code class="computeroutput"><span class="identifier">entire_input</span></code></a>
472          template class. We can wrap <a class="link" href="reference.html#int_"><code class="computeroutput"><span class="identifier">int_</span></code></a>
473          with <a class="link" href="reference.html#entire_input"><code class="computeroutput"><span class="identifier">entire_input</span></code></a>
474          indicating that the number we parse with <a class="link" href="reference.html#int_"><code class="computeroutput"><span class="identifier">int_</span></code></a> should be the entire input.
475          Anything that comes after that is an error. So our parser is <a class="link" href="reference.html#entire_input"><code class="computeroutput"><span class="identifier">entire_input</span></code></a><code class="computeroutput"><span class="special">&lt;</span></code><a class="link" href="reference.html#int_"><code class="computeroutput"><span class="identifier">int_</span></code></a><code class="computeroutput"><span class="special">&gt;</span></code> now. Let's wrap it with <a class="link" href="reference.html#build_parser"><code class="computeroutput"><span class="identifier">build_parser</span></code></a>:
476        </p>
477<pre class="programlisting"><span class="special">&gt;</span> <span class="keyword">using</span> <span class="identifier">exp_parser2</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;;</span>
478</pre>
479<p>
480          Let's try this new parser out:
481        </p>
482<pre class="programlisting"><span class="special">&gt;</span> <span class="identifier">exp_parser2</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"13"</span><span class="special">)&gt;::</span><span class="identifier">type</span>
483<span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">13</span><span class="special">&gt;</span>
484</pre>
485<p>
486          It can still parse numbers. Let's try to give it two numbers:
487        </p>
488<pre class="programlisting"><span class="special">&gt;</span> <span class="identifier">exp_parser2</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"11 13"</span><span class="special">)&gt;::</span><span class="identifier">type</span>
489<span class="special">&lt;&lt;</span> <span class="identifier">compilation</span> <span class="identifier">error</span> <span class="special">&gt;&gt;</span>
490</pre>
491<p>
492          This generates a compilation error, since the parser failed.
493        </p>
494</div>
495<div class="section">
496<div class="titlepage"><div><div><h4 class="title">
497<a name="metaparse.getting_started_with_boost_metap.3_creating_a_simple_parser.3_3_accepting_optional_whitespac"></a><a class="link" href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.3_creating_a_simple_parser.3_3_accepting_optional_whitespac" title="3.3. Accepting optional whitespaces at the end of the input">3.3.
498        Accepting optional whitespaces at the end of the input</a>
499</h4></div></div></div>
500<div class="note"><table border="0" summary="Note">
501<tr>
502<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
503<th align="left">Note</th>
504</tr>
505<tr><td align="left" valign="top"><p>
506            Note that you can find everything that has been included and defined
507            so far <a class="link" href="getting_started_with_boost_metap.html#before_3_3">here</a>.
508          </p></td></tr>
509</table></div>
510<p>
511          Our parser became a bit too restrictive now. It doesn't allow <span class="emphasis"><em>anything</em></span>
512          after the number, not even whitespaces:
513        </p>
514<pre class="programlisting"><span class="special">&gt;</span> <span class="identifier">exp_parser2</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"11 "</span><span class="special">)&gt;::</span><span class="identifier">type</span>
515<span class="special">&lt;&lt;</span> <span class="identifier">compilation</span> <span class="identifier">error</span> <span class="special">&gt;&gt;</span>
516</pre>
517<p>
518          Let's allow whitespaces after the number:
519        </p>
520<pre class="programlisting"><span class="special">&gt;</span> <span class="special">#</span><span class="identifier">include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">token</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
521</pre>
522<p>
523          This makes the <a class="link" href="reference.html#token"><code class="computeroutput"><span class="identifier">token</span></code></a>
524          template class available. It takes a parser as its argument and allows
525          optional whitespaces after that. Let's create a third parser allowing whitespaces
526          after the number:
527        </p>
528<pre class="programlisting"><span class="special">&gt;</span> <span class="keyword">using</span> <span class="identifier">exp_parser3</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;&gt;;</span>
529</pre>
530<p>
531          We expect <a class="link" href="reference.html#token"><code class="computeroutput"><span class="identifier">token</span></code></a><code class="computeroutput"><span class="special">&lt;</span></code><a class="link" href="reference.html#int_"><code class="computeroutput"><span class="identifier">int_</span></code></a><code class="computeroutput"><span class="special">&gt;</span></code> to be the entire input in this case.
532          We allow optional whitespaces after <a class="link" href="reference.html#int_"><code class="computeroutput"><span class="identifier">int_</span></code></a> but nothing else:
533        </p>
534<pre class="programlisting"><span class="special">&gt;</span> <span class="identifier">exp_parser3</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"11 "</span><span class="special">)&gt;::</span><span class="identifier">type</span>
535<span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">11</span><span class="special">&gt;</span>
536</pre>
537</div>
538</div>
539<div class="section">
540<div class="titlepage"><div><div><h3 class="title">
541<a name="metaparse.getting_started_with_boost_metap.4_parsing_simple_expressions"></a><a class="link" href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.4_parsing_simple_expressions" title="4. Parsing simple expressions">4.
542      Parsing simple expressions</a>
543</h3></div></div></div>
544<div class="toc"><dl class="toc">
545<dt><span class="section"><a href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.4_parsing_simple_expressions.4_1_tokenizer">4.1.
546        Tokenizer</a></span></dt>
547<dt><span class="section"><a href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.4_parsing_simple_expressions.4_2_evaluating_the_expression">4.2.
548        Evaluating the expression</a></span></dt>
549</dl></div>
550<div class="note"><table border="0" summary="Note">
551<tr>
552<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
553<th align="left">Note</th>
554</tr>
555<tr><td align="left" valign="top"><p>
556          Note that you can find everything that has been included and defined so
557          far <a class="link" href="getting_started_with_boost_metap.html#before_4">here</a>.
558        </p></td></tr>
559</table></div>
560<p>
561        We can parse numbers. Let's try parsing something more complicated, such
562        as <code class="computeroutput"><span class="string">"11 + 2"</span></code>. This is
563        a number followed by a <code class="computeroutput"><span class="special">+</span></code> symbol
564        followed by another number. <a class="link" href="reference.html#int_"><code class="computeroutput"><span class="identifier">int_</span></code></a>
565        (or <a class="link" href="reference.html#token"><code class="computeroutput"><span class="identifier">token</span></code></a><code class="computeroutput"><span class="special">&lt;</span></code><a class="link" href="reference.html#int_"><code class="computeroutput"><span class="identifier">int_</span></code></a><code class="computeroutput"><span class="special">&gt;</span></code>) implements the parser for one number.
566      </p>
567<p>
568        First, let's write a parser for the <code class="computeroutput"><span class="special">+</span></code>
569        symbol. We can use the following:
570      </p>
571<pre class="programlisting"><span class="special">&gt;</span> <span class="special">#</span><span class="identifier">include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">lit_c</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
572</pre>
573<p>
574        This gives us <a class="link" href="reference.html#lit_c"><code class="computeroutput"><span class="identifier">lit_c</span></code></a>
575        which we can use to parse specific characters, such as <code class="computeroutput"><span class="special">+</span></code>.
576        The grammar parsing the <code class="computeroutput"><span class="special">+</span></code> character
577        can be represented by <a class="link" href="reference.html#lit_c"><code class="computeroutput"><span class="identifier">lit_c</span></code></a><code class="computeroutput"><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;</span></code>.
578        To allow optional whitespaces after it, we should use <a class="link" href="reference.html#token"><code class="computeroutput"><span class="identifier">token</span></code></a><code class="computeroutput"><span class="special">&lt;</span></code><a class="link" href="reference.html#lit_c"><code class="computeroutput"><span class="identifier">lit_c</span></code></a><code class="computeroutput"><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;</span></code>.
579      </p>
580<p>
581        So to parse <code class="computeroutput"><span class="string">"11 + 2"</span></code>
582        we need the following sequence of parsers:
583      </p>
584<pre class="programlisting"><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;</span>    <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;</span>    <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;</span>
585</pre>
586<p>
587        Metaparse provides <a class="link" href="reference.html#sequence"><code class="computeroutput"><span class="identifier">sequence</span></code></a>
588        for parsing the sequence of things:
589      </p>
590<pre class="programlisting"><span class="special">&gt;</span> <span class="special">#</span><span class="identifier">include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">sequence</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
591</pre>
592<p>
593        We can implement the parser for our expressions using <a class="link" href="reference.html#sequence"><code class="computeroutput"><span class="identifier">sequence</span></code></a>:
594      </p>
595<pre class="programlisting"><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;</span>
596</pre>
597<p>
598        Let's create a parser using it:
599      </p>
600<pre class="programlisting"><span class="special">&gt;</span> <span class="keyword">using</span> <span class="identifier">exp_parser4</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;&gt;;</span>
601</pre>
602<p>
603        Try parsing a simple expression using it:
604      </p>
605<pre class="programlisting"><span class="special">&gt;</span> <span class="identifier">exp_parser4</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"11 + 2"</span><span class="special">)&gt;::</span><span class="identifier">type</span>
606<span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">v_item</span><span class="special">&lt;</span><span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">2</span><span class="special">&gt;,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">v_item</span><span class="special">&lt;</span><span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">char_</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;</span>
607<span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">v_item</span><span class="special">&lt;</span><span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">11</span><span class="special">&gt;,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector0</span><span class="special">&lt;</span><span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">na</span><span class="special">&gt;,</span> <span class="number">0</span>
608<span class="special">&gt;,</span> <span class="number">0</span><span class="special">&gt;,</span> <span class="number">0</span><span class="special">&gt;</span>
609</pre>
610<p>
611        What you get might look strange to you. It is a <code class="computeroutput"><span class="identifier">vector</span></code>
612        from [Boost.MPL]( http://boost.org/libs/mpl). What you can see in the shell
613        is the way this vector is represented. Metashell offers [pretty printing](metashell.org/manual/getting_started#data-structures-of-boostmpl)
614        for <a href="http://boost.org/libs/mpl" target="_top">Boost.MPL</a> containers:
615      </p>
616<pre class="programlisting"><span class="special">&gt;</span> <span class="special">#</span><span class="identifier">include</span> <span class="special">&lt;</span><span class="identifier">metashell</span><span class="special">/</span><span class="identifier">formatter</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
617</pre>
618<p>
619        After including this header, try parsing again:
620      </p>
621<pre class="programlisting"><span class="special">&gt;</span> <span class="identifier">exp_parser4</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"11 + 2"</span><span class="special">)&gt;::</span><span class="identifier">type</span>
622<span class="identifier">boost_</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">11</span><span class="special">&gt;,</span> <span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">char_</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;,</span> <span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">2</span><span class="special">&gt;</span> <span class="special">&gt;</span>
623</pre>
624<p>
625        What you get now looks more simple: this is a vector of three elements:
626      </p>
627<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
628<li class="listitem">
629            <code class="computeroutput"><span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">11</span><span class="special">&gt;</span></code>
630            This is the result of parsing with <a class="link" href="reference.html#token"><code class="computeroutput"><span class="identifier">token</span></code></a><code class="computeroutput"><span class="special">&lt;</span></code><a class="link" href="reference.html#int_"><code class="computeroutput"><span class="identifier">int_</span></code></a><code class="computeroutput"><span class="special">&gt;</span></code>.
631          </li>
632<li class="listitem">
633            <code class="computeroutput"><span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">char_</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;</span></code> This
634            is the result of parsing with <a class="link" href="reference.html#token"><code class="computeroutput"><span class="identifier">token</span></code></a><code class="computeroutput"><span class="special">&lt;</span></code><a class="link" href="reference.html#lit_c"><code class="computeroutput"><span class="identifier">lit_c</span></code></a><code class="computeroutput"><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;</span></code>.
635          </li>
636<li class="listitem">
637            <code class="computeroutput"><span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">2</span><span class="special">&gt;</span> <span class="special">&gt;</span></code> This is the result of parsing with
638            <a class="link" href="reference.html#token"><code class="computeroutput"><span class="identifier">token</span></code></a><code class="computeroutput"><span class="special">&lt;</span></code><a class="link" href="reference.html#int_"><code class="computeroutput"><span class="identifier">int_</span></code></a><code class="computeroutput"><span class="special">&gt;</span></code>.
639          </li>
640</ul></div>
641<p>
642        The result of parsing with a <a class="link" href="reference.html#sequence"><code class="computeroutput"><span class="identifier">sequence</span></code></a>
643        is the <code class="computeroutput"><span class="identifier">vector</span></code> of the individual
644        parsing results.
645      </p>
646<div class="section">
647<div class="titlepage"><div><div><h4 class="title">
648<a name="metaparse.getting_started_with_boost_metap.4_parsing_simple_expressions.4_1_tokenizer"></a><a class="link" href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.4_parsing_simple_expressions.4_1_tokenizer" title="4.1. Tokenizer">4.1.
649        Tokenizer</a>
650</h4></div></div></div>
651<div class="note"><table border="0" summary="Note">
652<tr>
653<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
654<th align="left">Note</th>
655</tr>
656<tr><td align="left" valign="top"><p>
657            Note that you can find everything that has been included and defined
658            so far <a class="link" href="getting_started_with_boost_metap.html#before_4_1">here</a>.
659          </p></td></tr>
660</table></div>
661<p>
662          You might have noticed that our parsers have no separate tokenizers. Tokenization
663          is part of the parsing process. However, it makes the code of the parsers
664          cleaner if we separate the two layers. The previous example has two types
665          of tokens:
666        </p>
667<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
668<li class="listitem">
669              a number (eg. <code class="computeroutput"><span class="number">13</span></code>)
670            </li>
671<li class="listitem">
672              a <code class="computeroutput"><span class="special">+</span></code> symbol
673            </li>
674</ul></div>
675<p>
676          In our last solution we parsed them by using the <a class="link" href="reference.html#token"><code class="computeroutput"><span class="identifier">token</span></code></a><code class="computeroutput"><span class="special">&lt;</span></code><a href="../int_html" target="_top"><code class="computeroutput"><span class="identifier">int_</span></code></a><code class="computeroutput"><span class="special">&gt;</span></code> and <a class="link" href="reference.html#token"><code class="computeroutput"><span class="identifier">token</span></code></a><code class="computeroutput"><span class="special">&lt;</span></code><a class="link" href="reference.html#lit_c"><code class="computeroutput"><span class="identifier">lit_c</span></code></a><code class="computeroutput"><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;</span></code>
677          parsers. Have you noticed a pattern? We wrap the parsers of the tokens
678          with <a class="link" href="reference.html#token"><code class="computeroutput"><span class="identifier">token</span></code></a><code class="computeroutput"><span class="special">&lt;...&gt;</span></code>. It is not just syntactic sugar.
679          Our tokens might be followed (separated) by whitespaces, which can be ignored.
680          That is what <a class="link" href="reference.html#token"><code class="computeroutput"><span class="identifier">token</span></code></a><code class="computeroutput"><span class="special">&lt;...&gt;</span></code> implements.
681        </p>
682<p>
683          So let's make the implementation of <code class="computeroutput"><span class="identifier">exp_parser</span></code>
684          cleaner by separating the tokenization from the rest of the parser:
685        </p>
686<pre class="programlisting"><span class="special">&gt;</span> <span class="keyword">using</span> <span class="identifier">int_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
687<span class="special">&gt;</span> <span class="keyword">using</span> <span class="identifier">plus_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;;</span>
688</pre>
689<p>
690          <a class="link" href="getting_started_with_boost_metap.html#getting_started_1">copy-paste friendly version</a>
691        </p>
692<p>
693          These two definitions create type aliases for the parsers of our tokens.
694          For the compiler it doesn't matter if we use <code class="computeroutput"><span class="identifier">plus_token</span></code>
695          or <a class="link" href="reference.html#token"><code class="computeroutput"><span class="identifier">token</span></code></a><code class="computeroutput"><span class="special">&lt;</span></code><a class="link" href="reference.html#lit_c"><code class="computeroutput"><span class="identifier">lit_c</span></code></a><code class="computeroutput"><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;</span></code>,
696          since they refer to the same type. But it makes the code of the parser
697          easier to understand.
698        </p>
699<p>
700          We can now define our expression parser using these tokens:
701        </p>
702<pre class="programlisting"><span class="special">&gt;</span> <span class="keyword">using</span> <span class="identifier">exp_parser5</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;;</span>
703</pre>
704<p>
705          We can use it the same way as <code class="computeroutput"><span class="identifier">exp_parser4</span></code>:
706        </p>
707<pre class="programlisting"><span class="special">&gt;</span> <span class="identifier">exp_parser5</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"11 + 2"</span><span class="special">)&gt;::</span><span class="identifier">type</span>
708<span class="identifier">boost_</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">11</span><span class="special">&gt;,</span> <span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">char_</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;,</span> <span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">2</span><span class="special">&gt;</span> <span class="special">&gt;</span>
709</pre>
710</div>
711<div class="section">
712<div class="titlepage"><div><div><h4 class="title">
713<a name="metaparse.getting_started_with_boost_metap.4_parsing_simple_expressions.4_2_evaluating_the_expression"></a><a class="link" href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.4_parsing_simple_expressions.4_2_evaluating_the_expression" title="4.2. Evaluating the expression">4.2.
714        Evaluating the expression</a>
715</h4></div></div></div>
716<div class="note"><table border="0" summary="Note">
717<tr>
718<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
719<th align="left">Note</th>
720</tr>
721<tr><td align="left" valign="top"><p>
722            Note that you can find everything that has been included and defined
723            so far <a class="link" href="getting_started_with_boost_metap.html#before_4_2">here</a>.
724          </p></td></tr>
725</table></div>
726<p>
727          It would be nice if we could evaluate the expression as well. Instead of
728          returning a <code class="computeroutput"><span class="identifier">vector</span></code> as the
729          result of parsing, we should return the evaluated expression. For example
730          the result of parsing <code class="computeroutput"><span class="string">"11 + 2"</span></code>
731          should be <code class="computeroutput"><span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">13</span><span class="special">&gt;</span></code>.
732        </p>
733<p>
734          Metaparse provides <a class="link" href="reference.html#transform"><code class="computeroutput"><span class="identifier">transform</span></code></a>
735          which we can use to implement this:
736        </p>
737<pre class="programlisting"><span class="special">&gt;</span> <span class="special">#</span><span class="identifier">include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">transform</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
738</pre>
739<p>
740          This can be used to transform the result of a parser. For example we have
741          the <a class="link" href="reference.html#sequence"><code class="computeroutput"><span class="identifier">sequence</span></code></a><code class="computeroutput"><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;</span></code> parser which returns a <code class="computeroutput"><span class="identifier">vector</span></code>. We want to transform this <code class="computeroutput"><span class="identifier">vector</span></code> into a number, which is the result
742          of evaluating the expression. We need to pass <a class="link" href="reference.html#transform"><code class="computeroutput"><span class="identifier">transform</span></code></a> the <a class="link" href="reference.html#sequence"><code class="computeroutput"><span class="identifier">sequence</span></code></a><code class="computeroutput"><span class="special">&lt;...&gt;</span></code>
743          parser and a function which turns the <code class="computeroutput"><span class="identifier">vector</span></code>
744          into the result we need. First let's create this <a class="link" href="reference.html#metafunction">metafunction</a>:
745        </p>
746<pre class="programlisting"><span class="special">&gt;</span> <span class="special">#</span><span class="identifier">include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">plus</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
747<span class="special">&gt;</span> <span class="special">#</span><span class="identifier">include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">at</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
748<span class="special">&gt;</span> <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">&gt;</span> <span class="special">\</span>
749<span class="special">...&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_plus</span> <span class="special">:</span> <span class="special">\</span>
750<span class="special">...&gt;</span>   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span> <span class="special">\</span>
751<span class="special">...&gt;</span>     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">,</span> <span class="special">\</span>
752<span class="special">...&gt;</span>     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">2</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">\</span>
753<span class="special">...&gt;</span>   <span class="special">&gt;</span> <span class="special">{};</span>
754</pre>
755<p>
756          <a class="link" href="getting_started_with_boost_metap.html#getting_started_2">copy-paste friendly version</a>
757        </p>
758<div class="note"><table border="0" summary="Note">
759<tr>
760<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
761<th align="left">Note</th>
762</tr>
763<tr><td align="left" valign="top"><p>
764            Note that if the last character of your command is the <code class="computeroutput"><span class="special">\</span></code> character in Metashell, then the shell
765            assumes that you will continue typing the same command and waits for
766            that before evaluating your command. When Metashell is waiting for the
767            second (or third, or fourth, etc) line of a command, it uses a special
768            prompt, <code class="computeroutput"><span class="special">...&gt;</span></code>.
769          </p></td></tr>
770</table></div>
771<p>
772          What it does is that using <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span></code>
773          it takes the first (index 0) and the third (index 2) elements of the <code class="computeroutput"><span class="identifier">vector</span></code> that is the result of parsing
774          with <a class="link" href="reference.html#sequence"><code class="computeroutput"><span class="identifier">sequence</span></code></a><code class="computeroutput"><span class="special">&lt;...&gt;</span></code> and adds them. We can try it
775          out with an example <code class="computeroutput"><span class="identifier">vector</span></code>:
776        </p>
777<pre class="programlisting"><span class="special">&gt;</span> <span class="identifier">eval_plus</span><span class="special">&lt;</span> <span class="special">\</span>
778<span class="special">...&gt;</span>  <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span> <span class="special">\</span>
779<span class="special">...&gt;</span>    <span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">11</span><span class="special">&gt;,</span> <span class="special">\</span>
780<span class="special">...&gt;</span>    <span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">char_</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;,</span> <span class="special">\</span>
781<span class="special">...&gt;</span>    <span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">2</span><span class="special">&gt;</span> <span class="special">\</span>
782<span class="special">...&gt;</span>  <span class="special">&gt;&gt;::</span><span class="identifier">type</span>
783<span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">13</span><span class="special">&gt;</span>
784</pre>
785<p>
786          <a class="link" href="getting_started_with_boost_metap.html#getting_started_3">copy-paste friendly version</a>
787        </p>
788<p>
789          We can use <code class="computeroutput"><span class="identifier">eval_plus</span></code> to
790          build a parser that evaluates the expression it parses:
791        </p>
792<pre class="programlisting"><span class="special">&gt;</span> <span class="special">#</span><span class="identifier">include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">quote</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
793<span class="special">&gt;</span> <span class="keyword">using</span> <span class="identifier">exp_parser6</span> <span class="special">=</span> <span class="special">\</span>
794<span class="special">...&gt;</span> <span class="identifier">build_parser</span><span class="special">&lt;</span> <span class="special">\</span>
795<span class="special">...&gt;</span>   <span class="identifier">transform</span><span class="special">&lt;</span> <span class="special">\</span>
796<span class="special">...&gt;</span>     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span> <span class="special">\</span>
797<span class="special">...&gt;</span>     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">eval_plus</span><span class="special">&gt;</span> <span class="special">\</span>
798<span class="special">...&gt;</span>   <span class="special">&gt;</span> <span class="special">\</span>
799<span class="special">...&gt;</span> <span class="special">&gt;;</span>
800</pre>
801<p>
802          <a class="link" href="getting_started_with_boost_metap.html#getting_started_4">copy-paste friendly version</a>
803        </p>
804<div class="note"><table border="0" summary="Note">
805<tr>
806<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
807<th align="left">Note</th>
808</tr>
809<tr><td align="left" valign="top"><p>
810            Note that we have to use <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span></code>
811            to turn our <code class="computeroutput"><span class="identifier">eval_plus</span></code>
812            <a class="link" href="reference.html#metafunction">metafunction</a> into a <a class="link" href="reference.html#metafunction_class">metafunction
813            class</a>.
814          </p></td></tr>
815</table></div>
816<p>
817          <a class="link" href="reference.html#transform"><code class="computeroutput"><span class="identifier">transform</span></code></a>
818          parses the input using <a class="link" href="reference.html#sequence"><code class="computeroutput"><span class="identifier">sequence</span></code></a><code class="computeroutput"><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;</span></code> and transforms the result of that using
819          <code class="computeroutput"><span class="identifier">eval_plus</span></code>. Let's try it
820          out:
821        </p>
822<pre class="programlisting"><span class="special">&gt;</span> <span class="identifier">exp_parser6</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"11 + 2"</span><span class="special">)&gt;::</span><span class="identifier">type</span>
823<span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">13</span><span class="special">&gt;</span>
824</pre>
825<p>
826          We have created a simple expression parser. The following diagram shows
827          how it works:
828        </p>
829<p>
830          <span class="inlinemediaobject"><img src="../images/metaparse/tutorial_diag0.png" width="50%"></span>
831        </p>
832<p>
833          The rounded boxes in the diagram are the parsers parsing the input, which
834          are functions (<a class="link" href="reference.html#metafunction_class">template metafunction
835          class</a>es). The arrows represent how the results are passed around
836          between these parsers (they are the return values of the function calls).
837        </p>
838<p>
839          It uses <a class="link" href="reference.html#sequence"><code class="computeroutput"><span class="identifier">sequence</span></code></a>
840          to parse the different elements (the first number, the <code class="computeroutput"><span class="special">+</span></code>
841          symbol and the second number) and builds a <code class="computeroutput"><span class="identifier">vector</span></code>.
842          The final result is calculated from that <code class="computeroutput"><span class="identifier">vector</span></code>
843          by the <a class="link" href="reference.html#transform"><code class="computeroutput"><span class="identifier">transform</span></code></a>
844          parser.
845        </p>
846</div>
847</div>
848<div class="section">
849<div class="titlepage"><div><div><h3 class="title">
850<a name="metaparse.getting_started_with_boost_metap.5_parsing_longer_expressions"></a><a class="link" href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.5_parsing_longer_expressions" title="5. Parsing longer expressions">5.
851      Parsing longer expressions</a>
852</h3></div></div></div>
853<div class="toc"><dl class="toc">
854<dt><span class="section"><a href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.5_parsing_longer_expressions.5_1_parsing_a_subexpression_repe">5.1.
855        Parsing a subexpression repeatedly</a></span></dt>
856<dt><span class="section"><a href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.5_parsing_longer_expressions.5_2_evaluating_the_parsed_expres">5.2.
857        Evaluating the parsed expression</a></span></dt>
858</dl></div>
859<div class="note"><table border="0" summary="Note">
860<tr>
861<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
862<th align="left">Note</th>
863</tr>
864<tr><td align="left" valign="top"><p>
865          Note that you can find everything that has been included and defined so
866          far <a class="link" href="getting_started_with_boost_metap.html#before_5">here</a>.
867        </p></td></tr>
868</table></div>
869<p>
870        We can parse simple expressions adding two numbers together. But we can't
871        parse expressions adding three, four or maybe more numbers together. In this
872        section we will implement a parser for expressions adding lots of numbers
873        together.
874      </p>
875<div class="section">
876<div class="titlepage"><div><div><h4 class="title">
877<a name="metaparse.getting_started_with_boost_metap.5_parsing_longer_expressions.5_1_parsing_a_subexpression_repe"></a><a class="link" href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.5_parsing_longer_expressions.5_1_parsing_a_subexpression_repe" title="5.1. Parsing a subexpression repeatedly">5.1.
878        Parsing a subexpression repeatedly</a>
879</h4></div></div></div>
880<div class="note"><table border="0" summary="Note">
881<tr>
882<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
883<th align="left">Note</th>
884</tr>
885<tr><td align="left" valign="top"><p>
886            Note that you can find everything that has been included and defined
887            so far <a class="link" href="getting_started_with_boost_metap.html#before_5_1">here</a>.
888          </p></td></tr>
889</table></div>
890<p>
891          We can't solve this problem with <a class="link" href="reference.html#sequence"><code class="computeroutput"><span class="identifier">sequence</span></code></a>, since we don't know
892          how many numbers the input will have. We need a parser that:
893        </p>
894<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
895<li class="listitem">
896              parses the first number
897            </li>
898<li class="listitem">
899              keeps parsing <code class="computeroutput"><span class="special">+</span> <span class="special">&lt;</span><span class="identifier">number</span><span class="special">&gt;</span></code>
900              elements until the end of the input
901            </li>
902</ul></div>
903<p>
904          Parsing the first number is something we can already do: the <code class="computeroutput"><span class="identifier">int_token</span></code> parser does it for us. Parsing
905          the <code class="computeroutput"><span class="special">+</span> <span class="special">&lt;</span><span class="identifier">number</span><span class="special">&gt;</span></code>
906          elements is more tricky. Metaparse offers different tools for approaching
907          this. The most simple is <a class="link" href="reference.html#repeated"><code class="computeroutput"><span class="identifier">repeated</span></code></a>:
908        </p>
909<pre class="programlisting"><span class="special">&gt;</span> <span class="special">#</span><span class="identifier">include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">any</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
910</pre>
911<p>
912          <a class="link" href="reference.html#repeated"><code class="computeroutput"><span class="identifier">repeated</span></code></a>
913          needs a parser (which parses one <code class="computeroutput"><span class="special">+</span>
914          <span class="special">&lt;</span><span class="identifier">number</span><span class="special">&gt;</span></code> element) and it keeps parsing the input
915          with it as long as it can. This will parse the entire input for us. Let's
916          create a parser for our expressions using it:
917        </p>
918<pre class="programlisting"><span class="special">&gt;</span> <span class="keyword">using</span> <span class="identifier">exp_parser7</span> <span class="special">=</span> <span class="special">\</span>
919<span class="special">...&gt;</span> <span class="identifier">build_parser</span><span class="special">&lt;</span> <span class="special">\</span>
920<span class="special">...&gt;</span>   <span class="identifier">sequence</span><span class="special">&lt;</span> <span class="special">\</span>
921<span class="special">...&gt;</span>     <span class="identifier">int_token</span><span class="special">,</span>                                <span class="comment">/* The first &lt;number&gt; */</span> <span class="special">\</span>
922<span class="special">...&gt;</span>     <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;</span> <span class="comment">/* The "+ &lt;number&gt;" elements */</span> <span class="special">\</span>
923<span class="special">...&gt;</span>   <span class="special">&gt;</span> <span class="special">\</span>
924<span class="special">...&gt;</span> <span class="special">&gt;;</span>
925</pre>
926<p>
927          <a class="link" href="getting_started_with_boost_metap.html#getting_started_5">copy-paste friendly version</a>
928        </p>
929<p>
930          We have a <a class="link" href="reference.html#sequence"><code class="computeroutput"><span class="identifier">sequence</span></code></a>
931          with two elements:
932        </p>
933<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
934<li class="listitem">
935              The first number (<code class="computeroutput"><span class="identifier">int_token</span></code>)
936            </li>
937<li class="listitem">
938              The <code class="computeroutput"><span class="special">+</span> <span class="special">&lt;</span><span class="identifier">number</span><span class="special">&gt;</span></code>
939              parts
940            </li>
941</ul></div>
942<p>
943          The second part is an <a class="link" href="reference.html#repeated"><code class="computeroutput"><span class="identifier">repeated</span></code></a>,
944          which parses the <code class="computeroutput"><span class="special">+</span> <span class="special">&lt;</span><span class="identifier">number</span><span class="special">&gt;</span></code>
945          elements. One such element is parsed by <a class="link" href="reference.html#sequence"><code class="computeroutput"><span class="identifier">sequence</span></code></a><code class="computeroutput"><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span>
946          <span class="identifier">int_token</span><span class="special">&gt;</span></code>.
947          This is just a sequence of the <code class="computeroutput"><span class="special">+</span></code>
948          symbol and the number.
949        </p>
950<p>
951          Let's try parsing an expression using this:
952        </p>
953<pre class="programlisting"><span class="special">&gt;</span> <span class="identifier">exp_parser7</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 + 3 + 4"</span><span class="special">)&gt;::</span><span class="identifier">type</span>
954</pre>
955<p>
956          Here is a formatted version of the result which is easier to read:
957        </p>
958<pre class="programlisting"><span class="identifier">boost_</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span>
959  <span class="comment">// The result of int_token</span>
960  <span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;,</span>
961
962  <span class="comment">// The result of repeated&lt; sequence&lt;plus_token, int_token&gt; &gt;</span>
963  <span class="identifier">boost_</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span>
964    <span class="identifier">boost_</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">char_</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;,</span> <span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">2</span><span class="special">&gt;</span> <span class="special">&gt;,</span>
965    <span class="identifier">boost_</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">char_</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;,</span> <span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">3</span><span class="special">&gt;</span> <span class="special">&gt;,</span>
966    <span class="identifier">boost_</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">char_</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;,</span> <span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">4</span><span class="special">&gt;</span> <span class="special">&gt;</span>
967  <span class="special">&gt;</span>
968<span class="special">&gt;</span>
969</pre>
970<p>
971          The result is a <code class="computeroutput"><span class="identifier">vector</span></code>
972          of two elements. The first element of this <code class="computeroutput"><span class="identifier">vector</span></code>
973          is the result of parsing the input with <code class="computeroutput"><span class="identifier">int_token</span></code>,
974          the second element of this <code class="computeroutput"><span class="identifier">vector</span></code>
975          is the result of parsing the input with <a class="link" href="reference.html#repeated"><code class="computeroutput"><span class="identifier">repeated</span></code></a><code class="computeroutput"><span class="special">&lt;</span>
976          </code><a class="link" href="reference.html#sequence"><code class="computeroutput"><span class="identifier">sequence</span></code></a><code class="computeroutput"><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;</span></code>. This second element is also a
977          <code class="computeroutput"><span class="identifier">vector</span></code>. Each element of
978          this <code class="computeroutput"><span class="identifier">vector</span></code> is the result
979          of parsing the input with <a class="link" href="reference.html#sequence"><code class="computeroutput"><span class="identifier">sequence</span></code></a><code class="computeroutput"><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;</span></code> once. Here is a diagram showing how
980          <code class="computeroutput"><span class="identifier">exp_parser7</span></code> parses the
981          input <code class="computeroutput"><span class="number">1</span> <span class="special">+</span>
982          <span class="number">2</span> <span class="special">+</span> <span class="number">3</span> <span class="special">+</span> <span class="number">4</span></code>:
983        </p>
984<p>
985          <span class="inlinemediaobject"><img src="../images/metaparse/tutorial_diag1.png" width="90%"></span>
986        </p>
987<p>
988          The diagram shows that the <code class="computeroutput"><span class="special">+</span> <span class="special">&lt;</span><span class="identifier">number</span><span class="special">&gt;</span></code> elements are parsed by <a class="link" href="reference.html#sequence"><code class="computeroutput"><span class="identifier">sequence</span></code></a><code class="computeroutput"><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span>
989          <span class="identifier">int_token</span><span class="special">&gt;</span></code>
990          elements and their results are collected by <a class="link" href="reference.html#repeated"><code class="computeroutput"><span class="identifier">repeated</span></code></a>, which constructs a
991          <code class="computeroutput"><span class="identifier">vector</span></code> of these results.
992          The value of the first <code class="computeroutput"><span class="special">&lt;</span><span class="identifier">number</span><span class="special">&gt;</span></code>
993          and this <code class="computeroutput"><span class="identifier">vector</span></code> are placed
994          in another <code class="computeroutput"><span class="identifier">vector</span></code>, which
995          is the result of parsing.
996        </p>
997</div>
998<div class="section">
999<div class="titlepage"><div><div><h4 class="title">
1000<a name="metaparse.getting_started_with_boost_metap.5_parsing_longer_expressions.5_2_evaluating_the_parsed_expres"></a><a class="link" href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.5_parsing_longer_expressions.5_2_evaluating_the_parsed_expres" title="5.2. Evaluating the parsed expression">5.2.
1001        Evaluating the parsed expression</a>
1002</h4></div></div></div>
1003<div class="toc"><dl class="toc">
1004<dt><span class="section"><a href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.5_parsing_longer_expressions.5_2_evaluating_the_parsed_expres.5_2_1_learning_about_boost_mpl_f">5.2.1.
1005          Learning about <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span></code></a></span></dt>
1006<dt><span class="section"><a href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.5_parsing_longer_expressions.5_2_evaluating_the_parsed_expres.5_2_2_evaluating_the_expression_">5.2.2.
1007          Evaluating the expression using <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span></code></a></span></dt>
1008<dt><span class="section"><a href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.5_parsing_longer_expressions.5_2_evaluating_the_parsed_expres.5_2_3_using_a_folding_parser_com">5.2.3.
1009          Using a folding parser combinator</a></span></dt>
1010<dt><span class="section"><a href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.5_parsing_longer_expressions.5_2_evaluating_the_parsed_expres.5_2_4_processing_the_initial_ele">5.2.4.
1011          Processing the initial element with the folding parser combinator</a></span></dt>
1012</dl></div>
1013<div class="note"><table border="0" summary="Note">
1014<tr>
1015<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
1016<th align="left">Note</th>
1017</tr>
1018<tr><td align="left" valign="top"><p>
1019            Note that you can find everything that has been included and defined
1020            so far <a class="link" href="getting_started_with_boost_metap.html#before_5_2">here</a>.
1021          </p></td></tr>
1022</table></div>
1023<p>
1024          The final result here is a pair of the first number and the <code class="computeroutput"><span class="identifier">vector</span></code> of the rest of the values. To
1025          calculate the result we need to process that data structure. Let's give
1026          the example output we have just parsed a name. This will make it easier
1027          to test the code calculating the final result from this structure:
1028        </p>
1029<pre class="programlisting"><span class="special">&gt;</span> <span class="keyword">using</span> <span class="identifier">temp_result</span> <span class="special">=</span> <span class="identifier">exp_parser7</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 + 3 + 4"</span><span class="special">)&gt;::</span><span class="identifier">type</span><span class="special">;</span>
1030</pre>
1031<p>
1032          Now we can write a <a class="link" href="reference.html#metafunction">template metafunction</a>
1033          turning this structure into the result of the calculation this structure
1034          represents.
1035        </p>
1036<div class="section">
1037<div class="titlepage"><div><div><h5 class="title">
1038<a name="metaparse.getting_started_with_boost_metap.5_parsing_longer_expressions.5_2_evaluating_the_parsed_expres.5_2_1_learning_about_boost_mpl_f"></a><a class="link" href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.5_parsing_longer_expressions.5_2_evaluating_the_parsed_expres.5_2_1_learning_about_boost_mpl_f" title="5.2.1. Learning about boost::mpl::fold">5.2.1.
1039          Learning about <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span></code></a>
1040</h5></div></div></div>
1041<div class="note"><table border="0" summary="Note">
1042<tr>
1043<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
1044<th align="left">Note</th>
1045</tr>
1046<tr><td align="left" valign="top"><p>
1047              Note that you can find everything that has been included and defined
1048              so far <a class="link" href="getting_started_with_boost_metap.html#before_5_2_1">here</a>.
1049            </p></td></tr>
1050</table></div>
1051<p>
1052            We have a <code class="computeroutput"><span class="identifier">vector</span></code> containing
1053            another <code class="computeroutput"><span class="identifier">vector</span></code>. Therefore,
1054            we will need to be able to summarise the elements of different <code class="computeroutput"><span class="identifier">vector</span></code>s. We can use the <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span></code> <a class="link" href="reference.html#metafunction">metafunction</a>
1055            to do this:
1056          </p>
1057<pre class="programlisting"><span class="special">&gt;</span> <span class="special">#</span><span class="identifier">include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">fold</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
1058</pre>
1059<p>
1060            With this <a class="link" href="reference.html#metafunction">metafunction</a>, we can iterate
1061            over a <code class="computeroutput"><span class="identifier">vector</span></code> of parsed
1062            numbers and summarise them. We can provide it a <a class="link" href="reference.html#metafunction">metafunction</a>
1063            taking two arguments: the sum we have so far and the next element of
1064            the <code class="computeroutput"><span class="identifier">vector</span></code>. This <a class="link" href="reference.html#metafunction">metafunction</a> will be called for every element
1065            of the <code class="computeroutput"><span class="identifier">vector</span></code>.
1066          </p>
1067<div class="note"><table border="0" summary="Note">
1068<tr>
1069<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
1070<th align="left">Note</th>
1071</tr>
1072<tr><td align="left" valign="top"><p>
1073              Note that this is very similar to the <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">accumulate</span></code>
1074              algorithm. <a href="http://boost.org/libs/mpl" target="_top">Boost.MPL</a>
1075              provides <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">accumulate</span></code> as well, which is a synonym
1076              for <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span></code>. This tutorial (and Metaparse)
1077              uses the name <code class="computeroutput"><span class="identifier">fold</span></code>.
1078            </p></td></tr>
1079</table></div>
1080<p>
1081            Let's start with a simple case: a <code class="computeroutput"><span class="identifier">vector</span></code>
1082            of numbers. For example let's summarise the elements of the following
1083            <code class="computeroutput"><span class="identifier">vector</span></code>:
1084          </p>
1085<pre class="programlisting"><span class="special">&gt;</span> <span class="keyword">using</span> <span class="identifier">vector_of_numbers</span> <span class="special">=</span> <span class="special">\</span>
1086<span class="special">...&gt;</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span> <span class="special">\</span>
1087<span class="special">...&gt;</span>   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">2</span><span class="special">&gt;,</span> <span class="special">\</span>
1088<span class="special">...&gt;</span>   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">5</span><span class="special">&gt;,</span> <span class="special">\</span>
1089<span class="special">...&gt;</span>   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">6</span><span class="special">&gt;</span> <span class="special">\</span>
1090<span class="special">...&gt;</span> <span class="special">&gt;;</span>
1091</pre>
1092<p>
1093            <a class="link" href="getting_started_with_boost_metap.html#getting_started_6">copy-paste friendly version</a>
1094          </p>
1095<p>
1096            We will write a <a class="link" href="reference.html#metafunction">template metafunction</a>,
1097            <code class="computeroutput"><span class="identifier">sum_vector</span></code> for summarising
1098            the elements of a <code class="computeroutput"><span class="identifier">vector</span></code>
1099            of numbers:
1100          </p>
1101<pre class="programlisting"><span class="special">&gt;</span> <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">&gt;</span> <span class="special">\</span>
1102<span class="special">...&gt;</span> <span class="keyword">struct</span> <span class="identifier">sum_vector</span> <span class="special">:</span> <span class="special">\</span>
1103<span class="special">...&gt;</span>    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span> <span class="special">\</span>
1104<span class="special">...&gt;</span>      <span class="identifier">Vector</span><span class="special">,</span> <span class="special">\</span>
1105<span class="special">...&gt;</span>      <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span> <span class="special">\</span>
1106<span class="special">...&gt;</span>      <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span> <span class="special">\</span>
1107<span class="special">...&gt;</span>        <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_2</span><span class="special">&gt;</span> <span class="special">\</span>
1108<span class="special">...&gt;</span>      <span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">\</span>
1109<span class="special">...&gt;</span>    <span class="special">&gt;</span> <span class="special">\</span>
1110<span class="special">...&gt;</span>  <span class="special">{};</span>
1111</pre>
1112<p>
1113            <a class="link" href="getting_started_with_boost_metap.html#getting_started_7">copy-paste friendly version</a>
1114          </p>
1115<p>
1116            This <a class="link" href="reference.html#metafunction">metafunction</a> takes the <code class="computeroutput"><span class="identifier">vector</span></code> to summarise the elements of
1117            as its argument and uses <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span></code>
1118            to calculate the sum. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span></code>
1119            takes three arguments:
1120          </p>
1121<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1122<li class="listitem">
1123                The container to summarise. This is <code class="computeroutput"><span class="identifier">Vector</span></code>.
1124              </li>
1125<li class="listitem">
1126                The starting value for <span class="emphasis"><em>the sum we have so far</em></span>.
1127                Using <code class="computeroutput"><span class="number">0</span></code> means that we
1128                want to start the sum from <code class="computeroutput"><span class="number">0</span></code>.
1129              </li>
1130<li class="listitem">
1131                The function to call in every iteration while looping over the container.
1132                We are using a <a href="http://www.boost.org/libs/mpl/doc/refmanual/lambda-expression.html" target="_top">lambda
1133                expression</a> in our example, which is the expression wrapped
1134                by <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span></code>. This expression adds its
1135                two arguments together using <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span></code>.
1136                The lambda expression refers to its arguments by <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span></code>
1137                and <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_2</span></code>.
1138              </li>
1139</ul></div>
1140<p>
1141            Let's try this <a class="link" href="reference.html#metafunction">metafunction</a> out:
1142          </p>
1143<pre class="programlisting"><span class="special">&gt;</span> <span class="identifier">sum_vector</span><span class="special">&lt;</span><span class="identifier">vector_of_numbers</span><span class="special">&gt;::</span><span class="identifier">type</span>
1144<span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">13</span><span class="special">&gt;</span>
1145</pre>
1146<p>
1147            It works as expected. Here is a diagram showing how it works:
1148          </p>
1149<p>
1150            <span class="inlinemediaobject"><img src="../images/metaparse/tutorial_diag2.png" width="50%"></span>
1151          </p>
1152<p>
1153            As the diagram shows, <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span></code>
1154            evaluates the lambda expression for each element of the <code class="computeroutput"><span class="identifier">vector</span></code> and passes the result of the
1155            previous evaluation to the next lambda expression invocation.
1156          </p>
1157<p>
1158            We have a <a class="link" href="reference.html#metafunction">metafunction</a> that can summarise
1159            a <code class="computeroutput"><span class="identifier">vector</span></code> of numbers.
1160            The result of parsing the <code class="computeroutput"><span class="special">+</span> <span class="special">&lt;</span><span class="identifier">number</span><span class="special">&gt;</span></code> elements is a <code class="computeroutput"><span class="identifier">vector</span></code>
1161            of <code class="computeroutput"><span class="identifier">vector</span></code>s. As a recap,
1162            here is <code class="computeroutput"><span class="identifier">temp_result</span></code>:
1163          </p>
1164<pre class="programlisting"><span class="identifier">boost_</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span>
1165  <span class="comment">// The result of int_token</span>
1166  <span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;,</span>
1167
1168  <span class="comment">// The result of repeated&lt; sequence&lt;plus_token, int_token&gt; &gt;</span>
1169  <span class="identifier">boost_</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span>
1170    <span class="identifier">boost_</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">char_</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;,</span> <span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">2</span><span class="special">&gt;</span> <span class="special">&gt;,</span>
1171    <span class="identifier">boost_</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">char_</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;,</span> <span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">3</span><span class="special">&gt;</span> <span class="special">&gt;,</span>
1172    <span class="identifier">boost_</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">char_</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;,</span> <span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">4</span><span class="special">&gt;</span> <span class="special">&gt;</span>
1173  <span class="special">&gt;</span>
1174<span class="special">&gt;</span>
1175</pre>
1176<p>
1177            First let's summarise the result of <a class="link" href="reference.html#repeated"><code class="computeroutput"><span class="identifier">repeated</span></code></a><code class="computeroutput"><span class="special">&lt;...&gt;</span></code>
1178            using <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span></code>. This is a <code class="computeroutput"><span class="identifier">vector</span></code>
1179            of <code class="computeroutput"><span class="identifier">vector</span></code>s, but that's
1180            fine. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span></code> doesn't care about what the elements
1181            of the <code class="computeroutput"><span class="identifier">vector</span></code> are. They
1182            can be numbers, <code class="computeroutput"><span class="identifier">vector</span></code>s
1183            or something else as well. The function we use to add two numbers together
1184            (which was a lambda expression in our previous example) gets these elements
1185            as its argument and has to deal with them. So to summarise the elements
1186            of the <code class="computeroutput"><span class="identifier">vector</span></code>s we get
1187            as the result of parsing with <a class="link" href="reference.html#repeated"><code class="computeroutput"><span class="identifier">repeated</span></code></a><code class="computeroutput"><span class="special">&lt;...&gt;</span></code>,
1188            we need to write a <a class="link" href="reference.html#metafunction">metafunction</a> that
1189            can deal with these elements. One such element is <code class="computeroutput"><span class="identifier">boost_</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">mpl_</span><span class="special">::</span><span class="keyword">char</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;,</span>
1190            <span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">2</span><span class="special">&gt;&gt;</span></code>.
1191            Here is a <a class="link" href="reference.html#metafunction">metafunction</a> that can be
1192            used in a <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span></code>:
1193          </p>
1194<pre class="programlisting"><span class="special">&gt;</span> <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Sum</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Item</span><span class="special">&gt;</span> <span class="special">\</span>
1195<span class="special">...&gt;</span>   <span class="keyword">struct</span> <span class="identifier">sum_items</span> <span class="special">:</span> <span class="special">\</span>
1196<span class="special">...&gt;</span>     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span> <span class="special">\</span>
1197<span class="special">...&gt;</span>       <span class="identifier">Sum</span><span class="special">,</span> <span class="special">\</span>
1198<span class="special">...&gt;</span>       <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">\</span>
1199<span class="special">...&gt;</span>     <span class="special">&gt;</span> <span class="special">\</span>
1200<span class="special">...&gt;</span> <span class="special">{};</span>
1201</pre>
1202<p>
1203            <a class="link" href="getting_started_with_boost_metap.html#getting_started_8">copy-paste friendly version</a>
1204          </p>
1205<p>
1206            This function takes two arguments:
1207          </p>
1208<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1209<li class="listitem">
1210                <code class="computeroutput"><span class="identifier">Sum</span></code>, which is a number.
1211                This is the summary of the already processed elements.
1212              </li>
1213<li class="listitem">
1214                <code class="computeroutput"><span class="identifier">Item</span></code>, the next item
1215                of the <code class="computeroutput"><span class="identifier">vector</span></code>. These
1216                items are <code class="computeroutput"><span class="identifier">vector</span></code>s
1217                of size two: the result of parsing the <code class="computeroutput"><span class="special">+</span></code>
1218                symbol and the number.
1219              </li>
1220</ul></div>
1221<p>
1222            The <a class="link" href="reference.html#metafunction">metafunction</a> adds the sum we
1223            have so far and the next number together using the <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span></code>
1224            <a class="link" href="reference.html#metafunction">metafunction</a>. To get the next number
1225            out of <code class="computeroutput"><span class="identifier">Item</span></code>, it uses
1226            <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span></code>. Let's try <code class="computeroutput"><span class="identifier">sum_items</span></code>
1227            out:
1228          </p>
1229<pre class="programlisting"><span class="special">&gt;</span> <span class="identifier">sum_items</span><span class="special">&lt;</span> <span class="special">\</span>
1230<span class="special">...&gt;</span>   <span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;,</span> <span class="special">\</span>
1231<span class="special">...&gt;</span>   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">char_</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;,</span> <span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">2</span><span class="special">&gt;&gt;</span> <span class="special">\</span>
1232<span class="special">...&gt;</span> <span class="special">&gt;::</span><span class="identifier">type</span>
1233<span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">3</span><span class="special">&gt;</span>
1234</pre>
1235<p>
1236            <a class="link" href="getting_started_with_boost_metap.html#getting_started_9">copy-paste friendly version</a>
1237          </p>
1238<p>
1239            We have called <code class="computeroutput"><span class="identifier">sum_items</span></code>
1240            with values from <code class="computeroutput"><span class="identifier">temp_result</span></code>
1241            and saw that it works as expected: it added the partial sum (<code class="computeroutput"><span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;</span></code>)
1242            to the next number (<code class="computeroutput"><span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">2</span><span class="special">&gt;</span></code>).
1243          </p>
1244<p>
1245            <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span></code> can summarise the list we get
1246            as the result of parsing the <code class="computeroutput"><span class="special">+</span>
1247            <span class="special">&lt;</span><span class="identifier">number</span><span class="special">&gt;</span></code> elements of the input, so we need
1248            to extract this list from <code class="computeroutput"><span class="identifier">temp_result</span></code>
1249            first:
1250          </p>
1251<pre class="programlisting"><span class="special">&gt;</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">temp_result</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;::</span><span class="identifier">type</span>
1252</pre>
1253<p>
1254            Here is the formatted version of the result:
1255          </p>
1256<pre class="programlisting"><span class="identifier">boost_</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span>
1257  <span class="identifier">boost_</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">char_</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;,</span> <span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">2</span><span class="special">&gt;&gt;,</span>
1258  <span class="identifier">boost_</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">char_</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;,</span> <span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">3</span><span class="special">&gt;&gt;,</span>
1259  <span class="identifier">boost_</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">char_</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;,</span> <span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">4</span><span class="special">&gt;&gt;</span>
1260<span class="special">&gt;</span>
1261</pre>
1262<p>
1263            This is the second element of the <code class="computeroutput"><span class="identifier">temp_result</span></code>
1264            vector (the first one is the value of the first <code class="computeroutput"><span class="special">&lt;</span><span class="identifier">number</span><span class="special">&gt;</span></code>
1265            element). Let's try fold out for this:
1266          </p>
1267<pre class="programlisting"><span class="special">&gt;</span> <span class="special">\</span>
1268<span class="special">...&gt;</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span> <span class="special">\</span>
1269<span class="special">...&gt;</span>   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">temp_result</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">,</span> <span class="comment">/* The vector to summarise */</span> <span class="special">\</span>
1270<span class="special">...&gt;</span>   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span> <span class="comment">/* The value to start the sum from */</span> <span class="special">\</span>
1271<span class="special">...&gt;</span>   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span> <span class="comment">/* The function to call in each iteration */</span> <span class="special">\</span>
1272<span class="special">...&gt;</span> <span class="special">&gt;::</span><span class="identifier">type</span>
1273<span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">9</span><span class="special">&gt;</span>
1274</pre>
1275<p>
1276            <a class="link" href="getting_started_with_boost_metap.html#getting_started_10">copy-paste friendly version</a>
1277          </p>
1278<div class="note"><table border="0" summary="Note">
1279<tr>
1280<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
1281<th align="left">Note</th>
1282</tr>
1283<tr><td align="left" valign="top"><p>
1284              We are using <code class="computeroutput"><span class="identifier">sum_items</span></code>
1285              as the function to call in each iteration. We are passing a <a class="link" href="reference.html#metafunction">metafunction</a>
1286              (<code class="computeroutput"><span class="identifier">sum_items</span></code>) to another
1287              <a class="link" href="reference.html#metafunction">metafunction</a> (<code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span></code>)
1288              as an argument. To be able to do this, we need to turn it into a <a class="link" href="reference.html#metafunction_class">template metafunction class</a> using
1289              <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span></code> (<code class="computeroutput"><span class="number">2</span></code>
1290              means that it takes two arguments).
1291            </p></td></tr>
1292</table></div>
1293<p>
1294            As we have seen, the result of this is the sum of the elements, which
1295            was <code class="computeroutput"><span class="number">9</span></code> in our case. Here is
1296            a diagram showing how <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span></code>
1297            works:
1298          </p>
1299<p>
1300            <span class="inlinemediaobject"><img src="../images/metaparse/tutorial_diag3.png" width="50%"></span>
1301          </p>
1302<p>
1303            It starts with the value <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;</span></code>
1304            and adds the elements of the <code class="computeroutput"><span class="identifier">boost_</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector</span></code>
1305            containing the parsing results one by one. The diagram shows how the
1306            subresults are calculated and then used for further calculations.
1307          </p>
1308</div>
1309<div class="section">
1310<div class="titlepage"><div><div><h5 class="title">
1311<a name="metaparse.getting_started_with_boost_metap.5_parsing_longer_expressions.5_2_evaluating_the_parsed_expres.5_2_2_evaluating_the_expression_"></a><a class="link" href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.5_parsing_longer_expressions.5_2_evaluating_the_parsed_expres.5_2_2_evaluating_the_expression_" title="5.2.2. Evaluating the expression using boost::mpl::fold">5.2.2.
1312          Evaluating the expression using <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span></code></a>
1313</h5></div></div></div>
1314<div class="note"><table border="0" summary="Note">
1315<tr>
1316<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
1317<th align="left">Note</th>
1318</tr>
1319<tr><td align="left" valign="top"><p>
1320              Note that you can find everything that has been included and defined
1321              so far <a class="link" href="getting_started_with_boost_metap.html#before_5_2_2">here</a>.
1322            </p></td></tr>
1323</table></div>
1324<p>
1325            Let's use <code class="computeroutput"><span class="identifier">sum_items</span></code> with
1326            <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span></code> to build the parser that summarises
1327            the values coming from the <code class="computeroutput"><span class="special">+</span> <span class="special">&lt;</span><span class="identifier">number</span><span class="special">&gt;</span></code> elements. We can extend the parser
1328            we were using in <code class="computeroutput"><span class="identifier">exp_parser7</span></code>
1329            by wrapping the <a class="link" href="reference.html#repeated"><code class="computeroutput"><span class="identifier">repeated</span></code></a><code class="computeroutput"><span class="special">&lt;...&gt;</span></code> part with <a class="link" href="reference.html#transform"><code class="computeroutput"><span class="identifier">transform</span></code></a>, which transforms
1330            the result of <a class="link" href="reference.html#repeated"><code class="computeroutput"><span class="identifier">repeated</span></code></a><code class="computeroutput"><span class="special">&lt;...&gt;</span></code> with the folding expression
1331            we have just created:
1332          </p>
1333<pre class="programlisting"><span class="special">&gt;</span> <span class="keyword">using</span> <span class="identifier">exp_parser8</span> <span class="special">=</span> <span class="special">\</span>
1334<span class="special">...&gt;</span> <span class="identifier">build_parser</span><span class="special">&lt;</span> <span class="special">\</span>
1335<span class="special">...&gt;</span>   <span class="identifier">sequence</span><span class="special">&lt;</span> <span class="special">\</span>
1336<span class="special">...&gt;</span>     <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* parse the first &lt;number&gt; */</span> <span class="special">\</span>
1337<span class="special">...&gt;</span>     <span class="identifier">transform</span><span class="special">&lt;</span> <span class="special">\</span>
1338<span class="special">...&gt;</span>       <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;,</span> <span class="comment">/* parse the "+ &lt;number&gt;" elements */</span> <span class="special">\</span>
1339<span class="special">...&gt;</span> <span class="special">\</span>
1340<span class="special">...&gt;</span>       <span class="comment">/* lambda expression summarising the "+ &lt;number&gt;" elements using fold */</span> <span class="special">\</span>
1341<span class="special">...&gt;</span>       <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span> <span class="special">\</span>
1342<span class="special">...&gt;</span>         <span class="comment">/* The folding expression we have just created */</span> <span class="special">\</span>
1343<span class="special">...&gt;</span>         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span> <span class="special">\</span>
1344<span class="special">...&gt;</span>           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span> <span class="comment">/* the argument of the lambda expression, the result */</span> <span class="special">\</span>
1345<span class="special">...&gt;</span>                           <span class="comment">/* of the repeated&lt;...&gt; parser */</span> <span class="special">\</span>
1346<span class="special">...&gt;</span>           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span> <span class="special">\</span>
1347<span class="special">...&gt;</span>           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span> <span class="special">\</span>
1348<span class="special">...&gt;</span>         <span class="special">&gt;</span> <span class="special">\</span>
1349<span class="special">...&gt;</span>       <span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">\</span>
1350<span class="special">...&gt;</span>     <span class="special">&gt;</span> <span class="special">\</span>
1351<span class="special">...&gt;</span>   <span class="special">&gt;</span> <span class="special">\</span>
1352<span class="special">...&gt;</span> <span class="special">&gt;;</span>
1353</pre>
1354<p>
1355            <a class="link" href="getting_started_with_boost_metap.html#getting_started_11">copy-paste friendly version</a>
1356          </p>
1357<p>
1358            It uses <a class="link" href="reference.html#transform"><code class="computeroutput"><span class="identifier">transform</span></code></a>
1359            to turn the result of the previous version of our parser into one that
1360            summarises the <code class="computeroutput"><span class="special">+</span> <span class="special">&lt;</span><span class="identifier">number</span><span class="special">&gt;</span></code>
1361            elements. Let's try it out:
1362          </p>
1363<pre class="programlisting"><span class="special">&gt;</span> <span class="identifier">exp_parser8</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 + 3 + 4"</span><span class="special">)&gt;::</span><span class="identifier">type</span>
1364<span class="identifier">boost_</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;,</span> <span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">9</span><span class="special">&gt;</span> <span class="special">&gt;</span>
1365</pre>
1366<p>
1367            This returns a pair of numbers as the result of parsing: the first number
1368            and the sum of the rest. To get the value of the entire expression we
1369            need to add these two numbers together. We can extend our parser to do
1370            this final addition as well:
1371          </p>
1372<pre class="programlisting"><span class="special">&gt;</span> <span class="keyword">using</span> <span class="identifier">exp_parser9</span> <span class="special">=</span> <span class="special">\</span>
1373<span class="special">...&gt;</span> <span class="identifier">build_parser</span><span class="special">&lt;</span> <span class="special">\</span>
1374<span class="special">...&gt;</span>   <span class="identifier">transform</span><span class="special">&lt;</span> <span class="special">\</span>
1375<span class="special">...&gt;</span>     <span class="comment">/* What we had so far */</span> <span class="special">\</span>
1376<span class="special">...&gt;</span>     <span class="identifier">sequence</span><span class="special">&lt;</span> <span class="special">\</span>
1377<span class="special">...&gt;</span>       <span class="identifier">int_token</span><span class="special">,</span> <span class="special">\</span>
1378<span class="special">...&gt;</span>       <span class="identifier">transform</span><span class="special">&lt;</span> <span class="special">\</span>
1379<span class="special">...&gt;</span>         <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;,</span> <span class="special">\</span>
1380<span class="special">...&gt;</span>         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span> <span class="special">\</span>
1381<span class="special">...&gt;</span>           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span> <span class="special">\</span>
1382<span class="special">...&gt;</span>             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span> <span class="special">\</span>
1383<span class="special">...&gt;</span>             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span> <span class="special">\</span>
1384<span class="special">...&gt;</span>             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span> <span class="special">\</span>
1385<span class="special">...&gt;</span>           <span class="special">&gt;</span> <span class="special">\</span>
1386<span class="special">...&gt;</span>         <span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">\</span>
1387<span class="special">...&gt;</span>       <span class="special">&gt;</span> <span class="special">\</span>
1388<span class="special">...&gt;</span>     <span class="special">&gt;,</span> <span class="special">\</span>
1389<span class="special">...&gt;</span>     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">sum_vector</span><span class="special">&gt;</span> <span class="comment">/* summarise the vector of numbers */</span> <span class="special">\</span>
1390<span class="special">...&gt;</span>   <span class="special">&gt;</span> <span class="special">\</span>
1391<span class="special">...&gt;</span> <span class="special">&gt;;</span>
1392</pre>
1393<p>
1394            <a class="link" href="getting_started_with_boost_metap.html#getting_started_12">copy-paste friendly version</a>
1395          </p>
1396<p>
1397            <code class="computeroutput"><span class="identifier">exp_parser9</span></code> wraps the
1398            parser we had so far (which gives us the two element <code class="computeroutput"><span class="identifier">vector</span></code>
1399            as the result) with <a class="link" href="reference.html#transform"><code class="computeroutput"><span class="identifier">transform</span></code></a>
1400            to add the elements of that two element <code class="computeroutput"><span class="identifier">vector</span></code>
1401            together. Since that two element <code class="computeroutput"><span class="identifier">vector</span></code>
1402            is a <code class="computeroutput"><span class="identifier">vector</span></code> of numbers,
1403            we can (re)use the <code class="computeroutput"><span class="identifier">sum_vector</span></code>
1404            <a class="link" href="reference.html#metafunction">metafunction</a> for this. Let's try
1405            it out:
1406          </p>
1407<pre class="programlisting"><span class="special">&gt;</span> <span class="identifier">exp_parser9</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 + 3 + 4"</span><span class="special">)&gt;::</span><span class="identifier">type</span>
1408<span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">10</span><span class="special">&gt;</span>
1409</pre>
1410<p>
1411            It gives us the correct result, but it is very inefficient. Let's see
1412            why:
1413          </p>
1414<p>
1415            <span class="inlinemediaobject"><img src="../images/metaparse/tutorial_diag4.png" width="90%"></span>
1416          </p>
1417<p>
1418            There are two loops in this process:
1419          </p>
1420<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1421<li class="listitem">
1422                first <a class="link" href="reference.html#repeated"><code class="computeroutput"><span class="identifier">repeated</span></code></a>
1423                loops over the input to parse all of the <code class="computeroutput"><span class="special">+</span>
1424                <span class="special">&lt;</span><span class="identifier">number</span><span class="special">&gt;</span></code> elements. It builds a <code class="computeroutput"><span class="identifier">vector</span></code> during this. (<code class="computeroutput"><span class="identifier">Loop</span> <span class="number">1</span></code>
1425                on the diagram)
1426              </li>
1427<li class="listitem">
1428                then <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span></code> loops over this <code class="computeroutput"><span class="identifier">vector</span></code> to summarise the elements.
1429                (<code class="computeroutput"><span class="identifier">Loop</span> <span class="number">2</span></code>
1430                on the diagram)
1431              </li>
1432</ul></div>
1433<div class="note"><table border="0" summary="Note">
1434<tr>
1435<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
1436<th align="left">Note</th>
1437</tr>
1438<tr><td align="left" valign="top"><p>
1439              Note that we have been talking about <span class="emphasis"><em>loop</em></span>s while
1440              there is no such thing as a loop in template metaprogramming. Loops
1441              can be implemented using <span class="emphasis"><em>recursion</em></span>: every recursive
1442              call is one iteration of the loop. The loop is stopped at the bottom
1443              of the recursive chain.
1444            </p></td></tr>
1445</table></div>
1446</div>
1447<div class="section">
1448<div class="titlepage"><div><div><h5 class="title">
1449<a name="metaparse.getting_started_with_boost_metap.5_parsing_longer_expressions.5_2_evaluating_the_parsed_expres.5_2_3_using_a_folding_parser_com"></a><a class="link" href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.5_parsing_longer_expressions.5_2_evaluating_the_parsed_expres.5_2_3_using_a_folding_parser_com" title="5.2.3. Using a folding parser combinator">5.2.3.
1450          Using a folding parser combinator</a>
1451</h5></div></div></div>
1452<div class="note"><table border="0" summary="Note">
1453<tr>
1454<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
1455<th align="left">Note</th>
1456</tr>
1457<tr><td align="left" valign="top"><p>
1458              Note that you can find everything that has been included and defined
1459              so far <a class="link" href="getting_started_with_boost_metap.html#before_5_2_3">here</a>.
1460            </p></td></tr>
1461</table></div>
1462<p>
1463            It would be nice, if the two loops could be merged together and the temporary
1464            <code class="computeroutput"><span class="identifier">vector</span></code> wouldn't have
1465            to be built in the middle (don't forget: there is no such thing as a
1466            <span class="emphasis"><em>garbage collector</em></span> for template metaprogramming.
1467            Once you instantiate a template, it will be available until the end of
1468            ... the compilation).
1469          </p>
1470<p>
1471            Metaparse provides the <a class="link" href="reference.html#foldl"><code class="computeroutput"><span class="identifier">foldl</span></code></a>
1472            parser combinator:
1473          </p>
1474<pre class="programlisting"><span class="special">&gt;</span> <span class="special">#</span><span class="identifier">include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">foldl</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
1475</pre>
1476<p>
1477            It is almost the same as <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span></code>,
1478            but instead of taking the <code class="computeroutput"><span class="identifier">vector</span></code>
1479            as its first argument, which was coming from the repeated application
1480            of a parser (<a class="link" href="reference.html#sequence"><code class="computeroutput"><span class="identifier">sequence</span></code></a><code class="computeroutput"><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;</span></code>) on the input, it takes the parser
1481            itself. <a class="link" href="reference.html#foldl"><code class="computeroutput"><span class="identifier">foldl</span></code></a>
1482            parses the input and calculates the summary on the fly. Here is how we
1483            can write our parser using it:
1484          </p>
1485<pre class="programlisting"><span class="special">&gt;</span> <span class="keyword">using</span> <span class="identifier">exp_parser10</span> <span class="special">=</span> <span class="special">\</span>
1486<span class="special">...&gt;</span> <span class="identifier">build_parser</span><span class="special">&lt;</span> <span class="special">\</span>
1487<span class="special">...&gt;</span>   <span class="identifier">transform</span><span class="special">&lt;</span> <span class="special">\</span>
1488<span class="special">...&gt;</span>     <span class="identifier">sequence</span><span class="special">&lt;</span> <span class="special">\</span>
1489<span class="special">...&gt;</span>       <span class="identifier">int_token</span><span class="special">,</span> <span class="special">\</span>
1490<span class="special">...&gt;</span>       <span class="identifier">foldl</span><span class="special">&lt;</span> <span class="special">\</span>
1491<span class="special">...&gt;</span>         <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span> <span class="special">\</span>
1492<span class="special">...&gt;</span>         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span> <span class="special">\</span>
1493<span class="special">...&gt;</span>         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span> <span class="special">\</span>
1494<span class="special">...&gt;</span>       <span class="special">&gt;</span> <span class="special">\</span>
1495<span class="special">...&gt;</span>     <span class="special">&gt;,</span> <span class="special">\</span>
1496<span class="special">...&gt;</span>     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">sum_vector</span><span class="special">&gt;&gt;</span> <span class="special">\</span>
1497<span class="special">...&gt;</span> <span class="special">&gt;;</span>
1498</pre>
1499<p>
1500            <a class="link" href="getting_started_with_boost_metap.html#getting_started_13">copy-paste friendly version</a>
1501          </p>
1502<p>
1503            Here are the formatted versions of <code class="computeroutput"><span class="identifier">exp_parser9</span></code>
1504            and <code class="computeroutput"><span class="identifier">exp_parser10</span></code> side-by-side:
1505          </p>
1506<pre class="programlisting"><span class="comment">//            exp_parser9                                       exp_parser10</span>
1507
1508<span class="identifier">build_parser</span><span class="special">&lt;</span>                                       <span class="identifier">build_parser</span><span class="special">&lt;</span>
1509  <span class="identifier">transform</span><span class="special">&lt;</span>                                          <span class="identifier">transform</span><span class="special">&lt;</span>
1510    <span class="identifier">sequence</span><span class="special">&lt;</span>                                           <span class="identifier">sequence</span><span class="special">&lt;</span>
1511      <span class="identifier">int_token</span><span class="special">,</span>                                          <span class="identifier">int_token</span><span class="special">,</span>
1512
1513
1514      <span class="identifier">transform</span><span class="special">&lt;</span>                                          <span class="identifier">foldl</span><span class="special">&lt;</span>
1515        <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;,</span>          <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
1516        <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
1517          <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
1518            <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span>
1519            <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>                            <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
1520            <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>                   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
1521          <span class="special">&gt;</span>
1522        <span class="special">&gt;::</span><span class="identifier">type</span>
1523      <span class="special">&gt;</span>                                                   <span class="special">&gt;</span>
1524
1525
1526    <span class="special">&gt;,</span>                                                  <span class="special">&gt;,</span>
1527    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">sum_vector</span><span class="special">&gt;</span>                      <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">sum_vector</span><span class="special">&gt;</span>
1528  <span class="special">&gt;</span>                                                   <span class="special">&gt;</span>
1529<span class="special">&gt;</span>                                                   <span class="special">&gt;</span>
1530</pre>
1531<p>
1532            <a class="link" href="getting_started_with_boost_metap.html#getting_started_14">copy-paste friendly version</a>
1533          </p>
1534<p>
1535            In <code class="computeroutput"><span class="identifier">exp_parser10</span></code> the "_<a class="link" href="reference.html#repeated"><code class="computeroutput"><span class="identifier">repeated</span></code></a>
1536            and then <a class="link" href="reference.html#transform"><code class="computeroutput"><span class="identifier">transform</span></code></a>
1537            with <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span></code>_" part (the middle block
1538            of <code class="computeroutput"><span class="identifier">exp_parser9</span></code>) has been
1539            replaced by one <a class="link" href="reference.html#foldl"><code class="computeroutput"><span class="identifier">foldl</span></code></a>
1540            parser that does the same thing but without building a <code class="computeroutput"><span class="identifier">vector</span></code> in the middle. The same starting
1541            value (<code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;</span></code>)
1542            and callback function (<code class="computeroutput"><span class="identifier">sum_items</span></code>)
1543            could be used.
1544          </p>
1545<p>
1546            Here is a diagram showing how <code class="computeroutput"><span class="identifier">exp_parser10</span></code>
1547            works:
1548          </p>
1549<p>
1550            <span class="inlinemediaobject"><img src="../images/metaparse/tutorial_diag5.png" width="90%"></span>
1551          </p>
1552<p>
1553            In this case, the results of the <a class="link" href="reference.html#sequence"><code class="computeroutput"><span class="identifier">sequence</span></code></a><code class="computeroutput"><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span>
1554            <span class="identifier">int_token</span><span class="special">&gt;</span></code>
1555            parsers are passed directly to a folding algorithm without an intermediate
1556            <code class="computeroutput"><span class="identifier">vector</span></code>. Here is a diagram
1557            showing <code class="computeroutput"><span class="identifier">exp_parser9</span></code> and
1558            <code class="computeroutput"><span class="identifier">exp_parser10</span></code> side-by-side
1559            to make it easier to see the difference:
1560          </p>
1561<p>
1562            <span class="inlinemediaobject"><img src="../images/metaparse/tutorial_diag6.png" width="90%"></span>
1563          </p>
1564</div>
1565<div class="section">
1566<div class="titlepage"><div><div><h5 class="title">
1567<a name="metaparse.getting_started_with_boost_metap.5_parsing_longer_expressions.5_2_evaluating_the_parsed_expres.5_2_4_processing_the_initial_ele"></a><a class="link" href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.5_parsing_longer_expressions.5_2_evaluating_the_parsed_expres.5_2_4_processing_the_initial_ele" title="5.2.4. Processing the initial element with the folding parser combinator">5.2.4.
1568          Processing the initial element with the folding parser combinator</a>
1569</h5></div></div></div>
1570<div class="note"><table border="0" summary="Note">
1571<tr>
1572<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
1573<th align="left">Note</th>
1574</tr>
1575<tr><td align="left" valign="top"><p>
1576              Note that you can find everything that has been included and defined
1577              so far <a class="link" href="getting_started_with_boost_metap.html#before_5_2_4">here</a>.
1578            </p></td></tr>
1579</table></div>
1580<p>
1581            This solution can still be improved. The <a class="link" href="reference.html#foldl"><code class="computeroutput"><span class="identifier">foldl</span></code></a> summarising the <code class="computeroutput"><span class="special">+</span> <span class="special">&lt;</span><span class="identifier">number</span><span class="special">&gt;</span></code>
1582            elements starts from <code class="computeroutput"><span class="number">0</span></code> and
1583            once this is done, we add the value of the first <code class="computeroutput"><span class="special">&lt;</span><span class="identifier">number</span><span class="special">&gt;</span></code>
1584            of the input to it in the first iteration. It would be more straightforward
1585            if <a class="link" href="reference.html#foldl"><code class="computeroutput"><span class="identifier">foldl</span></code></a>
1586            could use the value of the first <code class="computeroutput"><span class="special">&lt;</span><span class="identifier">number</span><span class="special">&gt;</span></code>
1587            as the initial value of the "<span class="emphasis"><em>sum we have so far</em></span>".
1588            Metaparse provides <a class="link" href="reference.html#foldl_start_with_parser"><code class="computeroutput"><span class="identifier">foldl_start_with_parser</span></code></a> for
1589            this:
1590          </p>
1591<pre class="programlisting"><span class="special">&gt;</span> <span class="special">#</span><span class="identifier">include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">foldl_start_with_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
1592</pre>
1593<p>
1594            <a class="link" href="reference.html#foldl_start_with_parser"><code class="computeroutput"><span class="identifier">foldl_start_with_parser</span></code></a>
1595            is almost the same as <a class="link" href="reference.html#foldl"><code class="computeroutput"><span class="identifier">foldl</span></code></a>.
1596            The difference is that instead of taking a starting <span class="emphasis"><em>value</em></span>
1597            for the sum it takes a <span class="emphasis"><em>parser</em></span>. First it parses the
1598            input with this parser and uses the value it returns as the starting
1599            value. Here is how we can implement our parser using it:
1600          </p>
1601<pre class="programlisting"><span class="special">&gt;</span> <span class="keyword">using</span> <span class="identifier">exp_parser11</span> <span class="special">=</span> <span class="special">\</span>
1602<span class="special">...&gt;</span> <span class="identifier">build_parser</span><span class="special">&lt;</span> <span class="special">\</span>
1603<span class="special">...&gt;</span>   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span> <span class="special">\</span>
1604<span class="special">...&gt;</span>     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span> <span class="comment">/* apply this parser repeatedly */</span> <span class="special">\</span>
1605<span class="special">...&gt;</span>     <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* use this parser to get the initial value */</span> <span class="special">\</span>
1606<span class="special">...&gt;</span>     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span> <span class="comment">/* use this function to add a new value to the summary */</span> <span class="special">\</span>
1607<span class="special">...&gt;</span>   <span class="special">&gt;</span> <span class="special">\</span>
1608<span class="special">...&gt;</span> <span class="special">&gt;;</span>
1609</pre>
1610<p>
1611            <a class="link" href="getting_started_with_boost_metap.html#getting_started_15">copy-paste friendly version</a>
1612          </p>
1613<p>
1614            This version of <code class="computeroutput"><span class="identifier">exp_parser</span></code>
1615            uses <a class="link" href="reference.html#foldl_start_with_parser"><code class="computeroutput"><span class="identifier">foldl_start_with_parser</span></code></a>.
1616            This implementation is more compact than the earlier versions. There
1617            is no <a class="link" href="reference.html#sequence"><code class="computeroutput"><span class="identifier">sequence</span></code></a>
1618            element in this: the first <code class="computeroutput"><span class="special">&lt;</span><span class="identifier">number</span><span class="special">&gt;</span></code>
1619            is parsed by <code class="computeroutput"><span class="identifier">int_token</span></code>
1620            and its value is used as the initial value for the summary. Let's try
1621            it out:
1622          </p>
1623<pre class="programlisting"><span class="special">&gt;</span> <span class="identifier">exp_parser11</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 + 3 + 4"</span><span class="special">)&gt;::</span><span class="identifier">type</span>
1624<span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">10</span><span class="special">&gt;</span>
1625</pre>
1626<p>
1627            It returns the same result as the earlier version but works differently.
1628            Here is a diagram showing how this implementation works:
1629          </p>
1630<p>
1631            <span class="inlinemediaobject"><img src="../images/metaparse/tutorial_diag7.png" width="90%"></span>
1632          </p>
1633</div>
1634</div>
1635</div>
1636<div class="section">
1637<div class="titlepage"><div><div><h3 class="title">
1638<a name="metaparse.getting_started_with_boost_metap.6_adding_support_for_other_opera"></a><a class="link" href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.6_adding_support_for_other_opera" title="6. Adding support for other operators">6.
1639      Adding support for other operators</a>
1640</h3></div></div></div>
1641<div class="toc"><dl class="toc">
1642<dt><span class="section"><a href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.6_adding_support_for_other_opera.6_1_parsing_expressions_containi">6.1.
1643        Parsing expressions containing <code class="computeroutput"><span class="special">-</span></code>
1644        operators</a></span></dt>
1645<dt><span class="section"><a href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.6_adding_support_for_other_opera.6_2_evaluating_expressions_conta">6.2.
1646        Evaluating expressions containing <code class="computeroutput"><span class="special">-</span></code>
1647        operators</a></span></dt>
1648</dl></div>
1649<div class="note"><table border="0" summary="Note">
1650<tr>
1651<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
1652<th align="left">Note</th>
1653</tr>
1654<tr><td align="left" valign="top"><p>
1655          Note that you can find everything that has been included and defined so
1656          far <a class="link" href="getting_started_with_boost_metap.html#before_6">here</a>.
1657        </p></td></tr>
1658</table></div>
1659<p>
1660        Our parsers now support expressions adding numbers together. In this section
1661        we will add support for the <code class="computeroutput"><span class="special">-</span></code>
1662        operator, so expressions like <code class="computeroutput"><span class="number">1</span> <span class="special">+</span> <span class="number">2</span> <span class="special">-</span>
1663        <span class="number">3</span></code> can be evaluated.
1664      </p>
1665<div class="section">
1666<div class="titlepage"><div><div><h4 class="title">
1667<a name="metaparse.getting_started_with_boost_metap.6_adding_support_for_other_opera.6_1_parsing_expressions_containi"></a><a class="link" href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.6_adding_support_for_other_opera.6_1_parsing_expressions_containi" title="6.1. Parsing expressions containing - operators">6.1.
1668        Parsing expressions containing <code class="computeroutput"><span class="special">-</span></code>
1669        operators</a>
1670</h4></div></div></div>
1671<div class="note"><table border="0" summary="Note">
1672<tr>
1673<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
1674<th align="left">Note</th>
1675</tr>
1676<tr><td align="left" valign="top"><p>
1677            Note that you can find everything that has been included and defined
1678            so far <a class="link" href="getting_started_with_boost_metap.html#before_6_1">here</a>.
1679          </p></td></tr>
1680</table></div>
1681<p>
1682          Currently we use the <code class="computeroutput"><span class="identifier">plus_token</span></code>
1683          for parsing "the" operator, which has to be <code class="computeroutput"><span class="special">+</span></code>.
1684          We can define a new token for parsing the <code class="computeroutput"><span class="special">-</span></code>
1685          symbol:
1686        </p>
1687<pre class="programlisting"><span class="special">&gt;</span> <span class="keyword">using</span> <span class="identifier">minus_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'-'</span><span class="special">&gt;&gt;;</span>
1688</pre>
1689<p>
1690          We need to build a parser that accepts either a <code class="computeroutput"><span class="special">+</span></code>
1691          or a <code class="computeroutput"><span class="special">-</span></code> symbol. This can be
1692          implemented using <a class="link" href="reference.html#one_of"><code class="computeroutput"><span class="identifier">one_of</span></code></a>:
1693        </p>
1694<pre class="programlisting"><span class="special">&gt;</span> <span class="special">#</span><span class="identifier">include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">one_of</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
1695</pre>
1696<p>
1697          <a class="link" href="reference.html#one_of"><code class="computeroutput"><span class="identifier">one_of</span></code></a><code class="computeroutput"><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;</span></code> is a parser which accepts either a
1698          <code class="computeroutput"><span class="special">+</span></code> (using <code class="computeroutput"><span class="identifier">plus_token</span></code>)
1699          or a <code class="computeroutput"><span class="special">-</span></code> (using <code class="computeroutput"><span class="identifier">minus_token</span></code>) symbol. The result of parsing
1700          is the result of the parser that succeeded.
1701        </p>
1702<div class="note"><table border="0" summary="Note">
1703<tr>
1704<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
1705<th align="left">Note</th>
1706</tr>
1707<tr><td align="left" valign="top"><p>
1708            You can give any parser to <a class="link" href="reference.html#one_of"><code class="computeroutput"><span class="identifier">one_of</span></code></a>,
1709            therefore it is possible that more than one of them can parse the input.
1710            In those cases the order matters: <a class="link" href="reference.html#one_of"><code class="computeroutput"><span class="identifier">one_of</span></code></a> tries parsing the input
1711            with the parsers from left to right and the first one that succeeds,
1712            wins.
1713          </p></td></tr>
1714</table></div>
1715<p>
1716          Using this, we can make our parser accept subtractions as well:
1717        </p>
1718<pre class="programlisting"><span class="special">&gt;</span> <span class="keyword">using</span> <span class="identifier">exp_parser12</span> <span class="special">=</span> <span class="special">\</span>
1719<span class="special">...&gt;</span> <span class="identifier">build_parser</span><span class="special">&lt;</span> <span class="special">\</span>
1720<span class="special">...&gt;</span>   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span> <span class="special">\</span>
1721<span class="special">...&gt;</span>     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span> <span class="special">\</span>
1722<span class="special">...&gt;</span>     <span class="identifier">int_token</span><span class="special">,</span> <span class="special">\</span>
1723<span class="special">...&gt;</span>     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span> <span class="special">\</span>
1724<span class="special">...&gt;</span>   <span class="special">&gt;</span> <span class="special">\</span>
1725<span class="special">...&gt;</span> <span class="special">&gt;;</span>
1726</pre>
1727<p>
1728          <a class="link" href="getting_started_with_boost_metap.html#getting_started_16">copy-paste friendly version</a>
1729        </p>
1730<p>
1731          It uses <a class="link" href="reference.html#one_of"><code class="computeroutput"><span class="identifier">one_of</span></code></a><code class="computeroutput"><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;</span></code> as the separator for the numbers. Let's
1732          try it out:
1733        </p>
1734<pre class="programlisting"><span class="special">&gt;</span> <span class="identifier">exp_parser12</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 - 3"</span><span class="special">)&gt;::</span><span class="identifier">type</span>
1735<span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">6</span><span class="special">&gt;</span>
1736</pre>
1737<p>
1738          The result is not correct. The reason for this is that <code class="computeroutput"><span class="identifier">sum_items</span></code>,
1739          the function we summarise with ignores which operator was used and assumes
1740          that it is always <code class="computeroutput"><span class="special">+</span></code>.
1741        </p>
1742</div>
1743<div class="section">
1744<div class="titlepage"><div><div><h4 class="title">
1745<a name="metaparse.getting_started_with_boost_metap.6_adding_support_for_other_opera.6_2_evaluating_expressions_conta"></a><a class="link" href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.6_adding_support_for_other_opera.6_2_evaluating_expressions_conta" title="6.2. Evaluating expressions containing - operators">6.2.
1746        Evaluating expressions containing <code class="computeroutput"><span class="special">-</span></code>
1747        operators</a>
1748</h4></div></div></div>
1749<div class="note"><table border="0" summary="Note">
1750<tr>
1751<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
1752<th align="left">Note</th>
1753</tr>
1754<tr><td align="left" valign="top"><p>
1755            Note that you can find everything that has been included and defined
1756            so far <a class="link" href="getting_started_with_boost_metap.html#before_6_2">here</a>.
1757          </p></td></tr>
1758</table></div>
1759<p>
1760          To fix the evaluation of expressions containing subtractions, we need to
1761          fix the function we use for summarising. We need to write a version that
1762          takes the operator being used into account.
1763        </p>
1764<p>
1765          First of all we will need the <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">minus</span></code>
1766          <a class="link" href="reference.html#metafunction">metafunction</a> for implementing subtraction:
1767        </p>
1768<pre class="programlisting"><span class="special">&gt;</span> <span class="special">#</span><span class="identifier">include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">minus</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
1769</pre>
1770<p>
1771          Let's write a helper metafunction that takes three arguments: the left
1772          operand, the operator and the right operand:
1773        </p>
1774<pre class="programlisting"><span class="special">&gt;</span> <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">char</span> <span class="identifier">Op</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">;</span>
1775<span class="special">&gt;</span> <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'+'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
1776<span class="special">&gt;</span> <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'-'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">minus</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
1777</pre>
1778<p>
1779          <a class="link" href="getting_started_with_boost_metap.html#getting_started_17">copy-paste friendly version</a>
1780        </p>
1781<p>
1782          The first command declares the <code class="computeroutput"><span class="identifier">eval_binary_op</span></code>
1783          metafunction. The first and third arguments are the left and right operands
1784          and the second argument is the operator.
1785        </p>
1786<div class="note"><table border="0" summary="Note">
1787<tr>
1788<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
1789<th align="left">Note</th>
1790</tr>
1791<tr><td align="left" valign="top"><p>
1792            Note that it does not satisfy the expectations of a <a class="link" href="reference.html#metafunction">template
1793            metafunction</a> since it takes the operator as a <code class="computeroutput"><span class="keyword">char</span></code>
1794            and not as a <code class="computeroutput"><span class="keyword">class</span></code> (or
1795            <code class="computeroutput"><span class="keyword">typename</span></code>) argument. For
1796            simplicity, we will still call it a metafunction.
1797          </p></td></tr>
1798</table></div>
1799<p>
1800          The second and third commands define the operation for the cases when the
1801          operator is <code class="computeroutput"><span class="special">+</span></code> and <code class="computeroutput"><span class="special">-</span></code>. When the <code class="computeroutput"><span class="identifier">eval_binary_op</span></code>
1802          metafunction is called, the C++ compiler chooses one of the definitions
1803          based on the operator. If you have functional programming experience this
1804          approach (pattern matching) might be familiar to you. Let's try <code class="computeroutput"><span class="identifier">eval_binary_op</span></code> out:
1805        </p>
1806<pre class="programlisting"><span class="special">&gt;</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">11</span><span class="special">&gt;,</span> <span class="char">'+'</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">2</span><span class="special">&gt;&gt;::</span><span class="identifier">type</span>
1807<span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">13</span><span class="special">&gt;</span>
1808<span class="special">&gt;</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">13</span><span class="special">&gt;,</span> <span class="char">'-'</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">2</span><span class="special">&gt;&gt;::</span><span class="identifier">type</span>
1809<span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">11</span><span class="special">&gt;</span>
1810</pre>
1811<p>
1812          <a class="link" href="getting_started_with_boost_metap.html#getting_started_18">copy-paste friendly version</a>
1813        </p>
1814<p>
1815          You might also try to use it with an operator it does not expect (yet).
1816          For example <code class="computeroutput"><span class="char">'*'</span></code>. You will see
1817          the C++ compiler complaining about that the requested version of the <code class="computeroutput"><span class="identifier">eval_binary_op</span></code> template has not been
1818          defined. This solution can be extended and support for the <code class="computeroutput"><span class="char">'*'</span></code> operator can always be added later.
1819        </p>
1820<p>
1821          Let's write the <a class="link" href="reference.html#metafunction">metafunction</a> we can
1822          use from the folding parser to evaluate the expressions using <code class="computeroutput"><span class="special">+</span></code> and <code class="computeroutput"><span class="special">-</span></code>
1823          operators. This takes two arguments:
1824        </p>
1825<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
1826<li class="listitem">
1827              The partial result we have evaluated so far. (This used to be the summary
1828              we have evaluated so far, but we are making it a more general evaluation
1829              now). This is the left operand, a number.
1830            </li>
1831<li class="listitem">
1832              The result of parsing <code class="computeroutput"><span class="special">(+|-)</span>
1833              <span class="special">&lt;</span><span class="identifier">number</span><span class="special">&gt;</span></code>. This a <code class="computeroutput"><span class="identifier">vector</span></code>
1834              containing two elements: a character representing the operator (<code class="computeroutput"><span class="special">+</span></code> or <code class="computeroutput"><span class="special">-</span></code>)
1835              and the value of the <code class="computeroutput"><span class="special">&lt;</span><span class="identifier">number</span><span class="special">&gt;</span></code>.
1836              The number is the right operand.
1837            </li>
1838</ul></div>
1839<p>
1840          Let's write the <a class="link" href="reference.html#metafunction">metafunction</a> <code class="computeroutput"><span class="identifier">binary_op</span></code> that takes these arguments
1841          and calls <code class="computeroutput"><span class="identifier">eval_binary_op</span></code>:
1842        </p>
1843<pre class="programlisting"><span class="special">&gt;</span> <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">S</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Item</span><span class="special">&gt;</span> <span class="special">\</span>
1844<span class="special">...&gt;</span> <span class="keyword">struct</span> <span class="identifier">binary_op</span> <span class="special">:</span> <span class="special">\</span>
1845<span class="special">...&gt;</span>   <span class="identifier">eval_binary_op</span><span class="special">&lt;</span> <span class="special">\</span>
1846<span class="special">...&gt;</span>     <span class="identifier">S</span><span class="special">,</span> <span class="special">\</span>
1847<span class="special">...&gt;</span>     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">::</span><span class="identifier">value</span><span class="special">,</span> <span class="special">\</span>
1848<span class="special">...&gt;</span>     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">\</span>
1849<span class="special">...&gt;</span>   <span class="special">&gt;</span> <span class="special">\</span>
1850<span class="special">...&gt;</span>   <span class="special">{};</span>
1851</pre>
1852<p>
1853          <a class="link" href="getting_started_with_boost_metap.html#getting_started_19">copy-paste friendly version</a>
1854        </p>
1855<p>
1856          This <a class="link" href="reference.html#metafunction">metafunction</a> takes the operator
1857          (the first element) and the right operand (the second element) from <code class="computeroutput"><span class="identifier">Item</span></code>. The operator is a class representing
1858          a character, such as <code class="computeroutput"><span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">char_</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;</span></code>.
1859          To get the character value out of it, one has to access its <code class="computeroutput"><span class="special">::</span><span class="identifier">value</span></code>.
1860          For example <code class="computeroutput"><span class="identifier">mpl_</span><span class="special">::</span><span class="keyword">char</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;::</span><span class="identifier">value</span></code>
1861          is <code class="computeroutput"><span class="char">'+'</span></code>. Since <code class="computeroutput"><span class="identifier">eval_binary_op</span></code>
1862          takes this character value as its second argument, we had to pass <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">::</span><span class="identifier">value</span></code>
1863          to it. Let's try it out:
1864        </p>
1865<pre class="programlisting"><span class="special">&gt;</span> <span class="identifier">binary_op</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">11</span><span class="special">&gt;,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">char_</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">2</span><span class="special">&gt;&gt;&gt;::</span><span class="identifier">type</span>
1866<span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">13</span><span class="special">&gt;</span>
1867</pre>
1868<p>
1869          We passed it a number (<code class="computeroutput"><span class="number">11</span></code>)
1870          and a <code class="computeroutput"><span class="identifier">vector</span></code> of a character
1871          (<code class="computeroutput"><span class="special">+</span></code>) and another number (<code class="computeroutput"><span class="number">2</span></code>). It added the two numbers as expected.
1872          Let's use this function as the third argument of <a class="link" href="reference.html#foldl_start_with_parser"><code class="computeroutput"><span class="identifier">foldl_start_with_parser</span></code></a>:
1873        </p>
1874<pre class="programlisting"><span class="special">&gt;</span> <span class="keyword">using</span> <span class="identifier">exp_parser13</span> <span class="special">=</span> <span class="special">\</span>
1875<span class="special">...&gt;</span> <span class="identifier">build_parser</span><span class="special">&lt;</span> <span class="special">\</span>
1876<span class="special">...&gt;</span>   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span> <span class="special">\</span>
1877<span class="special">...&gt;</span>     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span> <span class="special">\</span>
1878<span class="special">...&gt;</span>     <span class="identifier">int_token</span><span class="special">,</span> <span class="special">\</span>
1879<span class="special">...&gt;</span>     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span> <span class="special">\</span>
1880<span class="special">...&gt;</span>   <span class="special">&gt;</span> <span class="special">\</span>
1881<span class="special">...&gt;</span> <span class="special">&gt;;</span>
1882</pre>
1883<p>
1884          <a class="link" href="getting_started_with_boost_metap.html#getting_started_20">copy-paste friendly version</a>
1885        </p>
1886<p>
1887          It uses <code class="computeroutput"><span class="identifier">binary_op</span></code> instead
1888          of <code class="computeroutput"><span class="identifier">sum_items</span></code>. Let's try
1889          it out:
1890        </p>
1891<pre class="programlisting"><span class="special">&gt;</span> <span class="identifier">exp_parser13</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 - 3"</span><span class="special">)&gt;::</span><span class="identifier">type</span>
1892<span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;</span>
1893</pre>
1894<p>
1895          It returns the correct result.
1896        </p>
1897</div>
1898</div>
1899<div class="section">
1900<div class="titlepage"><div><div><h3 class="title">
1901<a name="metaparse.getting_started_with_boost_metap.7_dealing_with_precedence"></a><a class="link" href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.7_dealing_with_precedence" title="7. Dealing with precedence">7.
1902      Dealing with precedence</a>
1903</h3></div></div></div>
1904<div class="toc"><dl class="toc">
1905<dt><span class="section"><a href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.7_dealing_with_precedence.7_1_adding_support_for_the_opera">7.1.
1906        Adding support for the <code class="computeroutput"><span class="special">*</span></code> operator</a></span></dt>
1907<dt><span class="section"><a href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.7_dealing_with_precedence.7_2_adding_support_for_precedenc">7.2.
1908        Adding support for precedence of operators</a></span></dt>
1909</dl></div>
1910<div class="note"><table border="0" summary="Note">
1911<tr>
1912<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
1913<th align="left">Note</th>
1914</tr>
1915<tr><td align="left" valign="top"><p>
1916          Note that you can find everything that has been included and defined so
1917          far <a class="link" href="getting_started_with_boost_metap.html#before_7">here</a>.
1918        </p></td></tr>
1919</table></div>
1920<p>
1921        We support addition and subtraction. Let's support multiplication as well.
1922      </p>
1923<div class="section">
1924<div class="titlepage"><div><div><h4 class="title">
1925<a name="metaparse.getting_started_with_boost_metap.7_dealing_with_precedence.7_1_adding_support_for_the_opera"></a><a class="link" href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.7_dealing_with_precedence.7_1_adding_support_for_the_opera" title="7.1. Adding support for the * operator">7.1.
1926        Adding support for the <code class="computeroutput"><span class="special">*</span></code> operator</a>
1927</h4></div></div></div>
1928<div class="note"><table border="0" summary="Note">
1929<tr>
1930<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
1931<th align="left">Note</th>
1932</tr>
1933<tr><td align="left" valign="top"><p>
1934            Note that you can find everything that has been included and defined
1935            so far <a class="link" href="getting_started_with_boost_metap.html#before_7_1">here</a>.
1936          </p></td></tr>
1937</table></div>
1938<p>
1939          We can extend the solution we have built for addition and subtraction.
1940          To do that, we need to add support for multiplication to <code class="computeroutput"><span class="identifier">eval_binary_op</span></code>:
1941        </p>
1942<pre class="programlisting"><span class="special">&gt;</span> <span class="special">#</span><span class="identifier">include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">times</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
1943<span class="special">&gt;</span> <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'*'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">times</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
1944</pre>
1945<p>
1946          <a class="link" href="getting_started_with_boost_metap.html#getting_started_21">copy-paste friendly version</a>
1947        </p>
1948<p>
1949          We had to include <code class="computeroutput"><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">times</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span></code> to get the <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">times</span></code>
1950          <a class="link" href="reference.html#metafunction">metafunction</a> and then we could extend
1951          <code class="computeroutput"><span class="identifier">eval_binary_op</span></code> to support
1952          the <code class="computeroutput"><span class="special">*</span></code> operator as well. We
1953          can try it out:
1954        </p>
1955<pre class="programlisting"><span class="special">&gt;</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">3</span><span class="special">&gt;,</span> <span class="char">'*'</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">4</span><span class="special">&gt;&gt;::</span><span class="identifier">type</span>
1956<span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">12</span><span class="special">&gt;</span>
1957</pre>
1958<p>
1959          This works as expected. Let's create a token for parsing the <code class="computeroutput"><span class="special">*</span></code> symbol:
1960        </p>
1961<pre class="programlisting"><span class="special">&gt;</span> <span class="keyword">using</span> <span class="identifier">times_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'*'</span><span class="special">&gt;&gt;;</span>
1962</pre>
1963<p>
1964          Now we can extend our parser to accept the <code class="computeroutput"><span class="special">*</span></code>
1965          symbol as an operator:
1966        </p>
1967<pre class="programlisting"><span class="special">&gt;</span> <span class="keyword">using</span> <span class="identifier">exp_parser14</span> <span class="special">=</span> <span class="special">\</span>
1968<span class="special">...&gt;</span> <span class="identifier">build_parser</span><span class="special">&lt;</span> <span class="special">\</span>
1969<span class="special">...&gt;</span>   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span> <span class="special">\</span>
1970<span class="special">...&gt;</span>     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">,</span> <span class="identifier">times_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span> <span class="special">\</span>
1971<span class="special">...&gt;</span>     <span class="identifier">int_token</span><span class="special">,</span> <span class="special">\</span>
1972<span class="special">...&gt;</span>     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span> <span class="special">\</span>
1973<span class="special">...&gt;</span>   <span class="special">&gt;</span> <span class="special">\</span>
1974<span class="special">...&gt;</span> <span class="special">&gt;;</span>
1975</pre>
1976<p>
1977          <a class="link" href="getting_started_with_boost_metap.html#getting_started_22">copy-paste friendly version</a>
1978        </p>
1979<p>
1980          This version accepts either a <code class="computeroutput"><span class="special">+</span></code>,
1981          a <code class="computeroutput"><span class="special">-</span></code> or a <code class="computeroutput"><span class="special">*</span></code>
1982          symbol as the operator. Let's try this out:
1983        </p>
1984<pre class="programlisting"><span class="special">&gt;</span> <span class="identifier">exp_parser14</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"2 * 3"</span><span class="special">)&gt;::</span><span class="identifier">type</span>
1985<span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">6</span><span class="special">&gt;</span>
1986</pre>
1987<p>
1988          This works as expected. Let's try another, slightly more complicated expression:
1989        </p>
1990<pre class="programlisting"><span class="special">&gt;</span> <span class="identifier">exp_parser14</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 * 3"</span><span class="special">)&gt;::</span><span class="identifier">type</span>
1991<span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">9</span><span class="special">&gt;</span>
1992</pre>
1993<p>
1994          This returns a wrong result. The value of this expression should be <code class="computeroutput"><span class="number">7</span></code>, not <code class="computeroutput"><span class="number">9</span></code>.
1995          The problem with this is that our current implementation does not take
1996          operator precedence into account. It treats this expression as <code class="computeroutput"><span class="special">(</span><span class="number">1</span> <span class="special">+</span>
1997          <span class="number">2</span><span class="special">)</span> <span class="special">*</span> <span class="number">3</span></code> while
1998          we expect it to be <code class="computeroutput"><span class="number">1</span> <span class="special">+</span>
1999          <span class="special">(</span><span class="number">2</span> <span class="special">*</span> <span class="number">3</span><span class="special">)</span></code>
2000          since addition has higher precedence than multiplication.
2001        </p>
2002</div>
2003<div class="section">
2004<div class="titlepage"><div><div><h4 class="title">
2005<a name="metaparse.getting_started_with_boost_metap.7_dealing_with_precedence.7_2_adding_support_for_precedenc"></a><a class="link" href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.7_dealing_with_precedence.7_2_adding_support_for_precedenc" title="7.2. Adding support for precedence of operators">7.2.
2006        Adding support for precedence of operators</a>
2007</h4></div></div></div>
2008<div class="note"><table border="0" summary="Note">
2009<tr>
2010<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
2011<th align="left">Note</th>
2012</tr>
2013<tr><td align="left" valign="top"><p>
2014            Note that you can find everything that has been included and defined
2015            so far <a class="link" href="getting_started_with_boost_metap.html#before_7_2">here</a>.
2016          </p></td></tr>
2017</table></div>
2018<p>
2019          Let's make it possible for different operators to have different precedence.
2020          To do this, we define a new parser for parsing expressions containing only
2021          <code class="computeroutput"><span class="special">*</span></code> operators (that is the operator
2022          with the lowest precedence):
2023        </p>
2024<pre class="programlisting"><span class="special">&gt;</span> <span class="keyword">using</span> <span class="identifier">mult_exp1</span> <span class="special">=</span> <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;&gt;;</span>
2025</pre>
2026<p>
2027          <code class="computeroutput"><span class="identifier">mult_exp1</span></code> can parse expressions
2028          containing only <code class="computeroutput"><span class="special">*</span></code> operator.
2029          For example <code class="computeroutput"><span class="number">3</span> <span class="special">*</span>
2030          <span class="number">2</span></code> or <code class="computeroutput"><span class="number">6</span>
2031          <span class="special">*</span> <span class="number">7</span> <span class="special">*</span> <span class="number">8</span></code>. Now
2032          we can create a parser supporting only the <code class="computeroutput"><span class="special">+</span></code>
2033          and <code class="computeroutput"><span class="special">-</span></code> operators but instead
2034          of separating <span class="emphasis"><em>numbers</em></span> with these operators we will
2035          separate <span class="emphasis"><em>expressions containing only <code class="computeroutput"><span class="special">*</span></code>
2036          operators</em></span>. This means that the expression <code class="computeroutput"><span class="number">1</span>
2037          <span class="special">*</span> <span class="number">2</span> <span class="special">+</span> <span class="number">3</span> <span class="special">*</span>
2038          <span class="number">4</span></code> is interpreted as the expressions
2039          <code class="computeroutput"><span class="number">1</span> <span class="special">*</span>
2040          <span class="number">2</span></code> and <code class="computeroutput"><span class="number">3</span>
2041          <span class="special">*</span> <span class="number">4</span></code>
2042          separated by a <code class="computeroutput"><span class="special">+</span></code> operator.
2043          A number (eg. <code class="computeroutput"><span class="number">13</span></code>) is the special
2044          case of an <span class="emphasis"><em>expression containing only <code class="computeroutput"><span class="special">*</span></code>
2045          operators</em></span>.
2046        </p>
2047<p>
2048          Here is the parser implementing this:
2049        </p>
2050<pre class="programlisting"><span class="special">&gt;</span> <span class="keyword">using</span> <span class="identifier">exp_parser15</span> <span class="special">=</span> <span class="special">\</span>
2051<span class="special">...&gt;</span> <span class="identifier">build_parser</span><span class="special">&lt;</span> <span class="special">\</span>
2052<span class="special">...&gt;</span>   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span> <span class="special">\</span>
2053<span class="special">...&gt;</span>     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp1</span><span class="special">&gt;,</span> <span class="special">\</span>
2054<span class="special">...&gt;</span>     <span class="identifier">mult_exp1</span><span class="special">,</span> <span class="special">\</span>
2055<span class="special">...&gt;</span>     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span> <span class="special">\</span>
2056<span class="special">...&gt;</span>   <span class="special">&gt;</span> <span class="special">\</span>
2057<span class="special">...&gt;</span> <span class="special">&gt;;</span>
2058</pre>
2059<p>
2060          <a class="link" href="getting_started_with_boost_metap.html#getting_started_23">copy-paste friendly version</a>
2061        </p>
2062<p>
2063          Note that this is almost the same as <code class="computeroutput"><span class="identifier">exp_parser13</span></code>.
2064          The only difference is that it uses <code class="computeroutput"><span class="identifier">mult_exp1</span></code>
2065          everywhere, where <code class="computeroutput"><span class="identifier">exp_parser13</span></code>
2066          was using <code class="computeroutput"><span class="identifier">int_token</span></code>. Let's
2067          try it out:
2068        </p>
2069<pre class="programlisting"><span class="special">&gt;</span> <span class="identifier">exp_parser15</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 * 3"</span><span class="special">)&gt;::</span><span class="identifier">type</span>
2070<span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">7</span><span class="special">&gt;</span>
2071</pre>
2072<p>
2073          This takes the precedence rules into account. The following diagram shows
2074          how it works:
2075        </p>
2076<p>
2077          <span class="inlinemediaobject"><img src="../images/metaparse/tutorial_diag8.png" width="80%"></span>
2078        </p>
2079<p>
2080          Subexpressions using <code class="computeroutput"><span class="special">*</span></code> operators
2081          only are evaluated (by <code class="computeroutput"><span class="identifier">mult_exp1</span></code>)
2082          and treated as single units while interpreting expressions using <code class="computeroutput"><span class="special">+</span></code> and <code class="computeroutput"><span class="special">-</span></code>
2083          operators. Numbers not surrounded by <code class="computeroutput"><span class="special">*</span></code>
2084          operators are treated also as operators using <code class="computeroutput"><span class="special">*</span></code>
2085          only (containing no operations but a number).
2086        </p>
2087<p>
2088          If you need more layers (eg. introducing the <code class="computeroutput"><span class="special">^</span></code>
2089          operator) you can extend this solution with further layers. The order of
2090          the layers determine the precedence of the operators.
2091        </p>
2092</div>
2093</div>
2094<div class="section">
2095<div class="titlepage"><div><div><h3 class="title">
2096<a name="metaparse.getting_started_with_boost_metap.8_dealing_with_associativity"></a><a class="link" href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.8_dealing_with_associativity" title="8. Dealing with associativity">8.
2097      Dealing with associativity</a>
2098</h3></div></div></div>
2099<div class="toc"><dl class="toc">
2100<dt><span class="section"><a href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.8_dealing_with_associativity.8_1_understanding_the_current_im">8.1.
2101        Understanding the current implementation</a></span></dt>
2102<dt><span class="section"><a href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.8_dealing_with_associativity.8_2_folding_in_reverse_order">8.2.
2103        Folding in reverse order</a></span></dt>
2104</dl></div>
2105<div class="note"><table border="0" summary="Note">
2106<tr>
2107<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
2108<th align="left">Note</th>
2109</tr>
2110<tr><td align="left" valign="top"><p>
2111          Note that you can find everything that has been included and defined so
2112          far <a class="link" href="getting_started_with_boost_metap.html#before_8">here</a>.
2113        </p></td></tr>
2114</table></div>
2115<p>
2116        Let's add division to our calculator language. Since it has the same precedence
2117        as multiplication, it should be added to that layer:
2118      </p>
2119<pre class="programlisting"><span class="special">&gt;</span> <span class="special">#</span><span class="identifier">include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">divides</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
2120<span class="special">&gt;</span> <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'/'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">divides</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
2121<span class="special">&gt;</span> <span class="keyword">using</span> <span class="identifier">divides_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'/'</span><span class="special">&gt;&gt;;</span>
2122<span class="special">&gt;</span> <span class="keyword">using</span> <span class="identifier">mult_exp2</span> <span class="special">=</span> <span class="special">\</span>
2123<span class="special">...&gt;</span> <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span> <span class="special">\</span>
2124<span class="special">...&gt;</span>   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span> <span class="special">\</span>
2125<span class="special">...&gt;</span>   <span class="identifier">int_token</span><span class="special">,</span> <span class="special">\</span>
2126<span class="special">...&gt;</span>   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span> <span class="special">\</span>
2127<span class="special">...&gt;</span> <span class="special">&gt;;</span>
2128<span class="special">&gt;</span> <span class="keyword">using</span> <span class="identifier">exp_parser16</span> <span class="special">=</span> <span class="special">\</span>
2129<span class="special">...&gt;</span> <span class="identifier">build_parser</span><span class="special">&lt;</span> <span class="special">\</span>
2130<span class="special">...&gt;</span>   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span> <span class="special">\</span>
2131<span class="special">...&gt;</span>     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp2</span><span class="special">&gt;,</span> <span class="special">\</span>
2132<span class="special">...&gt;</span>     <span class="identifier">mult_exp2</span><span class="special">,</span> <span class="special">\</span>
2133<span class="special">...&gt;</span>     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span> <span class="special">\</span>
2134<span class="special">...&gt;</span>   <span class="special">&gt;</span> <span class="special">\</span>
2135<span class="special">...&gt;</span> <span class="special">&gt;;</span>
2136</pre>
2137<p>
2138        <a class="link" href="getting_started_with_boost_metap.html#getting_started_24">copy-paste friendly version</a>
2139      </p>
2140<p>
2141        We have to include <code class="computeroutput"><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">divides</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span></code>
2142        to get a <a class="link" href="reference.html#metafunction">metafunction</a> for doing a division.
2143        We need to extend the <code class="computeroutput"><span class="identifier">eval_binary_op</span></code>
2144        <a class="link" href="reference.html#metafunction">metafunction</a> to support division as well.
2145        We had to introduce a new token, <code class="computeroutput"><span class="identifier">divides_token</span></code>
2146        that can parse the <code class="computeroutput"><span class="special">/</span></code> symbol.
2147      </p>
2148<p>
2149        We have extended <code class="computeroutput"><span class="identifier">mult_exp1</span></code>
2150        to accept either a <code class="computeroutput"><span class="identifier">times_token</span></code>
2151        or a <code class="computeroutput"><span class="identifier">divides_token</span></code> as the
2152        operator. This extended parser is called <code class="computeroutput"><span class="identifier">mult_exp2</span></code>.
2153      </p>
2154<p>
2155        We have written a new parser, <code class="computeroutput"><span class="identifier">exp_parser16</span></code>
2156        which is the same as <code class="computeroutput"><span class="identifier">exp_parser15</span></code>
2157        but uses <code class="computeroutput"><span class="identifier">mult_exp2</span></code> instead
2158        of <code class="computeroutput"><span class="identifier">mult_exp1</span></code>. This can parse
2159        expressions using division as well (and this new operator has the right precedence).
2160        Let's try it out:
2161      </p>
2162<pre class="programlisting"><span class="special">&gt;</span> <span class="identifier">exp_parser16</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"8 / 4"</span><span class="special">)&gt;::</span><span class="identifier">type</span>
2163<span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">2</span><span class="special">&gt;</span>
2164</pre>
2165<p>
2166        This works as expected. But what should be the value of <code class="computeroutput"><span class="number">8</span>
2167        <span class="special">/</span> <span class="number">4</span> <span class="special">/</span> <span class="number">2</span></code>? The answer
2168        can be either <code class="computeroutput"><span class="number">1</span></code> or <code class="computeroutput"><span class="number">4</span></code> depending on the associativity of the division
2169        operator. If it is left associative, then this expressions is interpreted
2170        as <code class="computeroutput"><span class="special">(</span><span class="number">8</span>
2171        <span class="special">/</span> <span class="number">4</span><span class="special">)</span> <span class="special">/</span> <span class="number">2</span></code>
2172        and the result is <code class="computeroutput"><span class="number">1</span></code>. If it is
2173        right associative, this expression is interpreted as <code class="computeroutput"><span class="number">8</span>
2174        <span class="special">/</span> <span class="special">(</span><span class="number">4</span> <span class="special">/</span> <span class="number">2</span><span class="special">)</span></code> and the result is <code class="computeroutput"><span class="number">4</span></code>.
2175      </p>
2176<p>
2177        Try to guess which result our current implementation gives before trying
2178        it out. Once you have verified the current behaviour, continue reading.
2179      </p>
2180<div class="section">
2181<div class="titlepage"><div><div><h4 class="title">
2182<a name="metaparse.getting_started_with_boost_metap.8_dealing_with_associativity.8_1_understanding_the_current_im"></a><a class="link" href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.8_dealing_with_associativity.8_1_understanding_the_current_im" title="8.1. Understanding the current implementation">8.1.
2183        Understanding the current implementation</a>
2184</h4></div></div></div>
2185<div class="note"><table border="0" summary="Note">
2186<tr>
2187<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
2188<th align="left">Note</th>
2189</tr>
2190<tr><td align="left" valign="top"><p>
2191            Note that you can find everything that has been included and defined
2192            so far <a class="link" href="getting_started_with_boost_metap.html#before_8_1">here</a>.
2193          </p></td></tr>
2194</table></div>
2195<p>
2196          Here is a diagram showing how our current parser processes the expression
2197          <code class="computeroutput"><span class="number">8</span> <span class="special">/</span>
2198          <span class="number">4</span> <span class="special">/</span> <span class="number">2</span></code>:
2199        </p>
2200<p>
2201          <span class="inlinemediaobject"><img src="../images/metaparse/tutorial_diag8.png" width="70%"></span>
2202        </p>
2203<p>
2204          It takes the first number, <code class="computeroutput"><span class="number">8</span></code>,
2205          divides it by the second one, <code class="computeroutput"><span class="number">4</span></code>
2206          and then it divides the result with the third one, <code class="computeroutput"><span class="number">2</span></code>.
2207          This means, that in our current implementation, division is left associative:
2208          <code class="computeroutput"><span class="number">8</span> <span class="special">/</span>
2209          <span class="number">4</span> <span class="special">/</span> <span class="number">2</span></code> means <code class="computeroutput"><span class="special">(</span><span class="number">8</span> <span class="special">/</span> <span class="number">4</span><span class="special">)</span> <span class="special">/</span> <span class="number">2</span></code>.
2210        </p>
2211<p>
2212          Another thing to note is that the initial value is <code class="computeroutput"><span class="number">8</span></code>
2213          and the list of values <a class="link" href="reference.html#foldl"><code class="computeroutput"><span class="identifier">foldl</span></code></a>
2214          iterates over is "<code class="computeroutput"><span class="special">/</span> <span class="number">4</span></code>", "<code class="computeroutput"><span class="special">/</span>
2215          <span class="number">2</span></code>".
2216        </p>
2217</div>
2218<div class="section">
2219<div class="titlepage"><div><div><h4 class="title">
2220<a name="metaparse.getting_started_with_boost_metap.8_dealing_with_associativity.8_2_folding_in_reverse_order"></a><a class="link" href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.8_dealing_with_associativity.8_2_folding_in_reverse_order" title="8.2. Folding in reverse order">8.2.
2221        Folding in reverse order</a>
2222</h4></div></div></div>
2223<div class="note"><table border="0" summary="Note">
2224<tr>
2225<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
2226<th align="left">Note</th>
2227</tr>
2228<tr><td align="left" valign="top"><p>
2229            Note that you can find everything that has been included and defined
2230            so far <a class="link" href="getting_started_with_boost_metap.html#before_8_2">here</a>.
2231          </p></td></tr>
2232</table></div>
2233<p>
2234          <a class="link" href="reference.html#foldl"><code class="computeroutput"><span class="identifier">foldl</span></code></a>
2235          applies a parser repeatedly and iterates over the parsing results from
2236          <span class="emphasis"><em>left</em></span> to right. (This is where the <code class="computeroutput"><span class="identifier">l</span></code>
2237          in the name comes from). Metaparse provides another folding parser combinator,
2238          <a class="link" href="reference.html#foldr"><code class="computeroutput"><span class="identifier">foldr</span></code></a>.
2239          It applies a parser on the input as well but it iterates from <span class="emphasis"><em>right</em></span>
2240          to left over the results.
2241        </p>
2242<p>
2243          Similarly to <a class="link" href="reference.html#foldl_start_with_parser"><code class="computeroutput"><span class="identifier">foldl_start_with_parser</span></code></a>,
2244          Metaparse provides <a class="link" href="reference.html#foldr_start_with_parser"><code class="computeroutput"><span class="identifier">foldr_start_with_parser</span></code></a> as well.
2245          A major difference between the two (<a class="link" href="reference.html#foldl_start_with_parser"><code class="computeroutput"><span class="identifier">foldl_start_with_parser</span></code></a> and <a class="link" href="reference.html#foldr_start_with_parser"><code class="computeroutput"><span class="identifier">foldr_start_with</span><span class="special">-</span><span class="identifier">parser</span></code></a>)
2246          solutions is that while <a class="link" href="reference.html#foldl_start_with_parser"><code class="computeroutput"><span class="identifier">foldl_start_with_parser</span></code></a> treats
2247          the <span class="emphasis"><em>first</em></span> number as a special one, <a class="link" href="reference.html#foldr_start_with_parser"><code class="computeroutput"><span class="identifier">foldr_start_with_parser</span></code></a> treats
2248          the <span class="emphasis"><em>last</em></span> number as a special one. This might sound
2249          strange, but think about it: if you want to summarise the elements from
2250          right to left, your starting value should be the last element, not the
2251          first one, as the first one is the one you visit last.
2252        </p>
2253<p>
2254          Due to the above difference <a class="link" href="reference.html#foldr_start_with_parser"><code class="computeroutput"><span class="identifier">foldr_start_with_parser</span></code></a> is not
2255          a drop-in replacement of <a class="link" href="reference.html#foldl_start_with_parser"><code class="computeroutput"><span class="identifier">foldl_start_with_parser</span></code></a>. While
2256          the list of values <a class="link" href="reference.html#foldl"><code class="computeroutput"><span class="identifier">foldl</span></code></a>
2257          was iterating over is "<code class="computeroutput"><span class="number">8</span></code>",
2258          "<code class="computeroutput"><span class="special">/</span> <span class="number">4</span></code>",
2259          "<code class="computeroutput"><span class="special">/</span> <span class="number">2</span></code>",
2260          the list of values <a class="link" href="reference.html#foldr"><code class="computeroutput"><span class="identifier">foldlr</span></code></a>
2261          has to iterate over is "<code class="computeroutput"><span class="number">2</span></code>",
2262          "<code class="computeroutput"><span class="number">4</span> <span class="special">/</span></code>",
2263          "<code class="computeroutput"><span class="number">8</span> <span class="special">/</span></code>".
2264        </p>
2265<p>
2266          This means that the function we use to <span class="emphasis"><em>"add"</em></span>
2267          a new value to the already evaluated part of the expression (this has been
2268          <code class="computeroutput"><span class="identifier">binary_op</span></code> so far) has to
2269          be prepared for taking the next operator and operand in a reverse order
2270          (eg. by taking "<code class="computeroutput"><span class="number">4</span> <span class="special">/</span></code>"
2271          instead of "<code class="computeroutput"><span class="special">/</span> <span class="number">4</span></code>").
2272          We write another <a class="link" href="reference.html#metafunction">metafunction</a> for this
2273          purpose:
2274        </p>
2275<pre class="programlisting"><span class="special">&gt;</span> <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">S</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Item</span><span class="special">&gt;</span> <span class="special">\</span>
2276<span class="special">...&gt;</span> <span class="keyword">struct</span> <span class="identifier">reverse_binary_op</span> <span class="special">:</span> <span class="special">\</span>
2277<span class="special">...&gt;</span>   <span class="identifier">eval_binary_op</span><span class="special">&lt;</span> <span class="special">\</span>
2278<span class="special">...&gt;</span>     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">,</span> <span class="special">\</span>
2279<span class="special">...&gt;</span>     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">::</span><span class="identifier">value</span><span class="special">,</span> <span class="special">\</span>
2280<span class="special">...&gt;</span>     <span class="identifier">S</span> <span class="special">\</span>
2281<span class="special">...&gt;</span>   <span class="special">&gt;</span> <span class="special">\</span>
2282<span class="special">...&gt;</span>   <span class="special">{};</span>
2283</pre>
2284<p>
2285          <a class="link" href="getting_started_with_boost_metap.html#getting_started_25">copy-paste friendly version</a>
2286        </p>
2287<p>
2288          There are multiple differences between <code class="computeroutput"><span class="identifier">binary_op</span></code>
2289          and <code class="computeroutput"><span class="identifier">reverse_binary_op</span></code>:
2290        </p>
2291<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
2292<li class="listitem">
2293              The <code class="computeroutput"><span class="identifier">Item</span></code> argument,
2294              which is a <code class="computeroutput"><span class="identifier">vector</span></code> is
2295              expected to be <code class="computeroutput"><span class="special">[</span><span class="keyword">operator</span><span class="special">,</span> <span class="identifier">operand</span><span class="special">]</span></code> in <code class="computeroutput"><span class="identifier">binary_op</span></code>
2296              and <code class="computeroutput"><span class="special">[</span><span class="identifier">operand</span><span class="special">,</span> <span class="keyword">operator</span><span class="special">]</span></code> in <code class="computeroutput"><span class="identifier">reverse_binary_op</span></code>.
2297            </li>
2298<li class="listitem">
2299              Both versions use <code class="computeroutput"><span class="identifier">eval_binary_op</span></code>
2300              to evaluate the subexpression, but <code class="computeroutput"><span class="identifier">binary_op</span></code>
2301              treats <code class="computeroutput"><span class="identifier">S</span></code>, the value
2302              representing the already evaluated part of the expression as the left
2303              operand, while <code class="computeroutput"><span class="identifier">reverse_binary_op</span></code>
2304              treats it as the right operand. This is because in the first case we
2305              are going from left to right while in the second case we are going
2306              from right to left.
2307            </li>
2308</ul></div>
2309<p>
2310          We need to include <a class="link" href="reference.html#foldr_start_with_parser"><code class="computeroutput"><span class="identifier">foldr_start_with_parser</span></code></a>:
2311        </p>
2312<pre class="programlisting"><span class="special">&gt;</span> <span class="special">#</span><span class="identifier">include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">foldr_start_with_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
2313</pre>
2314<p>
2315          We can rewrite <code class="computeroutput"><span class="identifier">mult_exp</span></code>
2316          using <a class="link" href="reference.html#foldr_start_with_parser"><code class="computeroutput"><span class="identifier">foldr_start_with_parser</span></code></a>:
2317        </p>
2318<pre class="programlisting"><span class="special">&gt;</span> <span class="keyword">using</span> <span class="identifier">mult_exp3</span> <span class="special">=</span> <span class="special">\</span>
2319<span class="special">...&gt;</span> <span class="identifier">foldr_start_with_parser</span><span class="special">&lt;</span> <span class="special">\</span>
2320<span class="special">...&gt;</span>   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">&gt;&gt;,</span> <span class="comment">/* The parser applied repeatedly */</span> <span class="special">\</span>
2321<span class="special">...&gt;</span>   <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* The parser parsing the last number */</span> <span class="special">\</span>
2322<span class="special">...&gt;</span>   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">reverse_binary_op</span><span class="special">&gt;</span> <span class="comment">/* The function called for every result */</span> <span class="special">\</span>
2323<span class="special">...&gt;</span>                                         <span class="comment">/* of applying the above parser */</span> <span class="special">\</span>
2324<span class="special">...&gt;</span> <span class="special">&gt;;</span>
2325</pre>
2326<p>
2327          <a class="link" href="getting_started_with_boost_metap.html#getting_started_26">copy-paste friendly version</a>
2328        </p>
2329<p>
2330          It is almost the same as <code class="computeroutput"><span class="identifier">mult_exp2</span></code>,
2331          but ...
2332        </p>
2333<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
2334<li class="listitem">
2335              ... the parser applied repeatedly parses <code class="computeroutput"><span class="special">&lt;</span><span class="identifier">number</span><span class="special">&gt;</span>
2336              <span class="special">&lt;</span><span class="keyword">operator</span><span class="special">&gt;</span></code> elements instead of <code class="computeroutput"><span class="special">&lt;</span><span class="keyword">operator</span><span class="special">&gt;</span> <span class="special">&lt;</span><span class="identifier">number</span><span class="special">&gt;</span></code>
2337              elements (what <code class="computeroutput"><span class="identifier">mult_exp2</span></code>
2338              did).
2339            </li>
2340<li class="listitem">
2341              ... this version uses <code class="computeroutput"><span class="identifier">reverse_binary_op</span></code>
2342              instead of <code class="computeroutput"><span class="identifier">binary_op</span></code>
2343              as the function that is called for every result of applying the above
2344              parser.
2345            </li>
2346</ul></div>
2347<p>
2348          We can create a new version of <code class="computeroutput"><span class="identifier">exp_parser</span></code>
2349          that uses <code class="computeroutput"><span class="identifier">mult_exp3</span></code> instead
2350          of <code class="computeroutput"><span class="identifier">mult_exp2</span></code>:
2351        </p>
2352<pre class="programlisting"><span class="special">&gt;</span> <span class="keyword">using</span> <span class="identifier">exp_parser17</span> <span class="special">=</span> <span class="special">\</span>
2353<span class="special">...&gt;</span> <span class="identifier">build_parser</span><span class="special">&lt;</span> <span class="special">\</span>
2354<span class="special">...&gt;</span>   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span> <span class="special">\</span>
2355<span class="special">...&gt;</span>     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp3</span><span class="special">&gt;,</span> <span class="special">\</span>
2356<span class="special">...&gt;</span>     <span class="identifier">mult_exp3</span><span class="special">,</span> <span class="special">\</span>
2357<span class="special">...&gt;</span>     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span> <span class="special">\</span>
2358<span class="special">...&gt;</span>   <span class="special">&gt;</span> <span class="special">\</span>
2359<span class="special">...&gt;</span> <span class="special">&gt;;</span>
2360</pre>
2361<p>
2362          <a class="link" href="getting_started_with_boost_metap.html#getting_started_27">copy-paste friendly version</a>
2363        </p>
2364<p>
2365          The only difference between <code class="computeroutput"><span class="identifier">exp_parser17</span></code>
2366          and the previous version, <code class="computeroutput"><span class="identifier">exp_parser16</span></code>
2367          is that it uses the updated version of <code class="computeroutput"><span class="identifier">mult_exp</span></code>.
2368          Let's try this parser out:
2369        </p>
2370<pre class="programlisting"><span class="special">&gt;</span> <span class="identifier">exp_parser17</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"8 / 4 / 2"</span><span class="special">)&gt;::</span><span class="identifier">type</span>
2371<span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">4</span><span class="special">&gt;</span>
2372</pre>
2373<p>
2374          This version of the parser gives <span class="emphasis"><em>the other</em></span> possible
2375          result. The one you get when division is right associative, which means
2376          that the above expression is evaluated as <code class="computeroutput"><span class="number">8</span>
2377          <span class="special">/</span> <span class="special">(</span><span class="number">4</span> <span class="special">/</span> <span class="number">2</span><span class="special">)</span></code>. Here is a diagram showing how the <a class="link" href="reference.html#foldr_start_with_parser"><code class="computeroutput"><span class="identifier">foldr_start_with_parser</span></code></a>-based
2378          solution works:
2379        </p>
2380<p>
2381          <span class="inlinemediaobject"><img src="../images/metaparse/tutorial_diag10.png" width="70%"></span>
2382        </p>
2383<p>
2384          To make it easier to compare the two solutions, here is a diagram showing
2385          the two approaches side-by-side:
2386        </p>
2387<p>
2388          <span class="inlinemediaobject"><img src="../images/metaparse/tutorial_diag11.png" width="100%"></span>
2389        </p>
2390<p>
2391          As we have seen, the associativity of the operators can be controlled by
2392          choosing between folding solutions. The folding solutions going from left
2393          to right implement left associativity, while the solutions going from right
2394          to left implement right associativity.
2395        </p>
2396<div class="note"><table border="0" summary="Note">
2397<tr>
2398<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
2399<th align="left">Note</th>
2400</tr>
2401<tr><td align="left" valign="top"><p>
2402            Note that folding solutions going from left to right is implemented in
2403            a more efficient way than folding from right to left. Therefore when
2404            both solutions can be used you should prefer folding from left to right.
2405          </p></td></tr>
2406</table></div>
2407</div>
2408</div>
2409<div class="section">
2410<div class="titlepage"><div><div><h3 class="title">
2411<a name="metaparse.getting_started_with_boost_metap.9_dealing_with_unary_operators"></a><a class="link" href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.9_dealing_with_unary_operators" title="9. Dealing with unary operators">9.
2412      Dealing with unary operators</a>
2413</h3></div></div></div>
2414<div class="note"><table border="0" summary="Note">
2415<tr>
2416<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
2417<th align="left">Note</th>
2418</tr>
2419<tr><td align="left" valign="top"><p>
2420          Note that you can find everything that has been included and defined so
2421          far <a class="link" href="getting_started_with_boost_metap.html#before_9">here</a>.
2422        </p></td></tr>
2423</table></div>
2424<p>
2425        Our calculator language provides no direct support for negative numbers.
2426        To get a negative number, we need to do a subtraction. For example to get
2427        the number <code class="computeroutput"><span class="special">-</span><span class="number">13</span></code>
2428        we need to evaluate the expression <code class="computeroutput"><span class="number">0</span>
2429        <span class="special">-</span> <span class="number">13</span></code>.
2430      </p>
2431<p>
2432        We will implement <code class="computeroutput"><span class="special">-</span></code> as a unary
2433        operator. Therefore the expression <code class="computeroutput"><span class="special">-</span><span class="number">13</span></code> won't be a <span class="emphasis"><em>negative number</em></span>.
2434        It will be the unary <code class="computeroutput"><span class="special">-</span></code> operator
2435        applied on the number <code class="computeroutput"><span class="number">13</span></code>.
2436      </p>
2437<p>
2438        Since <code class="computeroutput"><span class="special">-</span></code> is an operator, it might
2439        be used multiple times. So the expression <code class="computeroutput"><span class="special">---</span><span class="number">13</span></code> is also valid and gives the same result
2440        as <code class="computeroutput"><span class="special">-</span><span class="number">13</span></code>.
2441        This means that any number of <code class="computeroutput"><span class="special">-</span></code>
2442        symbols are valid before a number.
2443      </p>
2444<p>
2445        Our parser can be extended to support the unary <code class="computeroutput"><span class="special">-</span></code>
2446        operator by adding a new layer to the list of precedence layers. This should
2447        have the lowest precedence, which means that we should use this new layer
2448        where we have been using <code class="computeroutput"><span class="identifier">int_token</span></code>.
2449        Let's write a new parser:
2450      </p>
2451<pre class="programlisting"><span class="special">&gt;</span> <span class="special">#</span><span class="identifier">include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">negate</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
2452<span class="special">&gt;</span> <span class="keyword">using</span> <span class="identifier">unary_exp1</span> <span class="special">=</span> <span class="special">\</span>
2453<span class="special">...&gt;</span> <span class="identifier">foldr_start_with_parser</span><span class="special">&lt;</span> <span class="special">\</span>
2454<span class="special">...&gt;</span>   <span class="identifier">minus_token</span><span class="special">,</span> <span class="special">\</span>
2455<span class="special">...&gt;</span>   <span class="identifier">int_token</span><span class="special">,</span> <span class="special">\</span>
2456<span class="special">...&gt;</span>   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">negate</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">&gt;&gt;::</span><span class="identifier">type</span> <span class="special">\</span>
2457<span class="special">...&gt;</span> <span class="special">&gt;;</span>
2458</pre>
2459<p>
2460        <a class="link" href="getting_started_with_boost_metap.html#getting_started_28">copy-paste friendly version</a>
2461      </p>
2462<p>
2463        We had to include <code class="computeroutput"><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">negate</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span></code>
2464        to get a <a class="link" href="reference.html#metafunction">metafunction</a> we can negate a
2465        value with.
2466      </p>
2467<p>
2468        <code class="computeroutput"><span class="identifier">unary_exp1</span></code> is implemented
2469        with right to left folding: it starts from the number (parsed by <code class="computeroutput"><span class="identifier">int_token</span></code>) and processes the <code class="computeroutput"><span class="special">-</span></code> symbols one by one. The function to be called
2470        for each <code class="computeroutput"><span class="special">-</span></code> symbol is a lambda
2471        expression that negates the number. So the number is negated for every <code class="computeroutput"><span class="special">-</span></code> symbol.
2472      </p>
2473<p>
2474        We can implement a new version of <code class="computeroutput"><span class="identifier">mult_exp</span></code>
2475        and <code class="computeroutput"><span class="identifier">exp_parser</span></code>. They are
2476        the same as <code class="computeroutput"><span class="identifier">mult_exp2</span></code> and
2477        <code class="computeroutput"><span class="identifier">exp_parser16</span></code>. The only difference
2478        is that they (directly only <code class="computeroutput"><span class="identifier">exp_parser18</span></code>)
2479        use <code class="computeroutput"><span class="identifier">unary_exp1</span></code> instead of
2480        <code class="computeroutput"><span class="identifier">int_token</span></code>.
2481      </p>
2482<pre class="programlisting"><span class="special">&gt;</span> <span class="keyword">using</span> <span class="identifier">mult_exp4</span> <span class="special">=</span> <span class="special">\</span>
2483<span class="special">...&gt;</span> <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span> <span class="special">\</span>
2484<span class="special">...&gt;</span>   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">&gt;,</span> <span class="identifier">unary_exp1</span><span class="special">&gt;,</span> <span class="special">\</span>
2485<span class="special">...&gt;</span>   <span class="identifier">unary_exp1</span><span class="special">,</span> <span class="special">\</span>
2486<span class="special">...&gt;</span>   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span> <span class="special">\</span>
2487<span class="special">...&gt;</span> <span class="special">&gt;;</span>
2488<span class="special">&gt;</span> <span class="keyword">using</span> <span class="identifier">exp_parser18</span> <span class="special">=</span> <span class="special">\</span>
2489<span class="special">...&gt;</span> <span class="identifier">build_parser</span><span class="special">&lt;</span> <span class="special">\</span>
2490<span class="special">...&gt;</span>   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span> <span class="special">\</span>
2491<span class="special">...&gt;</span>     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp4</span><span class="special">&gt;,</span> <span class="special">\</span>
2492<span class="special">...&gt;</span>     <span class="identifier">mult_exp4</span><span class="special">,</span> <span class="special">\</span>
2493<span class="special">...&gt;</span>     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span> <span class="special">\</span>
2494<span class="special">...&gt;</span>   <span class="special">&gt;</span> <span class="special">\</span>
2495<span class="special">...&gt;</span> <span class="special">&gt;;</span>
2496</pre>
2497<p>
2498        <a class="link" href="getting_started_with_boost_metap.html#getting_started_29">copy-paste friendly version</a>
2499      </p>
2500<p>
2501        Let's try these new parsers out:
2502      </p>
2503<pre class="programlisting"><span class="special">&gt;</span> <span class="identifier">exp_parser18</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"---13"</span><span class="special">)&gt;::</span><span class="identifier">type</span>
2504<span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="special">-</span><span class="number">13</span><span class="special">&gt;</span>
2505<span class="special">&gt;</span> <span class="identifier">exp_parser18</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"13"</span><span class="special">)&gt;::</span><span class="identifier">type</span>
2506<span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">13</span><span class="special">&gt;</span>
2507</pre>
2508<p>
2509        <a class="link" href="getting_started_with_boost_metap.html#getting_started_30">copy-paste friendly version</a>
2510      </p>
2511<p>
2512        It can deal with negative numbers correctly.
2513      </p>
2514</div>
2515<div class="section">
2516<div class="titlepage"><div><div><h3 class="title">
2517<a name="metaparse.getting_started_with_boost_metap.10_dealing_with_parens"></a><a class="link" href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.10_dealing_with_parens" title="10. Dealing with parens">10.
2518      Dealing with parens</a>
2519</h3></div></div></div>
2520<p>
2521        Our parsers already support the precedence of the different operators. Let's
2522        add support for parens as well, so users can override the precedence rules
2523        when they need to.
2524      </p>
2525<p>
2526        We can add a new parser for parsing (and evaluating) expressions in parens.
2527        First we introduce tokens for parsing the <code class="computeroutput"><span class="special">(</span></code>
2528        and <code class="computeroutput"><span class="special">)</span></code> symbols:
2529      </p>
2530<pre class="programlisting"><span class="special">&gt;</span> <span class="keyword">using</span> <span class="identifier">lparen_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'('</span><span class="special">&gt;&gt;;</span>
2531<span class="special">&gt;</span> <span class="keyword">using</span> <span class="identifier">rparen_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">')'</span><span class="special">&gt;&gt;;</span>
2532</pre>
2533<p>
2534        <a class="link" href="getting_started_with_boost_metap.html#getting_started_31">copy-paste friendly version</a>
2535      </p>
2536<p>
2537        A paren can contain an expression with any operators in it, so we add a parser
2538        for parsing (and evaluating) an expression containing operators of the highest
2539        precedence:
2540      </p>
2541<pre class="programlisting"><span class="special">&gt;</span> <span class="keyword">using</span> <span class="identifier">plus_exp1</span> <span class="special">=</span> <span class="special">\</span>
2542<span class="special">...&gt;</span> <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span> <span class="special">\</span>
2543<span class="special">...&gt;</span>   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp4</span><span class="special">&gt;,</span> <span class="special">\</span>
2544<span class="special">...&gt;</span>   <span class="identifier">mult_exp4</span><span class="special">,</span> <span class="special">\</span>
2545<span class="special">...&gt;</span>   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span> <span class="special">\</span>
2546<span class="special">...&gt;</span> <span class="special">&gt;;</span>
2547</pre>
2548<p>
2549        <a class="link" href="getting_started_with_boost_metap.html#getting_started_32">copy-paste friendly version</a>
2550      </p>
2551<p>
2552        This was just a refactoring of our last parser for the calculator language.
2553        We can build the parser for our calculator language by using <a class="link" href="reference.html#build_parser"><code class="computeroutput"><span class="identifier">build_parser</span></code></a><code class="computeroutput"><span class="special">&lt;</span><span class="identifier">plus_exp1</span><span class="special">&gt;</span></code>
2554        now. Let's write a parser for a paren expression:
2555      </p>
2556<pre class="programlisting"><span class="special">&gt;</span> <span class="keyword">using</span> <span class="identifier">paren_exp1</span> <span class="special">=</span> <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">lparen_token</span><span class="special">,</span> <span class="identifier">plus_exp1</span><span class="special">,</span> <span class="identifier">rparen_token</span><span class="special">&gt;;</span>
2557</pre>
2558<p>
2559        This definition parses a left paren, then a complete expression followed
2560        by a right paren. The result of parsing a paren expression is a <code class="computeroutput"><span class="identifier">vector</span></code> of three elements: the <code class="computeroutput"><span class="special">(</span></code> character, the value of the expression and
2561        the <code class="computeroutput"><span class="special">)</span></code> character. We only need
2562        the value of the expression, which is the middle element. We could wrap the
2563        whole thing with a <a class="link" href="reference.html#transform"><code class="computeroutput"><span class="identifier">transform</span></code></a>
2564        that gets the middle element and throws the rest away, but we don't need
2565        to. This is such a common pattern, that Metaparse provides <a class="link" href="reference.html#middle_of"><code class="computeroutput"><span class="identifier">middle_of</span></code></a> for this:
2566      </p>
2567<pre class="programlisting"><span class="special">&gt;</span> <span class="special">#</span><span class="identifier">include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">middle_of</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
2568<span class="special">&gt;</span> <span class="keyword">using</span> <span class="identifier">paren_exp2</span> <span class="special">=</span> <span class="identifier">middle_of</span><span class="special">&lt;</span><span class="identifier">lparen_token</span><span class="special">,</span> <span class="identifier">plus_exp1</span><span class="special">,</span> <span class="identifier">rparen_token</span><span class="special">&gt;;</span>
2569</pre>
2570<p>
2571        <a class="link" href="getting_started_with_boost_metap.html#getting_started_33">copy-paste friendly version</a>
2572      </p>
2573<p>
2574        This implementation is almost the same as <code class="computeroutput"><span class="identifier">paren_exp1</span></code>.
2575        The difference is that the result of parsing will be the value of the wrapped
2576        expression (the result of the <code class="computeroutput"><span class="identifier">plus_exp1</span></code>
2577        parser).
2578      </p>
2579<p>
2580        Let's define a parser for a primary expression which is either a number or
2581        an expression in parens:
2582      </p>
2583<pre class="programlisting"><span class="special">&gt;</span> <span class="keyword">using</span> <span class="identifier">primary_exp1</span> <span class="special">=</span> <span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">paren_exp2</span><span class="special">&gt;;</span>
2584</pre>
2585<p>
2586        This parser accepts either a number using <code class="computeroutput"><span class="identifier">int_token</span></code>
2587        or an expression in parens using <code class="computeroutput"><span class="identifier">paren_exp1</span></code>.
2588      </p>
2589<p>
2590        Everywhere, where one can write a number (parsed by <code class="computeroutput"><span class="identifier">int_token</span></code>),
2591        one can write a complete expression in parens as well. Our current parser
2592        implementation parses <code class="computeroutput"><span class="identifier">int_token</span></code>s
2593        in <code class="computeroutput"><span class="identifier">unary_exp</span></code>, therefore we
2594        need to change that to use <code class="computeroutput"><span class="identifier">primary_exp</span></code>
2595        instead of <code class="computeroutput"><span class="identifier">int_token</span></code>.
2596      </p>
2597<p>
2598        There is a problem here: this makes the definitions of our parsers <span class="emphasis"><em>recursive</em></span>.
2599        Think about it:
2600      </p>
2601<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
2602<li class="listitem">
2603            <code class="computeroutput"><span class="identifier">plus_exp</span></code> uses <code class="computeroutput"><span class="identifier">mult_exp</span></code>
2604          </li>
2605<li class="listitem">
2606            <code class="computeroutput"><span class="identifier">mult_exp</span></code> uses <code class="computeroutput"><span class="identifier">unary_exp</span></code>
2607          </li>
2608<li class="listitem">
2609            <code class="computeroutput"><span class="identifier">unary_exp</span></code> uses <code class="computeroutput"><span class="identifier">primary_exp</span></code>
2610          </li>
2611<li class="listitem">
2612            <code class="computeroutput"><span class="identifier">primary_exp</span></code> uses <code class="computeroutput"><span class="identifier">paren_exp</span></code>
2613          </li>
2614<li class="listitem">
2615            <code class="computeroutput"><span class="identifier">paren_exp</span></code> uses <code class="computeroutput"><span class="identifier">plus_exp</span></code>
2616          </li>
2617</ul></div>
2618<div class="note"><table border="0" summary="Note">
2619<tr>
2620<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
2621<th align="left">Note</th>
2622</tr>
2623<tr><td align="left" valign="top"><p>
2624          Since we are versioning the different parser implementations in Metashell
2625          (<code class="computeroutput"><span class="identifier">paren_exp1</span></code>, <code class="computeroutput"><span class="identifier">paren_exp2</span></code>, etc) you might try to define
2626          these recursive parsers and it might seem to work for the first time. In
2627          that case, when you later try creating a parser as part of a library (save
2628          your Metashell environment to a file or re-implement the important/successful
2629          elements) you face this issue.
2630        </p></td></tr>
2631</table></div>
2632<p>
2633        We have been using type aliases (<code class="computeroutput"><span class="keyword">typedef</span></code>
2634        and <code class="computeroutput"><span class="keyword">using</span></code>) for defining the
2635        parsers. We can do it as long as their definition is not recursive. We can
2636        not refer to a type alias until we have defined it and type aliases can not
2637        be forward declared, so we can't find a point in the recursive cycle where
2638        we could start defining things.
2639      </p>
2640<p>
2641        A solution for this is making one of the parsers a new class instead of a
2642        type alias. Classes can be forward declared, therefore we can declare the
2643        class, implement the rest of the parsers as they can refer to that class
2644        and then define the class at the end.
2645      </p>
2646<p>
2647        Let's make <code class="computeroutput"><span class="identifier">plus_exp</span></code> a class.
2648        So as a first step, let's forward declare it:
2649      </p>
2650<pre class="programlisting"><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">plus_exp2</span><span class="special">;</span>
2651</pre>
2652<p>
2653        Now we can write the rest of the parsers and they can refer to <code class="computeroutput"><span class="identifier">plus_exp2</span></code>:
2654      </p>
2655<pre class="programlisting"><span class="special">&gt;</span> <span class="keyword">using</span> <span class="identifier">paren_exp3</span> <span class="special">=</span> <span class="identifier">middle_of</span><span class="special">&lt;</span><span class="identifier">lparen_token</span><span class="special">,</span> <span class="identifier">plus_exp2</span><span class="special">,</span> <span class="identifier">rparen_token</span><span class="special">&gt;;</span>
2656<span class="special">&gt;</span> <span class="keyword">using</span> <span class="identifier">primary_exp2</span> <span class="special">=</span> <span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">paren_exp2</span><span class="special">&gt;;</span>
2657<span class="special">&gt;</span> <span class="keyword">using</span> <span class="identifier">unary_exp2</span> <span class="special">=</span> <span class="special">\</span>
2658<span class="special">...&gt;</span> <span class="identifier">foldr_start_with_parser</span><span class="special">&lt;</span> <span class="special">\</span>
2659<span class="special">...&gt;</span>   <span class="identifier">minus_token</span><span class="special">,</span> <span class="special">\</span>
2660<span class="special">...&gt;</span>   <span class="identifier">primary_exp2</span><span class="special">,</span> <span class="special">\</span>
2661<span class="special">...&gt;</span>   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">negate</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">&gt;&gt;::</span><span class="identifier">type</span> <span class="special">\</span>
2662<span class="special">...&gt;</span> <span class="special">&gt;;</span>
2663<span class="special">&gt;</span> <span class="keyword">using</span> <span class="identifier">mult_exp5</span> <span class="special">=</span> <span class="special">\</span>
2664<span class="special">...&gt;</span> <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span> <span class="special">\</span>
2665<span class="special">...&gt;</span>   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">&gt;,</span> <span class="identifier">unary_exp2</span><span class="special">&gt;,</span> <span class="special">\</span>
2666<span class="special">...&gt;</span>   <span class="identifier">unary_exp2</span><span class="special">,</span> <span class="special">\</span>
2667<span class="special">...&gt;</span>   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span> <span class="special">\</span>
2668<span class="special">...&gt;</span> <span class="special">&gt;;</span>
2669</pre>
2670<p>
2671        <a class="link" href="getting_started_with_boost_metap.html#getting_started_34">copy-paste friendly version</a>
2672      </p>
2673<p>
2674        There is nothing new in the definition of these parsers. They build up the
2675        hierarchy we have worked out in the earlier sections of this tutorial. The
2676        only element missing is <code class="computeroutput"><span class="identifier">plus_exp2</span></code>:
2677      </p>
2678<pre class="programlisting"><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">plus_exp2</span> <span class="special">:</span> <span class="special">\</span>
2679<span class="special">...&gt;</span> <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span> <span class="special">\</span>
2680<span class="special">...&gt;</span>   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp5</span><span class="special">&gt;,</span> <span class="special">\</span>
2681<span class="special">...&gt;</span>   <span class="identifier">mult_exp5</span><span class="special">,</span> <span class="special">\</span>
2682<span class="special">...&gt;</span>   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span> <span class="special">\</span>
2683<span class="special">...&gt;</span> <span class="special">&gt;</span> <span class="special">{};</span>
2684</pre>
2685<p>
2686        <a class="link" href="getting_started_with_boost_metap.html#getting_started_35">copy-paste friendly version</a>
2687      </p>
2688<p>
2689        This definition makes use of inheritance instead of type aliasing. Now we
2690        can write the parser for the calculator that supports parens as well:
2691      </p>
2692<pre class="programlisting"><span class="special">&gt;</span> <span class="keyword">using</span> <span class="identifier">exp_parser19</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">plus_exp2</span><span class="special">&gt;;</span>
2693</pre>
2694<p>
2695        Let's try this parser out:
2696      </p>
2697<pre class="programlisting"><span class="special">&gt;</span> <span class="identifier">exp_parser19</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"(1 + 2) * 3"</span><span class="special">)&gt;::</span><span class="identifier">type</span>
2698<span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">9</span><span class="special">&gt;</span>
2699</pre>
2700<p>
2701        Our parser accepts and can deal with parens in the expressions.
2702      </p>
2703</div>
2704<div class="section">
2705<div class="titlepage"><div><div><h3 class="title">
2706<a name="metaparse.getting_started_with_boost_metap.11_dealing_with_invalid_input"></a><a name="dealing_with_invalid_input"></a><a class="link" href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.11_dealing_with_invalid_input" title="11. Dealing with invalid input">11.
2707      Dealing with invalid input</a>
2708</h3></div></div></div>
2709<div class="toc"><dl class="toc">
2710<dt><span class="section"><a href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.11_dealing_with_invalid_input.11_1_improving_the_error_message">11.1.
2711        Improving the error messages</a></span></dt>
2712<dt><span class="section"><a href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.11_dealing_with_invalid_input.11_2_defining_custom_errors">11.2.
2713        Defining custom errors</a></span></dt>
2714<dt><span class="section"><a href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.11_dealing_with_invalid_input.11_3_missing_closing_parens">11.3.
2715        Missing closing parens</a></span></dt>
2716</dl></div>
2717<p>
2718        So far we have been focusing on parsing valid user input. However, users
2719        of our parsers will make mistakes and we should help them finding the source
2720        of the problem. And we should make this process not too painful.
2721      </p>
2722<p>
2723        The major difficulty in error reporting is that we have no direct way of
2724        showing error messages to the user. The parsers are template metaprograms.
2725        When they detect that the input is invalid, they can make the compilation
2726        fail and the compiler (running the metaprogram) display an error message.
2727        What we can do is making those error messages short and contain all information
2728        about the parsing error. We should make it easy to find this information
2729        in whatever the compiler displays.
2730      </p>
2731<p>
2732        So let's try to parse some invalid expression and let's see what happens:
2733      </p>
2734<pre class="programlisting"><span class="special">&gt;</span> <span class="identifier">exp_parser19</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"hello"</span><span class="special">)&gt;::</span><span class="identifier">type</span>
2735<span class="special">&lt;&lt;</span> <span class="identifier">compilation</span> <span class="identifier">error</span> <span class="special">&gt;&gt;</span>
2736</pre>
2737<p>
2738        You will get a lot (if you have seen error messages coming from template
2739        metaprograms you know: this is <span class="emphasis"><em>not</em></span> a lot.) of error
2740        messages. Take a closer look. It contains this:
2741      </p>
2742<pre class="programlisting"><span class="identifier">x__________________PARSING_FAILED__________________x</span><span class="special">&lt;</span>
2743  <span class="number">1</span><span class="special">,</span> <span class="number">1</span><span class="special">,</span>
2744  <span class="identifier">boost</span><span class="special">::</span><span class="identifier">metaparse</span><span class="special">::</span><span class="identifier">v1</span><span class="special">::</span><span class="identifier">error</span><span class="special">::</span><span class="identifier">literal_expected</span><span class="special">&lt;</span><span class="char">'('</span><span class="special">&gt;</span>
2745<span class="special">&gt;</span>
2746</pre>
2747<p>
2748        You can see a formatted version above. There are no line breaks in the real
2749        output. This is relatively easy to spot (thanks to the <code class="computeroutput"><span class="identifier">____________</span></code>
2750        part) and contains answers to the main questions one has when parsing fails:
2751      </p>
2752<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
2753<li class="listitem">
2754            <span class="emphasis"><em>where</em></span> is the error? It is column <code class="computeroutput"><span class="number">1</span></code>
2755            in line <code class="computeroutput"><span class="number">1</span></code> (inside <a class="link" href="reference.html#BOOST_METAPARSE_STRING"><code class="computeroutput"><span class="identifier">BOOST_METAPARSE_STRING</span></code></a>). This
2756            is the <code class="computeroutput"><span class="number">1</span><span class="special">,</span>
2757            <span class="number">1</span></code> part.
2758          </li>
2759<li class="listitem">
2760            <span class="emphasis"><em>what</em></span> is the problem? <code class="computeroutput"><span class="identifier">literal_expected</span><span class="special">&lt;</span><span class="char">'('</span><span class="special">&gt;</span></code>.
2761            This is a bit misleading, as it contains only a part of the problem.
2762            An open paren is not the only acceptable token here, a number would also
2763            be fine. This misleading error message is <span class="emphasis"><em>our</em></span> fault:
2764            <span class="emphasis"><em>we</em></span> (the parser authors) need to make the parsing
2765            errors more descriptive.
2766          </li>
2767</ul></div>
2768<div class="section">
2769<div class="titlepage"><div><div><h4 class="title">
2770<a name="metaparse.getting_started_with_boost_metap.11_dealing_with_invalid_input.11_1_improving_the_error_message"></a><a class="link" href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.11_dealing_with_invalid_input.11_1_improving_the_error_message" title="11.1. Improving the error messages">11.1.
2771        Improving the error messages</a>
2772</h4></div></div></div>
2773<p>
2774          So how can we improve the error messages? Let's look at what went wrong
2775          in the previous case:
2776        </p>
2777<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
2778<li class="listitem">
2779              The input was <code class="computeroutput"><span class="identifier">hello</span></code>.
2780            </li>
2781<li class="listitem">
2782              <code class="computeroutput"><span class="identifier">plus_exp2</span></code> tried to
2783              parse it.
2784            </li>
2785<li class="listitem">
2786              <code class="computeroutput"><span class="identifier">plus_exp2</span></code> tried to
2787              parse it using <code class="computeroutput"><span class="identifier">mult_exp5</span></code>
2788              (assuming that this is the initial <code class="computeroutput"><span class="identifier">mult_exp</span></code>
2789              in the list of <code class="computeroutput"><span class="special">+</span></code> / <code class="computeroutput"><span class="special">-</span></code> separated <code class="computeroutput"><span class="identifier">mult_exp</span></code>s).
2790            </li>
2791<li class="listitem">
2792              so <code class="computeroutput"><span class="identifier">mult_exp5</span></code> tried
2793              to parse it.
2794            </li>
2795<li class="listitem">
2796              <code class="computeroutput"><span class="identifier">mult_exp5</span></code> tried to
2797              parse it using <code class="computeroutput"><span class="identifier">unary_exp2</span></code>
2798              (assuming that this is the initial <code class="computeroutput"><span class="identifier">unary_exp</span></code>
2799              in the list of <code class="computeroutput"><span class="special">*</span></code> / <code class="computeroutput"><span class="special">/</span></code> separated <code class="computeroutput"><span class="identifier">unary_exp</span></code>s).
2800            </li>
2801<li class="listitem">
2802              so <code class="computeroutput"><span class="identifier">unary_exp2</span></code> tried
2803              to parse it.
2804            </li>
2805<li class="listitem">
2806              <code class="computeroutput"><span class="identifier">unary_exp2</span></code> parsed all
2807              of the <code class="computeroutput"><span class="special">-</span></code> symbols using
2808              <code class="computeroutput"><span class="identifier">minus_token</span></code>. There
2809              were none of them (the input started with an <code class="computeroutput"><span class="identifier">h</span></code>
2810              character).
2811            </li>
2812<li class="listitem">
2813              so <code class="computeroutput"><span class="identifier">unary_exp2</span></code> tried
2814              to parse it using <code class="computeroutput"><span class="identifier">primary_exp2</span></code>.
2815            </li>
2816<li class="listitem">
2817              <code class="computeroutput"><span class="identifier">primary_exp2</span></code> is: <a class="link" href="reference.html#one_of"><code class="computeroutput"><span class="identifier">one_of</span></code></a><code class="computeroutput"><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">paren_exp2</span><span class="special">&gt;</span></code>. It tried parsing the input with
2818              <code class="computeroutput"><span class="identifier">int_token</span></code> (which failed)
2819              and then with <code class="computeroutput"><span class="identifier">paren_exp2</span></code>
2820              (which failed as well). So <a class="link" href="reference.html#one_of"><code class="computeroutput"><span class="identifier">one_of</span></code></a>
2821              could not parse the input with any of the choices and therefore it
2822              failed as well. In such situations <code class="computeroutput"><span class="identifier">one_of</span></code>
2823              checks which parser made the most progress (consumed the most characters
2824              of the input) before failing and assumes, that that is the parser the
2825              user intended to use, thus it returns the error message coming from
2826              that parser. In this example none of the parsers could make any progress,
2827              in which case <code class="computeroutput"><span class="identifier">one_of</span></code>
2828              returns the error coming from the last parser in the list. This was
2829              <code class="computeroutput"><span class="identifier">paren_exp2</span></code>, and it
2830              expects the expression to start with an open paren. This is where the
2831              error message came from. The rest of the layers did not change or improve
2832              this error message so this was the error message displayed to the user.
2833            </li>
2834</ul></div>
2835<p>
2836          We, the parser authors know: we expect a primary expression there. When
2837          <a class="link" href="reference.html#one_of"><code class="computeroutput"><span class="identifier">one_of</span></code></a>
2838          fails, it means that none was found.
2839        </p>
2840</div>
2841<div class="section">
2842<div class="titlepage"><div><div><h4 class="title">
2843<a name="metaparse.getting_started_with_boost_metap.11_dealing_with_invalid_input.11_2_defining_custom_errors"></a><a class="link" href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.11_dealing_with_invalid_input.11_2_defining_custom_errors" title="11.2. Defining custom errors">11.2.
2844        Defining custom errors</a>
2845</h4></div></div></div>
2846<p>
2847          To be able to return custom error messages (like <code class="computeroutput"><span class="identifier">missing_primary_expression</span></code>)
2848          to the user, we need to define those error messages first. The error messages
2849          are represented by classes with some requirements:
2850        </p>
2851<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
2852<li class="listitem">
2853              It should have a static method called <code class="computeroutput"><span class="identifier">get_value</span><span class="special">()</span></code> returning a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span></code>
2854              containing the description of the error.
2855            </li>
2856<li class="listitem">
2857              It should be a <a class="link" href="reference.html#metaprogramming_value">template metaprogramming
2858              value</a>.
2859            </li>
2860</ul></div>
2861<p>
2862          These classes are called <a class="link" href="reference.html#parsing_error_message">parsing
2863          error message</a>s. To make it easy to implement such classes and to
2864          make it difficult (if not impossible) to forget to fulfill a requirement,
2865          Metaparse provides a macro for defining these classes. To get this macro,
2866          include the following header:
2867        </p>
2868<pre class="programlisting"><span class="special">&gt;</span> <span class="special">#</span><span class="identifier">include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">define_error</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
2869</pre>
2870<p>
2871          Let's define the <a class="link" href="reference.html#parsing_error_message">parsing error message</a>:
2872        </p>
2873<pre class="programlisting"><span class="special">&gt;</span> <span class="identifier">BOOST_METAPARSE_DEFINE_ERROR</span><span class="special">(</span><span class="identifier">missing_primary_expression</span><span class="special">,</span> <span class="string">"Missing primary expression"</span><span class="special">);</span>
2874</pre>
2875<p>
2876          This defines a class called <code class="computeroutput"><span class="identifier">missing_primary_expression</span></code>
2877          representing this error message. What we need to do is making our parser
2878          return this error message when <a class="link" href="reference.html#one_of"><code class="computeroutput"><span class="identifier">one_of</span></code></a>
2879          fails.
2880        </p>
2881<p>
2882          Let's define <code class="computeroutput"><span class="identifier">plus_exp</span></code> and
2883          <code class="computeroutput"><span class="identifier">paren_exp</span></code> first. Their
2884          definition does not change:
2885        </p>
2886<pre class="programlisting"><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">plus_exp3</span><span class="special">;</span>
2887<span class="special">&gt;</span> <span class="keyword">using</span> <span class="identifier">paren_exp4</span> <span class="special">=</span> <span class="identifier">middle_of</span><span class="special">&lt;</span><span class="identifier">lparen_token</span><span class="special">,</span> <span class="identifier">plus_exp3</span><span class="special">,</span> <span class="identifier">rparen_token</span><span class="special">&gt;;</span>
2888</pre>
2889<p>
2890          <a class="link" href="getting_started_with_boost_metap.html#getting_started_36">copy-paste friendly version</a>
2891        </p>
2892<p>
2893          When the input contains no number (parsed by <code class="computeroutput"><span class="identifier">int_token</span></code>)
2894          and no paren expression (parsed by <code class="computeroutput"><span class="identifier">paren_exp4</span></code>),
2895          we should return the <code class="computeroutput"><span class="identifier">missing_primary_expression</span></code>
2896          error message. We can do it by adding a third parser to <code class="computeroutput"><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">paren_exp4</span><span class="special">,</span> <span class="special">...&gt;</span></code>
2897          which always fails with this error message. Metaparse provides <a class="link" href="reference.html#fail"><code class="computeroutput"><span class="identifier">fail</span></code></a> for this:
2898        </p>
2899<pre class="programlisting"><span class="special">&gt;</span> <span class="special">#</span><span class="identifier">include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">fail</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
2900</pre>
2901<p>
2902          Now we can define the <code class="computeroutput"><span class="identifier">primary_exp</span></code>
2903          parser using it:
2904        </p>
2905<pre class="programlisting"><span class="special">&gt;</span> <span class="keyword">using</span> <span class="identifier">primary_exp3</span> <span class="special">=</span> <span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">paren_exp4</span><span class="special">,</span> <span class="identifier">fail</span><span class="special">&lt;</span><span class="identifier">missing_primary_expression</span><span class="special">&gt;&gt;;</span>
2906</pre>
2907<p>
2908          It adds <a class="link" href="reference.html#fail"><code class="computeroutput"><span class="identifier">fail</span></code></a><code class="computeroutput"><span class="special">&lt;</span><span class="identifier">missing_primary_expression</span><span class="special">&gt;</span></code> to <code class="computeroutput"><span class="identifier">one_of</span></code>
2909          as the last element. Therefore if none of the "real" cases parse
2910          the input <span class="emphasis"><em>and</em></span> none of them makes any progress before
2911          failing, the error message will be <code class="computeroutput"><span class="identifier">missing_primary_expression</span></code>.
2912        </p>
2913<p>
2914          We need to define the rest of the parsers. Their definition is the same
2915          as before:
2916        </p>
2917<pre class="programlisting"><span class="special">&gt;</span> <span class="keyword">using</span> <span class="identifier">unary_exp3</span> <span class="special">=</span> <span class="special">\</span>
2918<span class="special">...&gt;</span> <span class="identifier">foldr_start_with_parser</span><span class="special">&lt;</span> <span class="special">\</span>
2919<span class="special">...&gt;</span>   <span class="identifier">minus_token</span><span class="special">,</span> <span class="special">\</span>
2920<span class="special">...&gt;</span>   <span class="identifier">primary_exp3</span><span class="special">,</span> <span class="special">\</span>
2921<span class="special">...&gt;</span>   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">negate</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">&gt;&gt;::</span><span class="identifier">type</span> <span class="special">\</span>
2922<span class="special">...&gt;</span> <span class="special">&gt;;</span>
2923<span class="special">&gt;</span> <span class="keyword">using</span> <span class="identifier">mult_exp6</span> <span class="special">=</span> <span class="special">\</span>
2924<span class="special">...&gt;</span> <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span> <span class="special">\</span>
2925<span class="special">...&gt;</span>   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">&gt;,</span> <span class="identifier">unary_exp3</span><span class="special">&gt;,</span> <span class="special">\</span>
2926<span class="special">...&gt;</span>   <span class="identifier">unary_exp3</span><span class="special">,</span> <span class="special">\</span>
2927<span class="special">...&gt;</span>   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span> <span class="special">\</span>
2928<span class="special">...&gt;</span> <span class="special">&gt;;</span>
2929<span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">plus_exp3</span> <span class="special">:</span> <span class="special">\</span>
2930<span class="special">...&gt;</span> <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span> <span class="special">\</span>
2931<span class="special">...&gt;</span>   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp6</span><span class="special">&gt;,</span> <span class="special">\</span>
2932<span class="special">...&gt;</span>   <span class="identifier">mult_exp6</span><span class="special">,</span> <span class="special">\</span>
2933<span class="special">...&gt;</span>   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span> <span class="special">\</span>
2934<span class="special">...&gt;</span> <span class="special">&gt;</span> <span class="special">{};</span>
2935<span class="special">&gt;</span> <span class="keyword">using</span> <span class="identifier">exp_parser20</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">plus_exp3</span><span class="special">&gt;;</span>
2936</pre>
2937<p>
2938          <a class="link" href="getting_started_with_boost_metap.html#getting_started_37">copy-paste friendly version</a>
2939        </p>
2940<p>
2941          We can try to give our new parser an invalid input:
2942        </p>
2943<pre class="programlisting"><span class="special">&gt;</span> <span class="identifier">exp_parser20</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"hello"</span><span class="special">)&gt;::</span><span class="identifier">type</span>
2944<span class="special">&lt;&lt;</span> <span class="identifier">compilation</span> <span class="identifier">error</span> <span class="special">&gt;&gt;</span>
2945<span class="special">.....</span> <span class="identifier">x__________________PARSING_FAILED__________________x</span><span class="special">&lt;</span><span class="number">1</span><span class="special">,</span> <span class="number">1</span><span class="special">,</span> <span class="identifier">missing_primary_expression</span><span class="special">&gt;</span> <span class="special">....</span>
2946<span class="special">&lt;&lt;</span> <span class="identifier">compilation</span> <span class="identifier">error</span> <span class="special">&gt;&gt;</span>
2947</pre>
2948<p>
2949          The error message is now more specific to the calculator language. This
2950          covers only one case, where the error messages can be improved. Other cases
2951          (eg. missing closing parens, missing operators, etc) can be covered in
2952          a similar way.
2953        </p>
2954</div>
2955<div class="section">
2956<div class="titlepage"><div><div><h4 class="title">
2957<a name="metaparse.getting_started_with_boost_metap.11_dealing_with_invalid_input.11_3_missing_closing_parens"></a><a class="link" href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.11_dealing_with_invalid_input.11_3_missing_closing_parens" title="11.3. Missing closing parens">11.3.
2958        Missing closing parens</a>
2959</h4></div></div></div>
2960<div class="toc"><dl class="toc">
2961<dt><span class="section"><a href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.11_dealing_with_invalid_input.11_3_missing_closing_parens.11_3_1_simplifying_the_parser">11.3.1.
2962          Simplifying the parser</a></span></dt>
2963<dt><span class="section"><a href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.11_dealing_with_invalid_input.11_3_missing_closing_parens.11_3_2_using_foldl_reject_incomp">11.3.2.
2964          Using <code class="computeroutput"><span class="identifier">foldl_reject_incomplete_start_with_parser</span></code>
2965          at other places as well</a></span></dt>
2966</dl></div>
2967<p>
2968          Missing closing parens are common errors. Let's see how our parsers report
2969          them:
2970        </p>
2971<pre class="programlisting"><span class="special">&gt;</span> <span class="identifier">exp_parser20</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"(1+2"</span><span class="special">)&gt;::</span><span class="identifier">type</span>
2972<span class="special">&lt;&lt;</span> <span class="identifier">compilation</span> <span class="identifier">error</span> <span class="special">&gt;&gt;</span>
2973<span class="special">.....</span> <span class="identifier">x__________________PARSING_FAILED__________________x</span><span class="special">&lt;</span><span class="number">1</span><span class="special">,</span> <span class="number">5</span><span class="special">,</span> <span class="identifier">unpaired</span><span class="special">&lt;</span><span class="number">1</span><span class="special">,</span> <span class="number">1</span><span class="special">,</span> <span class="identifier">literal_expected</span><span class="special">&lt;</span><span class="char">')'</span><span class="special">&gt;&gt;&gt;</span> <span class="special">....</span>
2974<span class="special">&lt;&lt;</span> <span class="identifier">compilation</span> <span class="identifier">error</span> <span class="special">&gt;&gt;</span>
2975</pre>
2976<p>
2977          The parser could detect that there is a missing paren and the error report
2978          points to the open paren which is not closed. This looks great, but we
2979          are not done yet. Let's try a slightly more complex input:
2980        </p>
2981<pre class="programlisting"><span class="special">&gt;</span> <span class="identifier">exp_parser20</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"0+(1+2"</span><span class="special">)&gt;::</span><span class="identifier">type</span>
2982<span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;</span>
2983</pre>
2984<p>
2985          This is getting strange now. We parse the <code class="computeroutput"><span class="special">+</span>
2986          <span class="special">&lt;</span><span class="identifier">mult_exp</span><span class="special">&gt;</span></code> elements using <a class="link" href="reference.html#foldl_start_with_parser"><code class="computeroutput"><span class="identifier">foldl_start_with_parser</span></code></a> (see the
2987          definition of <code class="computeroutput"><span class="identifier">plus_exp3</span></code>).
2988          <a class="link" href="reference.html#foldl_start_with_parser"><code class="computeroutput"><span class="identifier">foldl_start_with_parser</span></code></a>
2989          parses the input as long as it can and stops when it fails to parse it.
2990          In the above input, it parses <code class="computeroutput"><span class="number">0</span></code>
2991          as the initial element and then it tries to parse the first <code class="computeroutput"><span class="special">+</span> <span class="special">&lt;</span><span class="identifier">mult_exp</span><span class="special">&gt;</span></code> element. But parsing the <code class="computeroutput"><span class="special">&lt;</span><span class="identifier">mult_exp</span><span class="special">&gt;</span></code> part fails because of the missing closing
2992          paren. So <a class="link" href="reference.html#foldl_start_with_parser"><code class="computeroutput"><span class="identifier">foldl_start_with_parser</span></code></a>
2993          stops and ignores this failing part of the input.
2994        </p>
2995<p>
2996          The result of the above is that we parse only the <code class="computeroutput"><span class="number">0</span></code>
2997          part of the input, ignore the "garbage" at the end and assume
2998          that the value of the expression is <code class="computeroutput"><span class="number">0</span></code>.
2999          This could be fixed by using <a class="link" href="reference.html#entire_input"><code class="computeroutput"><span class="identifier">entire_input</span></code></a>. Our parser would
3000          reject the input (because of the "garbage" at the end), but the
3001          error message would not be useful. So we take a different approach.
3002        </p>
3003<p>
3004          When <a class="link" href="reference.html#foldl_start_with_parser"><code class="computeroutput"><span class="identifier">foldl_start_with_parser</span></code></a>
3005          stops, we should check if there is an extra broken <code class="computeroutput"><span class="special">+</span>
3006          <span class="special">&lt;</span><span class="identifier">mult_exp</span><span class="special">&gt;</span></code> there or not. When there is, we should
3007          report what is wrong with that broken <code class="computeroutput"><span class="special">+</span>
3008          <span class="special">&lt;</span><span class="identifier">mult_exp</span><span class="special">&gt;</span></code> (eg. a missing closing paren). Metaparse
3009          provides <a class="link" href="reference.html#fail_at_first_char_expected"><code class="computeroutput"><span class="identifier">fail_at_first_char_expected</span></code></a>
3010          to implement such validations. <a class="link" href="reference.html#fail_at_first_char_expected"><code class="computeroutput"><span class="identifier">fail_at_first_char_expected</span></code></a><code class="computeroutput"><span class="special">&lt;</span><span class="identifier">parser</span><span class="special">&gt;</span></code> checks how <code class="computeroutput"><span class="identifier">parser</span></code>
3011          fails to parse the input: when it fails right at the first character,
3012          <a class="link" href="reference.html#fail_at_first_char_expected"><code class="computeroutput"><span class="identifier">fail_at_first_char_expected</span></code></a>
3013          assumes that there is no garbage and accepts the input. When <code class="computeroutput"><span class="identifier">parser</span></code> consumes characters from the input
3014          before failing, <a class="link" href="reference.html#fail_at_first_char_expected"><code class="computeroutput"><span class="identifier">fail_at_first_char_expected</span></code></a> assumes
3015          that there is a broken expression and propagates the error. It can be used
3016          the following way:
3017        </p>
3018<pre class="programlisting"><span class="special">&gt;</span> <span class="special">#</span><span class="identifier">include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">fail_at_first_char_expected</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3019<span class="special">&gt;</span> <span class="special">#</span><span class="identifier">include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">first_of</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3020<span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">plus_exp4</span> <span class="special">:</span> <span class="special">\</span>
3021<span class="special">...&gt;</span> <span class="identifier">first_of</span><span class="special">&lt;</span> <span class="special">\</span>
3022<span class="special">...&gt;</span>   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span> <span class="special">\</span>
3023<span class="special">...&gt;</span>     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp6</span><span class="special">&gt;,</span> <span class="special">\</span>
3024<span class="special">...&gt;</span>     <span class="identifier">mult_exp6</span><span class="special">,</span> <span class="special">\</span>
3025<span class="special">...&gt;</span>     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span> <span class="special">\</span>
3026<span class="special">...&gt;</span>   <span class="special">&gt;,</span> <span class="special">\</span>
3027<span class="special">...&gt;</span>   <span class="identifier">fail_at_first_char_expected</span><span class="special">&lt;</span> <span class="special">\</span>
3028<span class="special">...&gt;</span>     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp6</span><span class="special">&gt;</span> <span class="special">\</span>
3029<span class="special">...&gt;</span>   <span class="special">&gt;</span> <span class="special">\</span>
3030<span class="special">...&gt;</span> <span class="special">&gt;</span> <span class="special">{};</span>
3031<span class="special">&gt;</span> <span class="keyword">using</span> <span class="identifier">exp_parser21</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">plus_exp4</span><span class="special">&gt;;</span>
3032</pre>
3033<p>
3034          <a class="link" href="getting_started_with_boost_metap.html#getting_started_38">copy-paste friendly version</a>
3035        </p>
3036<p>
3037          <a class="link" href="reference.html#first_of"><code class="computeroutput"><span class="identifier">first_of</span></code></a>
3038          is similar to <a class="link" href="reference.html#middle_of"><code class="computeroutput"><span class="identifier">middle_of</span></code></a>,
3039          but keeps the result of the first element, not the middle one. We use it
3040          to keep the "real" result (the result of <a class="link" href="reference.html#foldl_start_with_parser"><code class="computeroutput"><span class="identifier">foldl_start_with_parser</span></code></a>) and to
3041          throw the dummy result coming from <a class="link" href="reference.html#fail_at_first_char_expected"><code class="computeroutput"><span class="identifier">fail_at_first_char_expected</span></code></a> away
3042          when there is no broken expression at the end. <a class="link" href="reference.html#first_of"><code class="computeroutput"><span class="identifier">first_of</span></code></a> propagates any error
3043          coming from <a class="link" href="reference.html#fail_at_first_char_expected"><code class="computeroutput"><span class="identifier">fail_at_first_char_expected</span></code></a>.
3044        </p>
3045<p>
3046          Let's try this new expression parser out with a missing closing paren:
3047        </p>
3048<pre class="programlisting"><span class="special">&gt;</span> <span class="identifier">exp_parser21</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"0+(1+2"</span><span class="special">)&gt;::</span><span class="identifier">type</span>
3049<span class="special">&lt;&lt;</span> <span class="identifier">compilation</span> <span class="identifier">error</span> <span class="special">&gt;&gt;</span>
3050<span class="special">.....</span> <span class="identifier">x__________________PARSING_FAILED__________________x</span><span class="special">&lt;</span><span class="number">1</span><span class="special">,</span> <span class="number">7</span><span class="special">,</span> <span class="identifier">unpaired</span><span class="special">&lt;</span><span class="number">1</span><span class="special">,</span> <span class="number">3</span><span class="special">,</span> <span class="identifier">literal_expected</span><span class="special">&lt;</span><span class="char">')'</span><span class="special">&gt;&gt;&gt;</span> <span class="special">....</span>
3051<span class="special">&lt;&lt;</span> <span class="identifier">compilation</span> <span class="identifier">error</span> <span class="special">&gt;&gt;</span>
3052</pre>
3053<p>
3054          This works as expected now: it tells us that there is a missing paren and
3055          it points us the open paren which is not closed.
3056        </p>
3057<div class="section">
3058<div class="titlepage"><div><div><h5 class="title">
3059<a name="metaparse.getting_started_with_boost_metap.11_dealing_with_invalid_input.11_3_missing_closing_parens.11_3_1_simplifying_the_parser"></a><a class="link" href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.11_dealing_with_invalid_input.11_3_missing_closing_parens.11_3_1_simplifying_the_parser" title="11.3.1. Simplifying the parser">11.3.1.
3060          Simplifying the parser</a>
3061</h5></div></div></div>
3062<p>
3063            Our parser provides useful error messages for missing closing parens,
3064            however, the implementation of the parser (<code class="computeroutput"><span class="identifier">plus_exp4</span></code>)
3065            is long and repetitive: it contains the parser for the repeated element
3066            (<a class="link" href="reference.html#sequence"><code class="computeroutput"><span class="identifier">sequence</span></code></a><code class="computeroutput"><span class="special">&lt;</span></code><a class="link" href="reference.html#one_of"><code class="computeroutput"><span class="identifier">one_of</span></code></a><code class="computeroutput"><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span>
3067            <span class="identifier">minus_token</span><span class="special">&gt;,</span>
3068            <span class="identifier">mult_exp6</span><span class="special">&gt;</span></code>)
3069            twice, and that is not ideal.
3070          </p>
3071<p>
3072            <code class="computeroutput"><span class="identifier">plus_exp4</span></code> uses <a class="link" href="reference.html#foldl_start_with_parser"><code class="computeroutput"><span class="identifier">foldl_start_with_parser</span></code></a>
3073            to implement repetition. Metaparse provides <a class="link" href="reference.html#foldl_reject_incomplete_start_with_parser"><code class="computeroutput"><span class="identifier">foldl_reject_incomplete_start_with_parser</span></code></a>
3074            which does the same we did with <a class="link" href="reference.html#first_of"><code class="computeroutput"><span class="identifier">first_of</span></code></a>, <a class="link" href="reference.html#foldl_start_with_parser"><code class="computeroutput"><span class="identifier">foldl_start_with_parser</span></code></a> and
3075            <a class="link" href="reference.html#fail_at_first_char_expected"><code class="computeroutput"><span class="identifier">fail_at_first_char_expected</span></code></a>
3076            together:
3077          </p>
3078<pre class="programlisting"><span class="special">&gt;</span> <span class="special">#</span><span class="identifier">include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">foldl_reject_incomplete_start_with_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3079<span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">plus_exp5</span> <span class="special">:</span> <span class="special">\</span>
3080<span class="special">...&gt;</span> <span class="identifier">foldl_reject_incomplete_start_with_parser</span><span class="special">&lt;</span> <span class="special">\</span>
3081<span class="special">...&gt;</span>   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp6</span><span class="special">&gt;,</span> <span class="special">\</span>
3082<span class="special">...&gt;</span>   <span class="identifier">mult_exp6</span><span class="special">,</span> <span class="special">\</span>
3083<span class="special">...&gt;</span>   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span> <span class="special">\</span>
3084<span class="special">...&gt;</span> <span class="special">&gt;</span> <span class="special">{};</span>
3085<span class="special">&gt;</span> <span class="keyword">using</span> <span class="identifier">exp_parser22</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">plus_exp5</span><span class="special">&gt;;</span>
3086</pre>
3087<p>
3088            <a class="link" href="getting_started_with_boost_metap.html#getting_started_39">copy-paste friendly version</a>
3089          </p>
3090<p>
3091            It parses the input using <a class="link" href="reference.html#sequence"><code class="computeroutput"><span class="identifier">sequence</span></code></a><code class="computeroutput"><span class="special">&lt;</span></code><a class="link" href="reference.html#one_of"><code class="computeroutput"><span class="identifier">one_of</span></code></a><code class="computeroutput"><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span>
3092            <span class="identifier">minus_token</span><span class="special">&gt;,</span>
3093            <span class="identifier">mult_exp6</span><span class="special">&gt;</span></code>)
3094            repeatedly. When it fails, <a class="link" href="reference.html#foldl_reject_incomplete_start_with_parser"><code class="computeroutput"><span class="identifier">foldl_reject_incomplete_start_with_parser</span></code></a>
3095            checks if it consumed any character before failing (the same as what
3096            <a class="link" href="reference.html#fail_at_first_char_expected"><code class="computeroutput"><span class="identifier">fail_at_first_char_expected</span></code></a>
3097            does), and if yes, then <a class="link" href="reference.html#foldl_reject_incomplete_start_with_parser"><code class="computeroutput"><span class="identifier">foldl_reject_incomplete_start_with_parser</span></code></a>
3098            fails.
3099          </p>
3100<p>
3101            This makes the implementation of the repetition with advanced error reporting
3102            simpler. Let's try it out:
3103          </p>
3104<pre class="programlisting"><span class="special">&gt;</span> <span class="identifier">exp_parser22</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"0+(1+2"</span><span class="special">)&gt;::</span><span class="identifier">type</span>
3105<span class="special">&lt;&lt;</span> <span class="identifier">compilation</span> <span class="identifier">error</span> <span class="special">&gt;&gt;</span>
3106<span class="special">.....</span> <span class="identifier">x__________________PARSING_FAILED__________________x</span><span class="special">&lt;</span><span class="number">1</span><span class="special">,</span> <span class="number">7</span><span class="special">,</span> <span class="identifier">unpaired</span><span class="special">&lt;</span><span class="number">1</span><span class="special">,</span> <span class="number">3</span><span class="special">,</span> <span class="identifier">literal_expected</span><span class="special">&lt;</span><span class="char">')'</span><span class="special">&gt;&gt;&gt;</span> <span class="special">....</span>
3107<span class="special">&lt;&lt;</span> <span class="identifier">compilation</span> <span class="identifier">error</span> <span class="special">&gt;&gt;</span>
3108</pre>
3109<p>
3110            Note that other folding parsers have their <code class="computeroutput"><span class="identifier">f</span></code>
3111            versions as well (eg. <a class="link" href="reference.html#foldr_reject_incomplete"><code class="computeroutput"><span class="identifier">foldr_reject_incomplete</span></code></a>, <a class="link" href="reference.html#foldl_reject_incomplete1"><code class="computeroutput"><span class="identifier">foldl_reject_incomplete1</span></code></a>,
3112            etc).
3113          </p>
3114</div>
3115<div class="section">
3116<div class="titlepage"><div><div><h5 class="title">
3117<a name="metaparse.getting_started_with_boost_metap.11_dealing_with_invalid_input.11_3_missing_closing_parens.11_3_2_using_foldl_reject_incomp"></a><a class="link" href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.11_dealing_with_invalid_input.11_3_missing_closing_parens.11_3_2_using_foldl_reject_incomp" title="11.3.2. Using foldl_reject_incomplete_start_with_parser at other places as well">11.3.2.
3118          Using <code class="computeroutput"><span class="identifier">foldl_reject_incomplete_start_with_parser</span></code>
3119          at other places as well</a>
3120</h5></div></div></div>
3121<p>
3122            We have replaced one <a class="link" href="reference.html#foldl_start_with_parser"><code class="computeroutput"><span class="identifier">foldl_start_with_parser</span></code></a> with
3123            <a class="link" href="reference.html#foldl_reject_incomplete_start_with_parser"><code class="computeroutput"><span class="identifier">foldl_reject_incomplete_start_with_parser</span></code></a>.
3124            Other layers (<code class="computeroutput"><span class="identifier">mult_exp</span></code>,
3125            <code class="computeroutput"><span class="identifier">unary_exp</span></code>, etc) use folding
3126            as well. Let's use it at all layers:
3127          </p>
3128<pre class="programlisting"><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">plus_exp6</span><span class="special">;</span>
3129<span class="special">&gt;</span> <span class="keyword">using</span> <span class="identifier">paren_exp5</span> <span class="special">=</span> <span class="identifier">middle_of</span><span class="special">&lt;</span><span class="identifier">lparen_token</span><span class="special">,</span> <span class="identifier">plus_exp6</span><span class="special">,</span> <span class="identifier">rparen_token</span><span class="special">&gt;;</span>
3130<span class="special">&gt;</span> <span class="keyword">using</span> <span class="identifier">primary_exp4</span> <span class="special">=</span> <span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">paren_exp5</span><span class="special">,</span> <span class="identifier">fail</span><span class="special">&lt;</span><span class="identifier">missing_primary_expression</span><span class="special">&gt;&gt;;</span>
3131<span class="special">&gt;</span> <span class="keyword">using</span> <span class="identifier">unary_exp4</span> <span class="special">=</span> <span class="special">\</span>
3132<span class="special">...&gt;</span> <span class="identifier">foldr_start_with_parser</span><span class="special">&lt;</span> <span class="special">\</span>
3133<span class="special">...&gt;</span>   <span class="identifier">minus_token</span><span class="special">,</span> <span class="special">\</span>
3134<span class="special">...&gt;</span>   <span class="identifier">primary_exp4</span><span class="special">,</span> <span class="special">\</span>
3135<span class="special">...&gt;</span>   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">negate</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">&gt;&gt;::</span><span class="identifier">type</span> <span class="special">\</span>
3136<span class="special">...&gt;</span> <span class="special">&gt;;</span>
3137<span class="special">&gt;</span> <span class="keyword">using</span> <span class="identifier">mult_exp7</span> <span class="special">=</span> <span class="special">\</span>
3138<span class="special">...&gt;</span> <span class="identifier">foldl_reject_incomplete_start_with_parser</span><span class="special">&lt;</span> <span class="special">\</span>
3139<span class="special">...&gt;</span>   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">&gt;,</span> <span class="identifier">unary_exp4</span><span class="special">&gt;,</span> <span class="special">\</span>
3140<span class="special">...&gt;</span>   <span class="identifier">unary_exp4</span><span class="special">,</span> <span class="special">\</span>
3141<span class="special">...&gt;</span>   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span> <span class="special">\</span>
3142<span class="special">...&gt;</span> <span class="special">&gt;;</span>
3143<span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">plus_exp6</span> <span class="special">:</span> <span class="special">\</span>
3144<span class="special">...&gt;</span> <span class="identifier">foldl_reject_incomplete_start_with_parser</span><span class="special">&lt;</span> <span class="special">\</span>
3145<span class="special">...&gt;</span>   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp7</span><span class="special">&gt;,</span> <span class="special">\</span>
3146<span class="special">...&gt;</span>   <span class="identifier">mult_exp7</span><span class="special">,</span> <span class="special">\</span>
3147<span class="special">...&gt;</span>   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span> <span class="special">\</span>
3148<span class="special">...&gt;</span> <span class="special">&gt;</span> <span class="special">{};</span>
3149<span class="special">&gt;</span> <span class="keyword">using</span> <span class="identifier">exp_parser23</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">plus_exp6</span><span class="special">&gt;;</span>
3150</pre>
3151<p>
3152            <a class="link" href="getting_started_with_boost_metap.html#getting_started_40">copy-paste friendly version</a>
3153          </p>
3154<div class="note"><table border="0" summary="Note">
3155<tr>
3156<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
3157<th align="left">Note</th>
3158</tr>
3159<tr><td align="left" valign="top"><p>
3160              Note that <code class="computeroutput"><span class="identifier">unary_exp4</span></code>
3161              uses <a class="link" href="reference.html#foldr_start_with_parser"><code class="computeroutput"><span class="identifier">foldr_start_with_parser</span></code></a>
3162              instead of <code class="computeroutput"><span class="identifier">foldr_reject_incomplete_start_with_parser</span></code>.
3163              The reason behind it is that there is no <code class="computeroutput"><span class="identifier">foldr_reject_incomplete_start_with_parser</span></code>.
3164              <a class="link" href="reference.html#foldr_start_with_parser"><code class="computeroutput"><span class="identifier">foldr_start_with_parser</span></code></a>
3165              applies the <code class="computeroutput"><span class="identifier">primary_exp4</span></code>
3166              parser when <code class="computeroutput"><span class="identifier">minus_token</span></code>
3167              does not accept the input any more. Therefore, it is supposed to catch
3168              the errors of incomplete expressions after the repetition.
3169            </p></td></tr>
3170</table></div>
3171<p>
3172            Let's try different invalid expressions:
3173          </p>
3174<pre class="programlisting"><span class="special">&gt;</span> <span class="identifier">exp_parser23</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1+(2*"</span><span class="special">)&gt;::</span><span class="identifier">type</span>
3175<span class="special">&lt;&lt;</span> <span class="identifier">compilation</span> <span class="identifier">error</span> <span class="special">&gt;&gt;</span>
3176<span class="special">.....</span> <span class="identifier">x__________________PARSING_FAILED__________________x</span><span class="special">&lt;</span><span class="number">1</span><span class="special">,</span> <span class="number">6</span><span class="special">,</span> <span class="identifier">missing_primary_expression</span><span class="special">&gt;</span> <span class="special">....</span>
3177<span class="special">&lt;&lt;</span> <span class="identifier">compilation</span> <span class="identifier">error</span> <span class="special">&gt;&gt;</span>
3178
3179<span class="special">&gt;</span> <span class="identifier">exp_parser23</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1+(2*3"</span><span class="special">)&gt;::</span><span class="identifier">type</span>
3180<span class="special">&lt;&lt;</span> <span class="identifier">compilation</span> <span class="identifier">error</span> <span class="special">&gt;&gt;</span>
3181<span class="special">.....</span> <span class="identifier">x__________________PARSING_FAILED__________________x</span><span class="special">&lt;</span><span class="number">1</span><span class="special">,</span> <span class="number">7</span><span class="special">,</span> <span class="identifier">unpaired</span><span class="special">&lt;</span><span class="number">1</span><span class="special">,</span> <span class="number">3</span><span class="special">,</span> <span class="identifier">literal_expected</span><span class="special">&lt;</span><span class="char">')'</span><span class="special">&gt;&gt;&gt;</span> <span class="special">....</span>
3182<span class="special">&lt;&lt;</span> <span class="identifier">compilation</span> <span class="identifier">error</span> <span class="special">&gt;&gt;</span>
3183</pre>
3184</div>
3185</div>
3186</div>
3187<div class="section">
3188<div class="titlepage"><div><div><h3 class="title">
3189<a name="metaparse.getting_started_with_boost_metap.12_summary"></a><a class="link" href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.12_summary" title="12. Summary">12.
3190      Summary</a>
3191</h3></div></div></div>
3192<p>
3193        This tutorial showed you how to build a parser for a calculator language.
3194        Now that you understand how to do this, you should be able to use the same
3195        techniques and building blocks presented here to build a parser for your
3196        own language. You should start building the parser and once you face a problem
3197        (eg. you need to add parens or you need better error messages) you can always
3198        return to this tutorial and read the section showing you how to deal with
3199        those situations.
3200      </p>
3201</div>
3202<div class="section">
3203<div class="titlepage"><div><div><h3 class="title">
3204<a name="metaparse.getting_started_with_boost_metap.copy_paste_friendly_code_example"></a><a class="link" href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.copy_paste_friendly_code_example" title="Copy-paste friendly code examples">Copy-paste
3205      friendly code examples</a>
3206</h3></div></div></div>
3207<a name="getting_started_0"></a><pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">build_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3208<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">metaparse</span><span class="special">;</span>
3209<span class="keyword">using</span> <span class="identifier">exp_parser1</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
3210</pre>
3211<a name="getting_started_1"></a><pre class="programlisting"><span class="keyword">using</span> <span class="identifier">int_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
3212<span class="keyword">using</span> <span class="identifier">plus_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;;</span>
3213</pre>
3214<a name="getting_started_2"></a><pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">plus</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3215<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">at</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3216<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_plus</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">2</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">&gt;</span> <span class="special">{};</span>
3217</pre>
3218<a name="getting_started_3"></a><pre class="programlisting"><span class="identifier">eval_plus</span><span class="special">&lt;</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span> <span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">11</span><span class="special">&gt;,</span> <span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">char_</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;,</span> <span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">2</span><span class="special">&gt;</span> <span class="special">&gt;&gt;::</span><span class="identifier">type</span>
3219</pre>
3220<a name="getting_started_4"></a><pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">quote</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3221<span class="keyword">using</span> <span class="identifier">exp_parser6</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span> <span class="identifier">transform</span><span class="special">&lt;</span> <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">eval_plus</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="special">&gt;;</span>
3222</pre>
3223<a name="getting_started_5"></a><pre class="programlisting"><span class="keyword">using</span> <span class="identifier">exp_parser7</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span> <span class="identifier">sequence</span><span class="special">&lt;</span> <span class="identifier">int_token</span><span class="special">,</span>                                <span class="comment">/* The first &lt;number&gt; */</span> <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;</span> <span class="comment">/* The "+ &lt;number&gt;" elements */</span> <span class="special">&gt;</span> <span class="special">&gt;;</span>
3224</pre>
3225<a name="getting_started_6"></a><pre class="programlisting"><span class="keyword">using</span> <span class="identifier">vector_of_numbers</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">2</span><span class="special">&gt;,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">5</span><span class="special">&gt;,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">6</span><span class="special">&gt;</span> <span class="special">&gt;;</span>
3226</pre>
3227<a name="getting_started_7"></a><pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">sum_vector</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span> <span class="identifier">Vector</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_2</span><span class="special">&gt;</span> <span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">&gt;</span> <span class="special">{};</span>
3228</pre>
3229<a name="getting_started_8"></a><pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Sum</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Item</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">sum_items</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span> <span class="identifier">Sum</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">&gt;</span> <span class="special">{};</span>
3230</pre>
3231<a name="getting_started_9"></a><pre class="programlisting"><span class="identifier">sum_items</span><span class="special">&lt;</span> <span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">char_</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;,</span> <span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">2</span><span class="special">&gt;&gt;</span> <span class="special">&gt;::</span><span class="identifier">type</span>
3232</pre>
3233<a name="getting_started_10"></a><pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">temp_result</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">,</span> <span class="comment">/* The vector to summarise */</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span> <span class="comment">/* The value to start the sum from */</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span> <span class="comment">/* The function to call in each iteration */</span> <span class="special">&gt;::</span><span class="identifier">type</span>
3234</pre>
3235<a name="getting_started_11"></a><pre class="programlisting"><span class="keyword">using</span> <span class="identifier">exp_parser8</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span> <span class="identifier">sequence</span><span class="special">&lt;</span> <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* parse the first &lt;number&gt; */</span> <span class="identifier">transform</span><span class="special">&lt;</span> <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;,</span> <span class="comment">/* parse the "+ &lt;number&gt;" elements */</span> <span class="comment">/* lambda expression summarising the "+ &lt;number&gt;" elements using fold */</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span> <span class="comment">/* The folding expression we have just created */</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span> <span class="comment">/* the argument of the lambda expression, the result */</span> <span class="comment">/* of the repeated&lt;...&gt; parser */</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">&gt;</span> <span class="special">&gt;</span> <span class="special">&gt;;</span>
3236</pre>
3237<a name="getting_started_12"></a><pre class="programlisting"><span class="keyword">using</span> <span class="identifier">exp_parser9</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span> <span class="identifier">transform</span><span class="special">&lt;</span> <span class="comment">/* What we had so far */</span> <span class="identifier">sequence</span><span class="special">&lt;</span> <span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">transform</span><span class="special">&lt;</span> <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">&gt;</span> <span class="special">&gt;,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">sum_vector</span><span class="special">&gt;</span> <span class="comment">/* summarise the vector of numbers */</span> <span class="special">&gt;</span> <span class="special">&gt;;</span>
3238</pre>
3239<a name="getting_started_13"></a><pre class="programlisting"><span class="keyword">using</span> <span class="identifier">exp_parser10</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span> <span class="identifier">transform</span><span class="special">&lt;</span> <span class="identifier">sequence</span><span class="special">&lt;</span> <span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">foldl</span><span class="special">&lt;</span> <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="special">&gt;,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">sum_vector</span><span class="special">&gt;&gt;</span> <span class="special">&gt;;</span>
3240</pre>
3241<a name="getting_started_14"></a><pre class="programlisting"><span class="special">&gt;</span>
3242</pre>
3243<a name="getting_started_15"></a><pre class="programlisting"><span class="keyword">using</span> <span class="identifier">exp_parser11</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span> <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span> <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span> <span class="comment">/* apply this parser repeatedly */</span> <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* use this parser to get the initial value */</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span> <span class="comment">/* use this function to add a new value to the summary */</span> <span class="special">&gt;</span> <span class="special">&gt;;</span>
3244</pre>
3245<a name="getting_started_16"></a><pre class="programlisting"><span class="keyword">using</span> <span class="identifier">exp_parser12</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span> <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span> <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="special">&gt;;</span>
3246</pre>
3247<a name="getting_started_17"></a><pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">char</span> <span class="identifier">Op</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">;</span>
3248<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'+'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
3249<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'-'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">minus</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
3250</pre>
3251<a name="getting_started_18"></a><pre class="programlisting"><span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">11</span><span class="special">&gt;,</span> <span class="char">'+'</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">2</span><span class="special">&gt;&gt;::</span><span class="identifier">type</span>
3252<span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">13</span><span class="special">&gt;,</span> <span class="char">'-'</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">2</span><span class="special">&gt;&gt;::</span><span class="identifier">type</span>
3253</pre>
3254<a name="getting_started_19"></a><pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">S</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Item</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">binary_op</span> <span class="special">:</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span> <span class="identifier">S</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">::</span><span class="identifier">value</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">&gt;</span> <span class="special">{};</span>
3255</pre>
3256<a name="getting_started_20"></a><pre class="programlisting"><span class="keyword">using</span> <span class="identifier">exp_parser13</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span> <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span> <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="special">&gt;;</span>
3257</pre>
3258<a name="getting_started_21"></a><pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">times</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3259<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'*'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">times</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
3260</pre>
3261<a name="getting_started_22"></a><pre class="programlisting"><span class="keyword">using</span> <span class="identifier">exp_parser14</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span> <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span> <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">,</span> <span class="identifier">times_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="special">&gt;;</span>
3262</pre>
3263<a name="getting_started_23"></a><pre class="programlisting"><span class="keyword">using</span> <span class="identifier">exp_parser15</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span> <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span> <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp1</span><span class="special">&gt;,</span> <span class="identifier">mult_exp1</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="special">&gt;;</span>
3264</pre>
3265<a name="getting_started_24"></a><pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">divides</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3266<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'/'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">divides</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
3267<span class="keyword">using</span> <span class="identifier">divides_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'/'</span><span class="special">&gt;&gt;;</span>
3268<span class="keyword">using</span> <span class="identifier">mult_exp2</span> <span class="special">=</span> <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span> <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span> <span class="special">&gt;;</span>
3269<span class="keyword">using</span> <span class="identifier">exp_parser16</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span> <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span> <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp2</span><span class="special">&gt;,</span> <span class="identifier">mult_exp2</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="special">&gt;;</span>
3270</pre>
3271<a name="getting_started_25"></a><pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">S</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Item</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">reverse_binary_op</span> <span class="special">:</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">::</span><span class="identifier">value</span><span class="special">,</span> <span class="identifier">S</span> <span class="special">&gt;</span> <span class="special">{};</span>
3272</pre>
3273<a name="getting_started_26"></a><pre class="programlisting"><span class="keyword">using</span> <span class="identifier">mult_exp3</span> <span class="special">=</span> <span class="identifier">foldr_start_with_parser</span><span class="special">&lt;</span> <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">&gt;&gt;,</span> <span class="comment">/* The parser applied repeatedly */</span> <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* The parser parsing the last number */</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">reverse_binary_op</span><span class="special">&gt;</span> <span class="comment">/* The function called for every result */</span> <span class="comment">/* of applying the above parser */</span> <span class="special">&gt;;</span>
3274</pre>
3275<a name="getting_started_27"></a><pre class="programlisting"><span class="keyword">using</span> <span class="identifier">exp_parser17</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span> <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span> <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp3</span><span class="special">&gt;,</span> <span class="identifier">mult_exp3</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="special">&gt;;</span>
3276</pre>
3277<a name="getting_started_28"></a><pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">negate</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3278<span class="keyword">using</span> <span class="identifier">unary_exp1</span> <span class="special">=</span> <span class="identifier">foldr_start_with_parser</span><span class="special">&lt;</span> <span class="identifier">minus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">negate</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">&gt;&gt;::</span><span class="identifier">type</span> <span class="special">&gt;;</span>
3279</pre>
3280<a name="getting_started_29"></a><pre class="programlisting"><span class="keyword">using</span> <span class="identifier">mult_exp4</span> <span class="special">=</span> <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span> <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">&gt;,</span> <span class="identifier">unary_exp1</span><span class="special">&gt;,</span> <span class="identifier">unary_exp1</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span> <span class="special">&gt;;</span>
3281<span class="keyword">using</span> <span class="identifier">exp_parser18</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span> <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span> <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp4</span><span class="special">&gt;,</span> <span class="identifier">mult_exp4</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="special">&gt;;</span>
3282</pre>
3283<a name="getting_started_30"></a><pre class="programlisting"><span class="identifier">exp_parser18</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"---13"</span><span class="special">)&gt;::</span><span class="identifier">type</span>
3284<span class="identifier">exp_parser18</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"13"</span><span class="special">)&gt;::</span><span class="identifier">type</span>
3285</pre>
3286<a name="getting_started_31"></a><pre class="programlisting"><span class="keyword">using</span> <span class="identifier">lparen_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'('</span><span class="special">&gt;&gt;;</span>
3287<span class="keyword">using</span> <span class="identifier">rparen_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">')'</span><span class="special">&gt;&gt;;</span>
3288</pre>
3289<a name="getting_started_32"></a><pre class="programlisting"><span class="keyword">using</span> <span class="identifier">plus_exp1</span> <span class="special">=</span> <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span> <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp4</span><span class="special">&gt;,</span> <span class="identifier">mult_exp4</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span> <span class="special">&gt;;</span>
3290</pre>
3291<a name="getting_started_33"></a><pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">middle_of</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3292<span class="keyword">using</span> <span class="identifier">paren_exp2</span> <span class="special">=</span> <span class="identifier">middle_of</span><span class="special">&lt;</span><span class="identifier">lparen_token</span><span class="special">,</span> <span class="identifier">plus_exp1</span><span class="special">,</span> <span class="identifier">rparen_token</span><span class="special">&gt;;</span>
3293</pre>
3294<a name="getting_started_34"></a><pre class="programlisting"><span class="keyword">using</span> <span class="identifier">paren_exp3</span> <span class="special">=</span> <span class="identifier">middle_of</span><span class="special">&lt;</span><span class="identifier">lparen_token</span><span class="special">,</span> <span class="identifier">plus_exp2</span><span class="special">,</span> <span class="identifier">rparen_token</span><span class="special">&gt;;</span>
3295<span class="keyword">using</span> <span class="identifier">primary_exp2</span> <span class="special">=</span> <span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">paren_exp2</span><span class="special">&gt;;</span>
3296<span class="keyword">using</span> <span class="identifier">unary_exp2</span> <span class="special">=</span> <span class="identifier">foldr_start_with_parser</span><span class="special">&lt;</span> <span class="identifier">minus_token</span><span class="special">,</span> <span class="identifier">primary_exp2</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">negate</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">&gt;&gt;::</span><span class="identifier">type</span> <span class="special">&gt;;</span>
3297<span class="keyword">using</span> <span class="identifier">mult_exp5</span> <span class="special">=</span> <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span> <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">&gt;,</span> <span class="identifier">unary_exp2</span><span class="special">&gt;,</span> <span class="identifier">unary_exp2</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span> <span class="special">&gt;;</span>
3298</pre>
3299<a name="getting_started_35"></a><pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">plus_exp2</span> <span class="special">:</span> <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span> <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp5</span><span class="special">&gt;,</span> <span class="identifier">mult_exp5</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="special">{};</span>
3300</pre>
3301<a name="getting_started_36"></a><pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">plus_exp3</span><span class="special">;</span>
3302<span class="keyword">using</span> <span class="identifier">paren_exp4</span> <span class="special">=</span> <span class="identifier">middle_of</span><span class="special">&lt;</span><span class="identifier">lparen_token</span><span class="special">,</span> <span class="identifier">plus_exp3</span><span class="special">,</span> <span class="identifier">rparen_token</span><span class="special">&gt;;</span>
3303</pre>
3304<a name="getting_started_37"></a><pre class="programlisting"><span class="keyword">using</span> <span class="identifier">unary_exp3</span> <span class="special">=</span> <span class="identifier">foldr_start_with_parser</span><span class="special">&lt;</span> <span class="identifier">minus_token</span><span class="special">,</span> <span class="identifier">primary_exp3</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">negate</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">&gt;&gt;::</span><span class="identifier">type</span> <span class="special">&gt;;</span>
3305<span class="keyword">using</span> <span class="identifier">mult_exp6</span> <span class="special">=</span> <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span> <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">&gt;,</span> <span class="identifier">unary_exp3</span><span class="special">&gt;,</span> <span class="identifier">unary_exp3</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span> <span class="special">&gt;;</span>
3306<span class="keyword">struct</span> <span class="identifier">plus_exp3</span> <span class="special">:</span> <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span> <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp6</span><span class="special">&gt;,</span> <span class="identifier">mult_exp6</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="special">{};</span>
3307<span class="keyword">using</span> <span class="identifier">exp_parser20</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">plus_exp3</span><span class="special">&gt;;</span>
3308</pre>
3309<a name="getting_started_38"></a><pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">fail_at_first_char_expected</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3310<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">first_of</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3311<span class="keyword">struct</span> <span class="identifier">plus_exp4</span> <span class="special">:</span> <span class="identifier">first_of</span><span class="special">&lt;</span> <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span> <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp6</span><span class="special">&gt;,</span> <span class="identifier">mult_exp6</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span> <span class="special">&gt;,</span> <span class="identifier">fail_at_first_char_expected</span><span class="special">&lt;</span> <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp6</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="special">&gt;</span> <span class="special">{};</span>
3312<span class="keyword">using</span> <span class="identifier">exp_parser21</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">plus_exp4</span><span class="special">&gt;;</span>
3313</pre>
3314<a name="getting_started_39"></a><pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">foldl_reject_incomplete_start_with_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3315<span class="keyword">struct</span> <span class="identifier">plus_exp5</span> <span class="special">:</span> <span class="identifier">foldl_reject_incomplete_start_with_parser</span><span class="special">&lt;</span> <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp6</span><span class="special">&gt;,</span> <span class="identifier">mult_exp6</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="special">{};</span>
3316<span class="keyword">using</span> <span class="identifier">exp_parser22</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">plus_exp5</span><span class="special">&gt;;</span>
3317</pre>
3318<a name="getting_started_40"></a><pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">plus_exp6</span><span class="special">;</span>
3319<span class="keyword">using</span> <span class="identifier">paren_exp5</span> <span class="special">=</span> <span class="identifier">middle_of</span><span class="special">&lt;</span><span class="identifier">lparen_token</span><span class="special">,</span> <span class="identifier">plus_exp6</span><span class="special">,</span> <span class="identifier">rparen_token</span><span class="special">&gt;;</span>
3320<span class="keyword">using</span> <span class="identifier">primary_exp4</span> <span class="special">=</span> <span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">paren_exp5</span><span class="special">,</span> <span class="identifier">fail</span><span class="special">&lt;</span><span class="identifier">missing_primary_expression</span><span class="special">&gt;&gt;;</span>
3321<span class="keyword">using</span> <span class="identifier">unary_exp4</span> <span class="special">=</span> <span class="identifier">foldr_start_with_parser</span><span class="special">&lt;</span> <span class="identifier">minus_token</span><span class="special">,</span> <span class="identifier">primary_exp4</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">negate</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">&gt;&gt;::</span><span class="identifier">type</span> <span class="special">&gt;;</span>
3322<span class="keyword">using</span> <span class="identifier">mult_exp7</span> <span class="special">=</span> <span class="identifier">foldl_reject_incomplete_start_with_parser</span><span class="special">&lt;</span> <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">&gt;,</span> <span class="identifier">unary_exp4</span><span class="special">&gt;,</span> <span class="identifier">unary_exp4</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span> <span class="special">&gt;;</span>
3323<span class="keyword">struct</span> <span class="identifier">plus_exp6</span> <span class="special">:</span> <span class="identifier">foldl_reject_incomplete_start_with_parser</span><span class="special">&lt;</span> <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp7</span><span class="special">&gt;,</span> <span class="identifier">mult_exp7</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="special">{};</span>
3324<span class="keyword">using</span> <span class="identifier">exp_parser23</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">plus_exp6</span><span class="special">&gt;;</span>
3325</pre>
3326</div>
3327<div class="section">
3328<div class="titlepage"><div><div><h3 class="title">
3329<a name="metaparse.getting_started_with_boost_metap.definitions_before_each_section"></a><a class="link" href="getting_started_with_boost_metap.html#metaparse.getting_started_with_boost_metap.definitions_before_each_section" title="Definitions before each section">Definitions
3330      before each section</a>
3331</h3></div></div></div>
3332<p>
3333        <a name="before_3"></a><span class="emphasis"><em>Definitions before section 3.</em></span>
3334      </p>
3335<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">string</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3336</pre>
3337<p>
3338        <a name="before_3_1"></a><span class="emphasis"><em>Definitions before section 3.1.</em></span>
3339      </p>
3340<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">string</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3341<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">int_</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3342
3343<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">build_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3344
3345<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">metaparse</span><span class="special">;</span>
3346
3347<span class="keyword">using</span> <span class="identifier">exp_parser1</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
3348</pre>
3349<p>
3350        <a name="before_3_2"></a><span class="emphasis"><em>Definitions before section 3.2.</em></span>
3351      </p>
3352<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">string</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3353<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">int_</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3354
3355<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">build_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3356
3357<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">metaparse</span><span class="special">;</span>
3358
3359<span class="keyword">using</span> <span class="identifier">exp_parser1</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
3360</pre>
3361<p>
3362        <a name="before_3_3"></a><span class="emphasis"><em>Definitions before section 3.3.</em></span>
3363      </p>
3364<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">string</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3365<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">int_</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3366
3367<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">build_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3368
3369<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">metaparse</span><span class="special">;</span>
3370
3371<span class="keyword">using</span> <span class="identifier">exp_parser1</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
3372<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">entire_input</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3373
3374<span class="keyword">using</span> <span class="identifier">exp_parser2</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;;</span>
3375</pre>
3376<p>
3377        <a name="before_4"></a><span class="emphasis"><em>Definitions before section 4.</em></span>
3378      </p>
3379<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">string</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3380<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">int_</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3381
3382<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">build_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3383
3384<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">metaparse</span><span class="special">;</span>
3385
3386<span class="keyword">using</span> <span class="identifier">exp_parser1</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
3387<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">entire_input</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3388
3389<span class="keyword">using</span> <span class="identifier">exp_parser2</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;;</span>
3390<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">token</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3391
3392<span class="keyword">using</span> <span class="identifier">exp_parser3</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;&gt;;</span>
3393</pre>
3394<p>
3395        <a name="before_4_1"></a><span class="emphasis"><em>Definitions before section 4.1.</em></span>
3396      </p>
3397<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">string</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3398<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">int_</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3399
3400<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">build_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3401
3402<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">metaparse</span><span class="special">;</span>
3403
3404<span class="keyword">using</span> <span class="identifier">exp_parser1</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
3405<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">entire_input</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3406
3407<span class="keyword">using</span> <span class="identifier">exp_parser2</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;;</span>
3408<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">token</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3409
3410<span class="keyword">using</span> <span class="identifier">exp_parser3</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;&gt;;</span>
3411<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">lit_c</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3412
3413<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">sequence</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3414
3415<span class="keyword">using</span> <span class="identifier">exp_parser4</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;&gt;;</span>
3416
3417<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">metashell</span><span class="special">/</span><span class="identifier">formatter</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3418</pre>
3419<p>
3420        <a name="before_4_2"></a><span class="emphasis"><em>Definitions before section 4.2.</em></span>
3421      </p>
3422<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">string</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3423<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">int_</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3424
3425<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">build_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3426
3427<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">metaparse</span><span class="special">;</span>
3428
3429<span class="keyword">using</span> <span class="identifier">exp_parser1</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
3430<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">entire_input</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3431
3432<span class="keyword">using</span> <span class="identifier">exp_parser2</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;;</span>
3433<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">token</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3434
3435<span class="keyword">using</span> <span class="identifier">exp_parser3</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;&gt;;</span>
3436<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">lit_c</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3437
3438<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">sequence</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3439
3440<span class="keyword">using</span> <span class="identifier">exp_parser4</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;&gt;;</span>
3441
3442<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">metashell</span><span class="special">/</span><span class="identifier">formatter</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3443
3444<span class="keyword">using</span> <span class="identifier">int_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
3445
3446<span class="keyword">using</span> <span class="identifier">plus_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;;</span>
3447
3448<span class="keyword">using</span> <span class="identifier">exp_parser5</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;;</span>
3449</pre>
3450<p>
3451        <a name="before_5"></a><span class="emphasis"><em>Definitions before section 5.</em></span>
3452      </p>
3453<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">string</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3454<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">int_</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3455
3456<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">build_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3457
3458<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">metaparse</span><span class="special">;</span>
3459
3460<span class="keyword">using</span> <span class="identifier">exp_parser1</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
3461<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">entire_input</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3462
3463<span class="keyword">using</span> <span class="identifier">exp_parser2</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;;</span>
3464<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">token</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3465
3466<span class="keyword">using</span> <span class="identifier">exp_parser3</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;&gt;;</span>
3467<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">lit_c</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3468
3469<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">sequence</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3470
3471<span class="keyword">using</span> <span class="identifier">exp_parser4</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;&gt;;</span>
3472
3473<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">metashell</span><span class="special">/</span><span class="identifier">formatter</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3474
3475<span class="keyword">using</span> <span class="identifier">int_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
3476
3477<span class="keyword">using</span> <span class="identifier">plus_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;;</span>
3478
3479<span class="keyword">using</span> <span class="identifier">exp_parser5</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;;</span>
3480<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">transform</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3481
3482<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">plus</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3483
3484<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">at</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3485
3486<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">&gt;</span>
3487 <span class="keyword">struct</span> <span class="identifier">eval_plus</span> <span class="special">:</span>
3488   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span>
3489     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">,</span>
3490     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">2</span><span class="special">&gt;::</span><span class="identifier">type</span>
3491   <span class="special">&gt;</span> <span class="special">{};</span>
3492
3493<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">quote</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3494
3495<span class="keyword">using</span> <span class="identifier">exp_parser6</span> <span class="special">=</span>
3496 <span class="identifier">build_parser</span><span class="special">&lt;</span>
3497   <span class="identifier">transform</span><span class="special">&lt;</span>
3498     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
3499     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">eval_plus</span><span class="special">&gt;</span>
3500   <span class="special">&gt;</span>
3501 <span class="special">&gt;;</span>
3502</pre>
3503<p>
3504        <a name="before_5_1"></a><span class="emphasis"><em>Definitions before section 5.1.</em></span>
3505      </p>
3506<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">string</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3507<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">int_</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3508
3509<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">build_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3510
3511<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">metaparse</span><span class="special">;</span>
3512
3513<span class="keyword">using</span> <span class="identifier">exp_parser1</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
3514<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">entire_input</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3515
3516<span class="keyword">using</span> <span class="identifier">exp_parser2</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;;</span>
3517<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">token</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3518
3519<span class="keyword">using</span> <span class="identifier">exp_parser3</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;&gt;;</span>
3520<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">lit_c</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3521
3522<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">sequence</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3523
3524<span class="keyword">using</span> <span class="identifier">exp_parser4</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;&gt;;</span>
3525
3526<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">metashell</span><span class="special">/</span><span class="identifier">formatter</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3527
3528<span class="keyword">using</span> <span class="identifier">int_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
3529
3530<span class="keyword">using</span> <span class="identifier">plus_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;;</span>
3531
3532<span class="keyword">using</span> <span class="identifier">exp_parser5</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;;</span>
3533<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">transform</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3534
3535<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">plus</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3536
3537<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">at</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3538
3539<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">&gt;</span>
3540 <span class="keyword">struct</span> <span class="identifier">eval_plus</span> <span class="special">:</span>
3541   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span>
3542     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">,</span>
3543     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">2</span><span class="special">&gt;::</span><span class="identifier">type</span>
3544   <span class="special">&gt;</span> <span class="special">{};</span>
3545
3546<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">quote</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3547
3548<span class="keyword">using</span> <span class="identifier">exp_parser6</span> <span class="special">=</span>
3549 <span class="identifier">build_parser</span><span class="special">&lt;</span>
3550   <span class="identifier">transform</span><span class="special">&lt;</span>
3551     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
3552     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">eval_plus</span><span class="special">&gt;</span>
3553   <span class="special">&gt;</span>
3554 <span class="special">&gt;;</span>
3555</pre>
3556<p>
3557        <a name="before_5_2"></a><span class="emphasis"><em>Definitions before section 5.2.</em></span>
3558      </p>
3559<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">string</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3560<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">int_</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3561
3562<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">build_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3563
3564<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">metaparse</span><span class="special">;</span>
3565
3566<span class="keyword">using</span> <span class="identifier">exp_parser1</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
3567<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">entire_input</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3568
3569<span class="keyword">using</span> <span class="identifier">exp_parser2</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;;</span>
3570<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">token</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3571
3572<span class="keyword">using</span> <span class="identifier">exp_parser3</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;&gt;;</span>
3573<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">lit_c</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3574
3575<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">sequence</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3576
3577<span class="keyword">using</span> <span class="identifier">exp_parser4</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;&gt;;</span>
3578
3579<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">metashell</span><span class="special">/</span><span class="identifier">formatter</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3580
3581<span class="keyword">using</span> <span class="identifier">int_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
3582
3583<span class="keyword">using</span> <span class="identifier">plus_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;;</span>
3584
3585<span class="keyword">using</span> <span class="identifier">exp_parser5</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;;</span>
3586<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">transform</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3587
3588<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">plus</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3589
3590<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">at</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3591
3592<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">&gt;</span>
3593 <span class="keyword">struct</span> <span class="identifier">eval_plus</span> <span class="special">:</span>
3594   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span>
3595     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">,</span>
3596     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">2</span><span class="special">&gt;::</span><span class="identifier">type</span>
3597   <span class="special">&gt;</span> <span class="special">{};</span>
3598
3599<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">quote</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3600
3601<span class="keyword">using</span> <span class="identifier">exp_parser6</span> <span class="special">=</span>
3602 <span class="identifier">build_parser</span><span class="special">&lt;</span>
3603   <span class="identifier">transform</span><span class="special">&lt;</span>
3604     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
3605     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">eval_plus</span><span class="special">&gt;</span>
3606   <span class="special">&gt;</span>
3607 <span class="special">&gt;;</span>
3608<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">any</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3609
3610<span class="keyword">using</span> <span class="identifier">exp_parser7</span> <span class="special">=</span>
3611 <span class="identifier">build_parser</span><span class="special">&lt;</span>
3612   <span class="identifier">sequence</span><span class="special">&lt;</span>
3613     <span class="identifier">int_token</span><span class="special">,</span>                                <span class="comment">/* The first &lt;number&gt; */</span>
3614     <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;</span> <span class="comment">/* The "+ &lt;number&gt;" elements */</span>
3615   <span class="special">&gt;</span>
3616 <span class="special">&gt;;</span>
3617</pre>
3618<p>
3619        <a name="before_5_2_1"></a><span class="emphasis"><em>Definitions before section 5.2.1.</em></span>
3620      </p>
3621<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">string</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3622<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">int_</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3623
3624<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">build_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3625
3626<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">metaparse</span><span class="special">;</span>
3627
3628<span class="keyword">using</span> <span class="identifier">exp_parser1</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
3629<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">entire_input</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3630
3631<span class="keyword">using</span> <span class="identifier">exp_parser2</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;;</span>
3632<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">token</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3633
3634<span class="keyword">using</span> <span class="identifier">exp_parser3</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;&gt;;</span>
3635<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">lit_c</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3636
3637<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">sequence</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3638
3639<span class="keyword">using</span> <span class="identifier">exp_parser4</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;&gt;;</span>
3640
3641<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">metashell</span><span class="special">/</span><span class="identifier">formatter</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3642
3643<span class="keyword">using</span> <span class="identifier">int_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
3644
3645<span class="keyword">using</span> <span class="identifier">plus_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;;</span>
3646
3647<span class="keyword">using</span> <span class="identifier">exp_parser5</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;;</span>
3648<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">transform</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3649
3650<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">plus</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3651
3652<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">at</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3653
3654<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">&gt;</span>
3655 <span class="keyword">struct</span> <span class="identifier">eval_plus</span> <span class="special">:</span>
3656   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span>
3657     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">,</span>
3658     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">2</span><span class="special">&gt;::</span><span class="identifier">type</span>
3659   <span class="special">&gt;</span> <span class="special">{};</span>
3660
3661<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">quote</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3662
3663<span class="keyword">using</span> <span class="identifier">exp_parser6</span> <span class="special">=</span>
3664 <span class="identifier">build_parser</span><span class="special">&lt;</span>
3665   <span class="identifier">transform</span><span class="special">&lt;</span>
3666     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
3667     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">eval_plus</span><span class="special">&gt;</span>
3668   <span class="special">&gt;</span>
3669 <span class="special">&gt;;</span>
3670<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">any</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3671
3672<span class="keyword">using</span> <span class="identifier">exp_parser7</span> <span class="special">=</span>
3673 <span class="identifier">build_parser</span><span class="special">&lt;</span>
3674   <span class="identifier">sequence</span><span class="special">&lt;</span>
3675     <span class="identifier">int_token</span><span class="special">,</span>                                <span class="comment">/* The first &lt;number&gt; */</span>
3676     <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;</span> <span class="comment">/* The "+ &lt;number&gt;" elements */</span>
3677   <span class="special">&gt;</span>
3678 <span class="special">&gt;;</span>
3679<span class="keyword">using</span> <span class="identifier">temp_result</span> <span class="special">=</span> <span class="identifier">exp_parser7</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 + 3 + 4"</span><span class="special">)&gt;::</span><span class="identifier">type</span><span class="special">;</span>
3680</pre>
3681<p>
3682        <a name="before_5_2_2"></a><span class="emphasis"><em>Definitions before section 5.2.2.</em></span>
3683      </p>
3684<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">string</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3685<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">int_</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3686
3687<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">build_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3688
3689<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">metaparse</span><span class="special">;</span>
3690
3691<span class="keyword">using</span> <span class="identifier">exp_parser1</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
3692<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">entire_input</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3693
3694<span class="keyword">using</span> <span class="identifier">exp_parser2</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;;</span>
3695<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">token</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3696
3697<span class="keyword">using</span> <span class="identifier">exp_parser3</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;&gt;;</span>
3698<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">lit_c</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3699
3700<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">sequence</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3701
3702<span class="keyword">using</span> <span class="identifier">exp_parser4</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;&gt;;</span>
3703
3704<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">metashell</span><span class="special">/</span><span class="identifier">formatter</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3705
3706<span class="keyword">using</span> <span class="identifier">int_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
3707
3708<span class="keyword">using</span> <span class="identifier">plus_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;;</span>
3709
3710<span class="keyword">using</span> <span class="identifier">exp_parser5</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;;</span>
3711<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">transform</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3712
3713<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">plus</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3714
3715<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">at</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3716
3717<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">&gt;</span>
3718 <span class="keyword">struct</span> <span class="identifier">eval_plus</span> <span class="special">:</span>
3719   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span>
3720     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">,</span>
3721     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">2</span><span class="special">&gt;::</span><span class="identifier">type</span>
3722   <span class="special">&gt;</span> <span class="special">{};</span>
3723
3724<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">quote</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3725
3726<span class="keyword">using</span> <span class="identifier">exp_parser6</span> <span class="special">=</span>
3727 <span class="identifier">build_parser</span><span class="special">&lt;</span>
3728   <span class="identifier">transform</span><span class="special">&lt;</span>
3729     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
3730     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">eval_plus</span><span class="special">&gt;</span>
3731   <span class="special">&gt;</span>
3732 <span class="special">&gt;;</span>
3733<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">any</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3734
3735<span class="keyword">using</span> <span class="identifier">exp_parser7</span> <span class="special">=</span>
3736 <span class="identifier">build_parser</span><span class="special">&lt;</span>
3737   <span class="identifier">sequence</span><span class="special">&lt;</span>
3738     <span class="identifier">int_token</span><span class="special">,</span>                                <span class="comment">/* The first &lt;number&gt; */</span>
3739     <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;</span> <span class="comment">/* The "+ &lt;number&gt;" elements */</span>
3740   <span class="special">&gt;</span>
3741 <span class="special">&gt;;</span>
3742<span class="keyword">using</span> <span class="identifier">temp_result</span> <span class="special">=</span> <span class="identifier">exp_parser7</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 + 3 + 4"</span><span class="special">)&gt;::</span><span class="identifier">type</span><span class="special">;</span>
3743<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">fold</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3744
3745<span class="keyword">using</span> <span class="identifier">vector_of_numbers</span> <span class="special">=</span>
3746 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span>
3747   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">2</span><span class="special">&gt;,</span>
3748   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">5</span><span class="special">&gt;,</span>
3749   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">6</span><span class="special">&gt;</span>
3750 <span class="special">&gt;;</span>
3751
3752<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">&gt;</span>
3753 <span class="keyword">struct</span> <span class="identifier">sum_vector</span> <span class="special">:</span>
3754    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
3755      <span class="identifier">Vector</span><span class="special">,</span>
3756      <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
3757      <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
3758        <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_2</span><span class="special">&gt;</span>
3759      <span class="special">&gt;::</span><span class="identifier">type</span>
3760    <span class="special">&gt;</span>
3761  <span class="special">{};</span>
3762
3763<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Sum</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Item</span><span class="special">&gt;</span>
3764   <span class="keyword">struct</span> <span class="identifier">sum_items</span> <span class="special">:</span>
3765     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span>
3766       <span class="identifier">Sum</span><span class="special">,</span>
3767       <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;::</span><span class="identifier">type</span>
3768     <span class="special">&gt;</span>
3769 <span class="special">{};</span>
3770</pre>
3771<p>
3772        <a name="before_5_2_3"></a><span class="emphasis"><em>Definitions before section 5.2.3.</em></span>
3773      </p>
3774<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">string</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3775<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">int_</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3776
3777<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">build_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3778
3779<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">metaparse</span><span class="special">;</span>
3780
3781<span class="keyword">using</span> <span class="identifier">exp_parser1</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
3782<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">entire_input</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3783
3784<span class="keyword">using</span> <span class="identifier">exp_parser2</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;;</span>
3785<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">token</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3786
3787<span class="keyword">using</span> <span class="identifier">exp_parser3</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;&gt;;</span>
3788<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">lit_c</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3789
3790<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">sequence</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3791
3792<span class="keyword">using</span> <span class="identifier">exp_parser4</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;&gt;;</span>
3793
3794<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">metashell</span><span class="special">/</span><span class="identifier">formatter</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3795
3796<span class="keyword">using</span> <span class="identifier">int_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
3797
3798<span class="keyword">using</span> <span class="identifier">plus_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;;</span>
3799
3800<span class="keyword">using</span> <span class="identifier">exp_parser5</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;;</span>
3801<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">transform</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3802
3803<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">plus</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3804
3805<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">at</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3806
3807<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">&gt;</span>
3808 <span class="keyword">struct</span> <span class="identifier">eval_plus</span> <span class="special">:</span>
3809   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span>
3810     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">,</span>
3811     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">2</span><span class="special">&gt;::</span><span class="identifier">type</span>
3812   <span class="special">&gt;</span> <span class="special">{};</span>
3813
3814<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">quote</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3815
3816<span class="keyword">using</span> <span class="identifier">exp_parser6</span> <span class="special">=</span>
3817 <span class="identifier">build_parser</span><span class="special">&lt;</span>
3818   <span class="identifier">transform</span><span class="special">&lt;</span>
3819     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
3820     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">eval_plus</span><span class="special">&gt;</span>
3821   <span class="special">&gt;</span>
3822 <span class="special">&gt;;</span>
3823<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">any</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3824
3825<span class="keyword">using</span> <span class="identifier">exp_parser7</span> <span class="special">=</span>
3826 <span class="identifier">build_parser</span><span class="special">&lt;</span>
3827   <span class="identifier">sequence</span><span class="special">&lt;</span>
3828     <span class="identifier">int_token</span><span class="special">,</span>                                <span class="comment">/* The first &lt;number&gt; */</span>
3829     <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;</span> <span class="comment">/* The "+ &lt;number&gt;" elements */</span>
3830   <span class="special">&gt;</span>
3831 <span class="special">&gt;;</span>
3832<span class="keyword">using</span> <span class="identifier">temp_result</span> <span class="special">=</span> <span class="identifier">exp_parser7</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 + 3 + 4"</span><span class="special">)&gt;::</span><span class="identifier">type</span><span class="special">;</span>
3833<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">fold</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3834
3835<span class="keyword">using</span> <span class="identifier">vector_of_numbers</span> <span class="special">=</span>
3836 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span>
3837   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">2</span><span class="special">&gt;,</span>
3838   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">5</span><span class="special">&gt;,</span>
3839   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">6</span><span class="special">&gt;</span>
3840 <span class="special">&gt;;</span>
3841
3842<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">&gt;</span>
3843 <span class="keyword">struct</span> <span class="identifier">sum_vector</span> <span class="special">:</span>
3844    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
3845      <span class="identifier">Vector</span><span class="special">,</span>
3846      <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
3847      <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
3848        <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_2</span><span class="special">&gt;</span>
3849      <span class="special">&gt;::</span><span class="identifier">type</span>
3850    <span class="special">&gt;</span>
3851  <span class="special">{};</span>
3852
3853<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Sum</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Item</span><span class="special">&gt;</span>
3854   <span class="keyword">struct</span> <span class="identifier">sum_items</span> <span class="special">:</span>
3855     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span>
3856       <span class="identifier">Sum</span><span class="special">,</span>
3857       <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;::</span><span class="identifier">type</span>
3858     <span class="special">&gt;</span>
3859 <span class="special">{};</span>
3860<span class="keyword">using</span> <span class="identifier">exp_parser8</span> <span class="special">=</span>
3861 <span class="identifier">build_parser</span><span class="special">&lt;</span>
3862   <span class="identifier">sequence</span><span class="special">&lt;</span>
3863     <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* parse the first &lt;number&gt; */</span>
3864     <span class="identifier">transform</span><span class="special">&lt;</span>
3865       <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;,</span> <span class="comment">/* parse the "+ &lt;number&gt;" elements */</span>
3866       <span class="comment">/* lambda expression summarising the "+ &lt;number&gt;" elements using fold */</span>
3867       <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
3868         <span class="comment">/* The folding expression we have just created */</span>
3869         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
3870           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span> <span class="comment">/* the argument of the lambda expression, the result */</span>
3871                           <span class="comment">/* of the repeated&lt;...&gt; parser */</span>
3872           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
3873           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
3874         <span class="special">&gt;</span>
3875       <span class="special">&gt;::</span><span class="identifier">type</span>
3876     <span class="special">&gt;</span>
3877   <span class="special">&gt;</span>
3878 <span class="special">&gt;;</span>
3879
3880<span class="keyword">using</span> <span class="identifier">exp_parser9</span> <span class="special">=</span>
3881 <span class="identifier">build_parser</span><span class="special">&lt;</span>
3882   <span class="identifier">transform</span><span class="special">&lt;</span>
3883     <span class="comment">/* What we had so far */</span>
3884     <span class="identifier">sequence</span><span class="special">&lt;</span>
3885       <span class="identifier">int_token</span><span class="special">,</span>
3886       <span class="identifier">transform</span><span class="special">&lt;</span>
3887         <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;,</span>
3888         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
3889           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
3890             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span>
3891             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
3892             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
3893           <span class="special">&gt;</span>
3894         <span class="special">&gt;::</span><span class="identifier">type</span>
3895       <span class="special">&gt;</span>
3896     <span class="special">&gt;,</span>
3897     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">sum_vector</span><span class="special">&gt;</span> <span class="comment">/* summarise the vector of numbers */</span>
3898   <span class="special">&gt;</span>
3899 <span class="special">&gt;;</span>
3900</pre>
3901<p>
3902        <a name="before_5_2_4"></a><span class="emphasis"><em>Definitions before section 5.2.4.</em></span>
3903      </p>
3904<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">string</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3905<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">int_</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3906
3907<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">build_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3908
3909<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">metaparse</span><span class="special">;</span>
3910
3911<span class="keyword">using</span> <span class="identifier">exp_parser1</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
3912<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">entire_input</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3913
3914<span class="keyword">using</span> <span class="identifier">exp_parser2</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;;</span>
3915<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">token</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3916
3917<span class="keyword">using</span> <span class="identifier">exp_parser3</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;&gt;;</span>
3918<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">lit_c</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3919
3920<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">sequence</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3921
3922<span class="keyword">using</span> <span class="identifier">exp_parser4</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;&gt;;</span>
3923
3924<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">metashell</span><span class="special">/</span><span class="identifier">formatter</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3925
3926<span class="keyword">using</span> <span class="identifier">int_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
3927
3928<span class="keyword">using</span> <span class="identifier">plus_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;;</span>
3929
3930<span class="keyword">using</span> <span class="identifier">exp_parser5</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;;</span>
3931<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">transform</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3932
3933<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">plus</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3934
3935<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">at</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3936
3937<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">&gt;</span>
3938 <span class="keyword">struct</span> <span class="identifier">eval_plus</span> <span class="special">:</span>
3939   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span>
3940     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">,</span>
3941     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">2</span><span class="special">&gt;::</span><span class="identifier">type</span>
3942   <span class="special">&gt;</span> <span class="special">{};</span>
3943
3944<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">quote</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3945
3946<span class="keyword">using</span> <span class="identifier">exp_parser6</span> <span class="special">=</span>
3947 <span class="identifier">build_parser</span><span class="special">&lt;</span>
3948   <span class="identifier">transform</span><span class="special">&lt;</span>
3949     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
3950     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">eval_plus</span><span class="special">&gt;</span>
3951   <span class="special">&gt;</span>
3952 <span class="special">&gt;;</span>
3953<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">any</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3954
3955<span class="keyword">using</span> <span class="identifier">exp_parser7</span> <span class="special">=</span>
3956 <span class="identifier">build_parser</span><span class="special">&lt;</span>
3957   <span class="identifier">sequence</span><span class="special">&lt;</span>
3958     <span class="identifier">int_token</span><span class="special">,</span>                                <span class="comment">/* The first &lt;number&gt; */</span>
3959     <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;</span> <span class="comment">/* The "+ &lt;number&gt;" elements */</span>
3960   <span class="special">&gt;</span>
3961 <span class="special">&gt;;</span>
3962<span class="keyword">using</span> <span class="identifier">temp_result</span> <span class="special">=</span> <span class="identifier">exp_parser7</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 + 3 + 4"</span><span class="special">)&gt;::</span><span class="identifier">type</span><span class="special">;</span>
3963<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">fold</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
3964
3965<span class="keyword">using</span> <span class="identifier">vector_of_numbers</span> <span class="special">=</span>
3966 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span>
3967   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">2</span><span class="special">&gt;,</span>
3968   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">5</span><span class="special">&gt;,</span>
3969   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">6</span><span class="special">&gt;</span>
3970 <span class="special">&gt;;</span>
3971
3972<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">&gt;</span>
3973 <span class="keyword">struct</span> <span class="identifier">sum_vector</span> <span class="special">:</span>
3974    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
3975      <span class="identifier">Vector</span><span class="special">,</span>
3976      <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
3977      <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
3978        <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_2</span><span class="special">&gt;</span>
3979      <span class="special">&gt;::</span><span class="identifier">type</span>
3980    <span class="special">&gt;</span>
3981  <span class="special">{};</span>
3982
3983<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Sum</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Item</span><span class="special">&gt;</span>
3984   <span class="keyword">struct</span> <span class="identifier">sum_items</span> <span class="special">:</span>
3985     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span>
3986       <span class="identifier">Sum</span><span class="special">,</span>
3987       <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;::</span><span class="identifier">type</span>
3988     <span class="special">&gt;</span>
3989 <span class="special">{};</span>
3990<span class="keyword">using</span> <span class="identifier">exp_parser8</span> <span class="special">=</span>
3991 <span class="identifier">build_parser</span><span class="special">&lt;</span>
3992   <span class="identifier">sequence</span><span class="special">&lt;</span>
3993     <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* parse the first &lt;number&gt; */</span>
3994     <span class="identifier">transform</span><span class="special">&lt;</span>
3995       <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;,</span> <span class="comment">/* parse the "+ &lt;number&gt;" elements */</span>
3996       <span class="comment">/* lambda expression summarising the "+ &lt;number&gt;" elements using fold */</span>
3997       <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
3998         <span class="comment">/* The folding expression we have just created */</span>
3999         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
4000           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span> <span class="comment">/* the argument of the lambda expression, the result */</span>
4001                           <span class="comment">/* of the repeated&lt;...&gt; parser */</span>
4002           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
4003           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
4004         <span class="special">&gt;</span>
4005       <span class="special">&gt;::</span><span class="identifier">type</span>
4006     <span class="special">&gt;</span>
4007   <span class="special">&gt;</span>
4008 <span class="special">&gt;;</span>
4009
4010<span class="keyword">using</span> <span class="identifier">exp_parser9</span> <span class="special">=</span>
4011 <span class="identifier">build_parser</span><span class="special">&lt;</span>
4012   <span class="identifier">transform</span><span class="special">&lt;</span>
4013     <span class="comment">/* What we had so far */</span>
4014     <span class="identifier">sequence</span><span class="special">&lt;</span>
4015       <span class="identifier">int_token</span><span class="special">,</span>
4016       <span class="identifier">transform</span><span class="special">&lt;</span>
4017         <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;,</span>
4018         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
4019           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
4020             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span>
4021             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
4022             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
4023           <span class="special">&gt;</span>
4024         <span class="special">&gt;::</span><span class="identifier">type</span>
4025       <span class="special">&gt;</span>
4026     <span class="special">&gt;,</span>
4027     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">sum_vector</span><span class="special">&gt;</span> <span class="comment">/* summarise the vector of numbers */</span>
4028   <span class="special">&gt;</span>
4029 <span class="special">&gt;;</span>
4030<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">foldl</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4031
4032<span class="keyword">using</span> <span class="identifier">exp_parser10</span> <span class="special">=</span>
4033 <span class="identifier">build_parser</span><span class="special">&lt;</span>
4034   <span class="identifier">transform</span><span class="special">&lt;</span>
4035     <span class="identifier">sequence</span><span class="special">&lt;</span>
4036       <span class="identifier">int_token</span><span class="special">,</span>
4037       <span class="identifier">foldl</span><span class="special">&lt;</span>
4038         <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
4039         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
4040         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
4041       <span class="special">&gt;</span>
4042     <span class="special">&gt;,</span>
4043     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">sum_vector</span><span class="special">&gt;&gt;</span>
4044 <span class="special">&gt;;</span>
4045</pre>
4046<p>
4047        <a name="before_6"></a><span class="emphasis"><em>Definitions before section 6.</em></span>
4048      </p>
4049<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">string</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4050<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">int_</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4051
4052<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">build_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4053
4054<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">metaparse</span><span class="special">;</span>
4055
4056<span class="keyword">using</span> <span class="identifier">exp_parser1</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
4057<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">entire_input</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4058
4059<span class="keyword">using</span> <span class="identifier">exp_parser2</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;;</span>
4060<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">token</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4061
4062<span class="keyword">using</span> <span class="identifier">exp_parser3</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;&gt;;</span>
4063<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">lit_c</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4064
4065<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">sequence</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4066
4067<span class="keyword">using</span> <span class="identifier">exp_parser4</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;&gt;;</span>
4068
4069<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">metashell</span><span class="special">/</span><span class="identifier">formatter</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4070
4071<span class="keyword">using</span> <span class="identifier">int_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
4072
4073<span class="keyword">using</span> <span class="identifier">plus_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;;</span>
4074
4075<span class="keyword">using</span> <span class="identifier">exp_parser5</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;;</span>
4076<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">transform</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4077
4078<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">plus</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4079
4080<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">at</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4081
4082<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">&gt;</span>
4083 <span class="keyword">struct</span> <span class="identifier">eval_plus</span> <span class="special">:</span>
4084   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span>
4085     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">,</span>
4086     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">2</span><span class="special">&gt;::</span><span class="identifier">type</span>
4087   <span class="special">&gt;</span> <span class="special">{};</span>
4088
4089<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">quote</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4090
4091<span class="keyword">using</span> <span class="identifier">exp_parser6</span> <span class="special">=</span>
4092 <span class="identifier">build_parser</span><span class="special">&lt;</span>
4093   <span class="identifier">transform</span><span class="special">&lt;</span>
4094     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
4095     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">eval_plus</span><span class="special">&gt;</span>
4096   <span class="special">&gt;</span>
4097 <span class="special">&gt;;</span>
4098<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">any</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4099
4100<span class="keyword">using</span> <span class="identifier">exp_parser7</span> <span class="special">=</span>
4101 <span class="identifier">build_parser</span><span class="special">&lt;</span>
4102   <span class="identifier">sequence</span><span class="special">&lt;</span>
4103     <span class="identifier">int_token</span><span class="special">,</span>                                <span class="comment">/* The first &lt;number&gt; */</span>
4104     <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;</span> <span class="comment">/* The "+ &lt;number&gt;" elements */</span>
4105   <span class="special">&gt;</span>
4106 <span class="special">&gt;;</span>
4107<span class="keyword">using</span> <span class="identifier">temp_result</span> <span class="special">=</span> <span class="identifier">exp_parser7</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 + 3 + 4"</span><span class="special">)&gt;::</span><span class="identifier">type</span><span class="special">;</span>
4108<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">fold</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4109
4110<span class="keyword">using</span> <span class="identifier">vector_of_numbers</span> <span class="special">=</span>
4111 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span>
4112   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">2</span><span class="special">&gt;,</span>
4113   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">5</span><span class="special">&gt;,</span>
4114   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">6</span><span class="special">&gt;</span>
4115 <span class="special">&gt;;</span>
4116
4117<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">&gt;</span>
4118 <span class="keyword">struct</span> <span class="identifier">sum_vector</span> <span class="special">:</span>
4119    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
4120      <span class="identifier">Vector</span><span class="special">,</span>
4121      <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
4122      <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
4123        <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_2</span><span class="special">&gt;</span>
4124      <span class="special">&gt;::</span><span class="identifier">type</span>
4125    <span class="special">&gt;</span>
4126  <span class="special">{};</span>
4127
4128<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Sum</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Item</span><span class="special">&gt;</span>
4129   <span class="keyword">struct</span> <span class="identifier">sum_items</span> <span class="special">:</span>
4130     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span>
4131       <span class="identifier">Sum</span><span class="special">,</span>
4132       <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;::</span><span class="identifier">type</span>
4133     <span class="special">&gt;</span>
4134 <span class="special">{};</span>
4135<span class="keyword">using</span> <span class="identifier">exp_parser8</span> <span class="special">=</span>
4136 <span class="identifier">build_parser</span><span class="special">&lt;</span>
4137   <span class="identifier">sequence</span><span class="special">&lt;</span>
4138     <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* parse the first &lt;number&gt; */</span>
4139     <span class="identifier">transform</span><span class="special">&lt;</span>
4140       <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;,</span> <span class="comment">/* parse the "+ &lt;number&gt;" elements */</span>
4141       <span class="comment">/* lambda expression summarising the "+ &lt;number&gt;" elements using fold */</span>
4142       <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
4143         <span class="comment">/* The folding expression we have just created */</span>
4144         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
4145           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span> <span class="comment">/* the argument of the lambda expression, the result */</span>
4146                           <span class="comment">/* of the repeated&lt;...&gt; parser */</span>
4147           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
4148           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
4149         <span class="special">&gt;</span>
4150       <span class="special">&gt;::</span><span class="identifier">type</span>
4151     <span class="special">&gt;</span>
4152   <span class="special">&gt;</span>
4153 <span class="special">&gt;;</span>
4154
4155<span class="keyword">using</span> <span class="identifier">exp_parser9</span> <span class="special">=</span>
4156 <span class="identifier">build_parser</span><span class="special">&lt;</span>
4157   <span class="identifier">transform</span><span class="special">&lt;</span>
4158     <span class="comment">/* What we had so far */</span>
4159     <span class="identifier">sequence</span><span class="special">&lt;</span>
4160       <span class="identifier">int_token</span><span class="special">,</span>
4161       <span class="identifier">transform</span><span class="special">&lt;</span>
4162         <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;,</span>
4163         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
4164           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
4165             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span>
4166             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
4167             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
4168           <span class="special">&gt;</span>
4169         <span class="special">&gt;::</span><span class="identifier">type</span>
4170       <span class="special">&gt;</span>
4171     <span class="special">&gt;,</span>
4172     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">sum_vector</span><span class="special">&gt;</span> <span class="comment">/* summarise the vector of numbers */</span>
4173   <span class="special">&gt;</span>
4174 <span class="special">&gt;;</span>
4175<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">foldl</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4176
4177<span class="keyword">using</span> <span class="identifier">exp_parser10</span> <span class="special">=</span>
4178 <span class="identifier">build_parser</span><span class="special">&lt;</span>
4179   <span class="identifier">transform</span><span class="special">&lt;</span>
4180     <span class="identifier">sequence</span><span class="special">&lt;</span>
4181       <span class="identifier">int_token</span><span class="special">,</span>
4182       <span class="identifier">foldl</span><span class="special">&lt;</span>
4183         <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
4184         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
4185         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
4186       <span class="special">&gt;</span>
4187     <span class="special">&gt;,</span>
4188     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">sum_vector</span><span class="special">&gt;&gt;</span>
4189 <span class="special">&gt;;</span>
4190<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">foldl_start_with_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4191
4192<span class="keyword">using</span> <span class="identifier">exp_parser11</span> <span class="special">=</span>
4193 <span class="identifier">build_parser</span><span class="special">&lt;</span>
4194   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
4195     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span> <span class="comment">/* apply this parser repeatedly */</span>
4196     <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* use this parser to get the initial value */</span>
4197     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span> <span class="comment">/* use this function to add a new value to the summary */</span>
4198   <span class="special">&gt;</span>
4199 <span class="special">&gt;;</span>
4200</pre>
4201<p>
4202        <a name="before_6_1"></a><span class="emphasis"><em>Definitions before section 6.1.</em></span>
4203      </p>
4204<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">string</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4205<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">int_</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4206
4207<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">build_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4208
4209<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">metaparse</span><span class="special">;</span>
4210
4211<span class="keyword">using</span> <span class="identifier">exp_parser1</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
4212<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">entire_input</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4213
4214<span class="keyword">using</span> <span class="identifier">exp_parser2</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;;</span>
4215<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">token</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4216
4217<span class="keyword">using</span> <span class="identifier">exp_parser3</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;&gt;;</span>
4218<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">lit_c</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4219
4220<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">sequence</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4221
4222<span class="keyword">using</span> <span class="identifier">exp_parser4</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;&gt;;</span>
4223
4224<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">metashell</span><span class="special">/</span><span class="identifier">formatter</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4225
4226<span class="keyword">using</span> <span class="identifier">int_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
4227
4228<span class="keyword">using</span> <span class="identifier">plus_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;;</span>
4229
4230<span class="keyword">using</span> <span class="identifier">exp_parser5</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;;</span>
4231<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">transform</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4232
4233<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">plus</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4234
4235<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">at</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4236
4237<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">&gt;</span>
4238 <span class="keyword">struct</span> <span class="identifier">eval_plus</span> <span class="special">:</span>
4239   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span>
4240     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">,</span>
4241     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">2</span><span class="special">&gt;::</span><span class="identifier">type</span>
4242   <span class="special">&gt;</span> <span class="special">{};</span>
4243
4244<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">quote</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4245
4246<span class="keyword">using</span> <span class="identifier">exp_parser6</span> <span class="special">=</span>
4247 <span class="identifier">build_parser</span><span class="special">&lt;</span>
4248   <span class="identifier">transform</span><span class="special">&lt;</span>
4249     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
4250     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">eval_plus</span><span class="special">&gt;</span>
4251   <span class="special">&gt;</span>
4252 <span class="special">&gt;;</span>
4253<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">any</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4254
4255<span class="keyword">using</span> <span class="identifier">exp_parser7</span> <span class="special">=</span>
4256 <span class="identifier">build_parser</span><span class="special">&lt;</span>
4257   <span class="identifier">sequence</span><span class="special">&lt;</span>
4258     <span class="identifier">int_token</span><span class="special">,</span>                                <span class="comment">/* The first &lt;number&gt; */</span>
4259     <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;</span> <span class="comment">/* The "+ &lt;number&gt;" elements */</span>
4260   <span class="special">&gt;</span>
4261 <span class="special">&gt;;</span>
4262<span class="keyword">using</span> <span class="identifier">temp_result</span> <span class="special">=</span> <span class="identifier">exp_parser7</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 + 3 + 4"</span><span class="special">)&gt;::</span><span class="identifier">type</span><span class="special">;</span>
4263<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">fold</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4264
4265<span class="keyword">using</span> <span class="identifier">vector_of_numbers</span> <span class="special">=</span>
4266 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span>
4267   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">2</span><span class="special">&gt;,</span>
4268   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">5</span><span class="special">&gt;,</span>
4269   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">6</span><span class="special">&gt;</span>
4270 <span class="special">&gt;;</span>
4271
4272<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">&gt;</span>
4273 <span class="keyword">struct</span> <span class="identifier">sum_vector</span> <span class="special">:</span>
4274    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
4275      <span class="identifier">Vector</span><span class="special">,</span>
4276      <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
4277      <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
4278        <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_2</span><span class="special">&gt;</span>
4279      <span class="special">&gt;::</span><span class="identifier">type</span>
4280    <span class="special">&gt;</span>
4281  <span class="special">{};</span>
4282
4283<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Sum</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Item</span><span class="special">&gt;</span>
4284   <span class="keyword">struct</span> <span class="identifier">sum_items</span> <span class="special">:</span>
4285     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span>
4286       <span class="identifier">Sum</span><span class="special">,</span>
4287       <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;::</span><span class="identifier">type</span>
4288     <span class="special">&gt;</span>
4289 <span class="special">{};</span>
4290<span class="keyword">using</span> <span class="identifier">exp_parser8</span> <span class="special">=</span>
4291 <span class="identifier">build_parser</span><span class="special">&lt;</span>
4292   <span class="identifier">sequence</span><span class="special">&lt;</span>
4293     <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* parse the first &lt;number&gt; */</span>
4294     <span class="identifier">transform</span><span class="special">&lt;</span>
4295       <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;,</span> <span class="comment">/* parse the "+ &lt;number&gt;" elements */</span>
4296       <span class="comment">/* lambda expression summarising the "+ &lt;number&gt;" elements using fold */</span>
4297       <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
4298         <span class="comment">/* The folding expression we have just created */</span>
4299         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
4300           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span> <span class="comment">/* the argument of the lambda expression, the result */</span>
4301                           <span class="comment">/* of the repeated&lt;...&gt; parser */</span>
4302           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
4303           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
4304         <span class="special">&gt;</span>
4305       <span class="special">&gt;::</span><span class="identifier">type</span>
4306     <span class="special">&gt;</span>
4307   <span class="special">&gt;</span>
4308 <span class="special">&gt;;</span>
4309
4310<span class="keyword">using</span> <span class="identifier">exp_parser9</span> <span class="special">=</span>
4311 <span class="identifier">build_parser</span><span class="special">&lt;</span>
4312   <span class="identifier">transform</span><span class="special">&lt;</span>
4313     <span class="comment">/* What we had so far */</span>
4314     <span class="identifier">sequence</span><span class="special">&lt;</span>
4315       <span class="identifier">int_token</span><span class="special">,</span>
4316       <span class="identifier">transform</span><span class="special">&lt;</span>
4317         <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;,</span>
4318         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
4319           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
4320             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span>
4321             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
4322             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
4323           <span class="special">&gt;</span>
4324         <span class="special">&gt;::</span><span class="identifier">type</span>
4325       <span class="special">&gt;</span>
4326     <span class="special">&gt;,</span>
4327     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">sum_vector</span><span class="special">&gt;</span> <span class="comment">/* summarise the vector of numbers */</span>
4328   <span class="special">&gt;</span>
4329 <span class="special">&gt;;</span>
4330<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">foldl</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4331
4332<span class="keyword">using</span> <span class="identifier">exp_parser10</span> <span class="special">=</span>
4333 <span class="identifier">build_parser</span><span class="special">&lt;</span>
4334   <span class="identifier">transform</span><span class="special">&lt;</span>
4335     <span class="identifier">sequence</span><span class="special">&lt;</span>
4336       <span class="identifier">int_token</span><span class="special">,</span>
4337       <span class="identifier">foldl</span><span class="special">&lt;</span>
4338         <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
4339         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
4340         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
4341       <span class="special">&gt;</span>
4342     <span class="special">&gt;,</span>
4343     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">sum_vector</span><span class="special">&gt;&gt;</span>
4344 <span class="special">&gt;;</span>
4345<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">foldl_start_with_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4346
4347<span class="keyword">using</span> <span class="identifier">exp_parser11</span> <span class="special">=</span>
4348 <span class="identifier">build_parser</span><span class="special">&lt;</span>
4349   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
4350     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span> <span class="comment">/* apply this parser repeatedly */</span>
4351     <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* use this parser to get the initial value */</span>
4352     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span> <span class="comment">/* use this function to add a new value to the summary */</span>
4353   <span class="special">&gt;</span>
4354 <span class="special">&gt;;</span>
4355</pre>
4356<p>
4357        <a name="before_6_2"></a><span class="emphasis"><em>Definitions before section 6.2.</em></span>
4358      </p>
4359<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">string</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4360<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">int_</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4361
4362<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">build_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4363
4364<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">metaparse</span><span class="special">;</span>
4365
4366<span class="keyword">using</span> <span class="identifier">exp_parser1</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
4367<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">entire_input</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4368
4369<span class="keyword">using</span> <span class="identifier">exp_parser2</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;;</span>
4370<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">token</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4371
4372<span class="keyword">using</span> <span class="identifier">exp_parser3</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;&gt;;</span>
4373<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">lit_c</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4374
4375<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">sequence</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4376
4377<span class="keyword">using</span> <span class="identifier">exp_parser4</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;&gt;;</span>
4378
4379<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">metashell</span><span class="special">/</span><span class="identifier">formatter</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4380
4381<span class="keyword">using</span> <span class="identifier">int_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
4382
4383<span class="keyword">using</span> <span class="identifier">plus_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;;</span>
4384
4385<span class="keyword">using</span> <span class="identifier">exp_parser5</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;;</span>
4386<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">transform</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4387
4388<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">plus</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4389
4390<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">at</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4391
4392<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">&gt;</span>
4393 <span class="keyword">struct</span> <span class="identifier">eval_plus</span> <span class="special">:</span>
4394   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span>
4395     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">,</span>
4396     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">2</span><span class="special">&gt;::</span><span class="identifier">type</span>
4397   <span class="special">&gt;</span> <span class="special">{};</span>
4398
4399<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">quote</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4400
4401<span class="keyword">using</span> <span class="identifier">exp_parser6</span> <span class="special">=</span>
4402 <span class="identifier">build_parser</span><span class="special">&lt;</span>
4403   <span class="identifier">transform</span><span class="special">&lt;</span>
4404     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
4405     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">eval_plus</span><span class="special">&gt;</span>
4406   <span class="special">&gt;</span>
4407 <span class="special">&gt;;</span>
4408<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">any</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4409
4410<span class="keyword">using</span> <span class="identifier">exp_parser7</span> <span class="special">=</span>
4411 <span class="identifier">build_parser</span><span class="special">&lt;</span>
4412   <span class="identifier">sequence</span><span class="special">&lt;</span>
4413     <span class="identifier">int_token</span><span class="special">,</span>                                <span class="comment">/* The first &lt;number&gt; */</span>
4414     <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;</span> <span class="comment">/* The "+ &lt;number&gt;" elements */</span>
4415   <span class="special">&gt;</span>
4416 <span class="special">&gt;;</span>
4417<span class="keyword">using</span> <span class="identifier">temp_result</span> <span class="special">=</span> <span class="identifier">exp_parser7</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 + 3 + 4"</span><span class="special">)&gt;::</span><span class="identifier">type</span><span class="special">;</span>
4418<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">fold</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4419
4420<span class="keyword">using</span> <span class="identifier">vector_of_numbers</span> <span class="special">=</span>
4421 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span>
4422   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">2</span><span class="special">&gt;,</span>
4423   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">5</span><span class="special">&gt;,</span>
4424   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">6</span><span class="special">&gt;</span>
4425 <span class="special">&gt;;</span>
4426
4427<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">&gt;</span>
4428 <span class="keyword">struct</span> <span class="identifier">sum_vector</span> <span class="special">:</span>
4429    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
4430      <span class="identifier">Vector</span><span class="special">,</span>
4431      <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
4432      <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
4433        <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_2</span><span class="special">&gt;</span>
4434      <span class="special">&gt;::</span><span class="identifier">type</span>
4435    <span class="special">&gt;</span>
4436  <span class="special">{};</span>
4437
4438<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Sum</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Item</span><span class="special">&gt;</span>
4439   <span class="keyword">struct</span> <span class="identifier">sum_items</span> <span class="special">:</span>
4440     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span>
4441       <span class="identifier">Sum</span><span class="special">,</span>
4442       <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;::</span><span class="identifier">type</span>
4443     <span class="special">&gt;</span>
4444 <span class="special">{};</span>
4445<span class="keyword">using</span> <span class="identifier">exp_parser8</span> <span class="special">=</span>
4446 <span class="identifier">build_parser</span><span class="special">&lt;</span>
4447   <span class="identifier">sequence</span><span class="special">&lt;</span>
4448     <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* parse the first &lt;number&gt; */</span>
4449     <span class="identifier">transform</span><span class="special">&lt;</span>
4450       <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;,</span> <span class="comment">/* parse the "+ &lt;number&gt;" elements */</span>
4451       <span class="comment">/* lambda expression summarising the "+ &lt;number&gt;" elements using fold */</span>
4452       <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
4453         <span class="comment">/* The folding expression we have just created */</span>
4454         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
4455           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span> <span class="comment">/* the argument of the lambda expression, the result */</span>
4456                           <span class="comment">/* of the repeated&lt;...&gt; parser */</span>
4457           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
4458           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
4459         <span class="special">&gt;</span>
4460       <span class="special">&gt;::</span><span class="identifier">type</span>
4461     <span class="special">&gt;</span>
4462   <span class="special">&gt;</span>
4463 <span class="special">&gt;;</span>
4464
4465<span class="keyword">using</span> <span class="identifier">exp_parser9</span> <span class="special">=</span>
4466 <span class="identifier">build_parser</span><span class="special">&lt;</span>
4467   <span class="identifier">transform</span><span class="special">&lt;</span>
4468     <span class="comment">/* What we had so far */</span>
4469     <span class="identifier">sequence</span><span class="special">&lt;</span>
4470       <span class="identifier">int_token</span><span class="special">,</span>
4471       <span class="identifier">transform</span><span class="special">&lt;</span>
4472         <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;,</span>
4473         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
4474           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
4475             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span>
4476             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
4477             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
4478           <span class="special">&gt;</span>
4479         <span class="special">&gt;::</span><span class="identifier">type</span>
4480       <span class="special">&gt;</span>
4481     <span class="special">&gt;,</span>
4482     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">sum_vector</span><span class="special">&gt;</span> <span class="comment">/* summarise the vector of numbers */</span>
4483   <span class="special">&gt;</span>
4484 <span class="special">&gt;;</span>
4485<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">foldl</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4486
4487<span class="keyword">using</span> <span class="identifier">exp_parser10</span> <span class="special">=</span>
4488 <span class="identifier">build_parser</span><span class="special">&lt;</span>
4489   <span class="identifier">transform</span><span class="special">&lt;</span>
4490     <span class="identifier">sequence</span><span class="special">&lt;</span>
4491       <span class="identifier">int_token</span><span class="special">,</span>
4492       <span class="identifier">foldl</span><span class="special">&lt;</span>
4493         <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
4494         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
4495         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
4496       <span class="special">&gt;</span>
4497     <span class="special">&gt;,</span>
4498     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">sum_vector</span><span class="special">&gt;&gt;</span>
4499 <span class="special">&gt;;</span>
4500<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">foldl_start_with_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4501
4502<span class="keyword">using</span> <span class="identifier">exp_parser11</span> <span class="special">=</span>
4503 <span class="identifier">build_parser</span><span class="special">&lt;</span>
4504   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
4505     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span> <span class="comment">/* apply this parser repeatedly */</span>
4506     <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* use this parser to get the initial value */</span>
4507     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span> <span class="comment">/* use this function to add a new value to the summary */</span>
4508   <span class="special">&gt;</span>
4509 <span class="special">&gt;;</span>
4510<span class="keyword">using</span> <span class="identifier">minus_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'-'</span><span class="special">&gt;&gt;;</span>
4511
4512<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">one_of</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4513
4514<span class="keyword">using</span> <span class="identifier">exp_parser12</span> <span class="special">=</span>
4515 <span class="identifier">build_parser</span><span class="special">&lt;</span>
4516   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
4517     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
4518     <span class="identifier">int_token</span><span class="special">,</span>
4519     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
4520   <span class="special">&gt;</span>
4521 <span class="special">&gt;;</span>
4522</pre>
4523<p>
4524        <a name="before_7"></a><span class="emphasis"><em>Definitions before section 7.</em></span>
4525      </p>
4526<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">string</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4527<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">int_</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4528
4529<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">build_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4530
4531<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">metaparse</span><span class="special">;</span>
4532
4533<span class="keyword">using</span> <span class="identifier">exp_parser1</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
4534<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">entire_input</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4535
4536<span class="keyword">using</span> <span class="identifier">exp_parser2</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;;</span>
4537<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">token</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4538
4539<span class="keyword">using</span> <span class="identifier">exp_parser3</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;&gt;;</span>
4540<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">lit_c</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4541
4542<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">sequence</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4543
4544<span class="keyword">using</span> <span class="identifier">exp_parser4</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;&gt;;</span>
4545
4546<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">metashell</span><span class="special">/</span><span class="identifier">formatter</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4547
4548<span class="keyword">using</span> <span class="identifier">int_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
4549
4550<span class="keyword">using</span> <span class="identifier">plus_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;;</span>
4551
4552<span class="keyword">using</span> <span class="identifier">exp_parser5</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;;</span>
4553<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">transform</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4554
4555<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">plus</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4556
4557<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">at</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4558
4559<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">&gt;</span>
4560 <span class="keyword">struct</span> <span class="identifier">eval_plus</span> <span class="special">:</span>
4561   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span>
4562     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">,</span>
4563     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">2</span><span class="special">&gt;::</span><span class="identifier">type</span>
4564   <span class="special">&gt;</span> <span class="special">{};</span>
4565
4566<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">quote</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4567
4568<span class="keyword">using</span> <span class="identifier">exp_parser6</span> <span class="special">=</span>
4569 <span class="identifier">build_parser</span><span class="special">&lt;</span>
4570   <span class="identifier">transform</span><span class="special">&lt;</span>
4571     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
4572     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">eval_plus</span><span class="special">&gt;</span>
4573   <span class="special">&gt;</span>
4574 <span class="special">&gt;;</span>
4575<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">any</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4576
4577<span class="keyword">using</span> <span class="identifier">exp_parser7</span> <span class="special">=</span>
4578 <span class="identifier">build_parser</span><span class="special">&lt;</span>
4579   <span class="identifier">sequence</span><span class="special">&lt;</span>
4580     <span class="identifier">int_token</span><span class="special">,</span>                                <span class="comment">/* The first &lt;number&gt; */</span>
4581     <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;</span> <span class="comment">/* The "+ &lt;number&gt;" elements */</span>
4582   <span class="special">&gt;</span>
4583 <span class="special">&gt;;</span>
4584<span class="keyword">using</span> <span class="identifier">temp_result</span> <span class="special">=</span> <span class="identifier">exp_parser7</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 + 3 + 4"</span><span class="special">)&gt;::</span><span class="identifier">type</span><span class="special">;</span>
4585<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">fold</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4586
4587<span class="keyword">using</span> <span class="identifier">vector_of_numbers</span> <span class="special">=</span>
4588 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span>
4589   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">2</span><span class="special">&gt;,</span>
4590   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">5</span><span class="special">&gt;,</span>
4591   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">6</span><span class="special">&gt;</span>
4592 <span class="special">&gt;;</span>
4593
4594<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">&gt;</span>
4595 <span class="keyword">struct</span> <span class="identifier">sum_vector</span> <span class="special">:</span>
4596    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
4597      <span class="identifier">Vector</span><span class="special">,</span>
4598      <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
4599      <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
4600        <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_2</span><span class="special">&gt;</span>
4601      <span class="special">&gt;::</span><span class="identifier">type</span>
4602    <span class="special">&gt;</span>
4603  <span class="special">{};</span>
4604
4605<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Sum</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Item</span><span class="special">&gt;</span>
4606   <span class="keyword">struct</span> <span class="identifier">sum_items</span> <span class="special">:</span>
4607     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span>
4608       <span class="identifier">Sum</span><span class="special">,</span>
4609       <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;::</span><span class="identifier">type</span>
4610     <span class="special">&gt;</span>
4611 <span class="special">{};</span>
4612<span class="keyword">using</span> <span class="identifier">exp_parser8</span> <span class="special">=</span>
4613 <span class="identifier">build_parser</span><span class="special">&lt;</span>
4614   <span class="identifier">sequence</span><span class="special">&lt;</span>
4615     <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* parse the first &lt;number&gt; */</span>
4616     <span class="identifier">transform</span><span class="special">&lt;</span>
4617       <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;,</span> <span class="comment">/* parse the "+ &lt;number&gt;" elements */</span>
4618       <span class="comment">/* lambda expression summarising the "+ &lt;number&gt;" elements using fold */</span>
4619       <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
4620         <span class="comment">/* The folding expression we have just created */</span>
4621         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
4622           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span> <span class="comment">/* the argument of the lambda expression, the result */</span>
4623                           <span class="comment">/* of the repeated&lt;...&gt; parser */</span>
4624           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
4625           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
4626         <span class="special">&gt;</span>
4627       <span class="special">&gt;::</span><span class="identifier">type</span>
4628     <span class="special">&gt;</span>
4629   <span class="special">&gt;</span>
4630 <span class="special">&gt;;</span>
4631
4632<span class="keyword">using</span> <span class="identifier">exp_parser9</span> <span class="special">=</span>
4633 <span class="identifier">build_parser</span><span class="special">&lt;</span>
4634   <span class="identifier">transform</span><span class="special">&lt;</span>
4635     <span class="comment">/* What we had so far */</span>
4636     <span class="identifier">sequence</span><span class="special">&lt;</span>
4637       <span class="identifier">int_token</span><span class="special">,</span>
4638       <span class="identifier">transform</span><span class="special">&lt;</span>
4639         <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;,</span>
4640         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
4641           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
4642             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span>
4643             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
4644             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
4645           <span class="special">&gt;</span>
4646         <span class="special">&gt;::</span><span class="identifier">type</span>
4647       <span class="special">&gt;</span>
4648     <span class="special">&gt;,</span>
4649     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">sum_vector</span><span class="special">&gt;</span> <span class="comment">/* summarise the vector of numbers */</span>
4650   <span class="special">&gt;</span>
4651 <span class="special">&gt;;</span>
4652<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">foldl</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4653
4654<span class="keyword">using</span> <span class="identifier">exp_parser10</span> <span class="special">=</span>
4655 <span class="identifier">build_parser</span><span class="special">&lt;</span>
4656   <span class="identifier">transform</span><span class="special">&lt;</span>
4657     <span class="identifier">sequence</span><span class="special">&lt;</span>
4658       <span class="identifier">int_token</span><span class="special">,</span>
4659       <span class="identifier">foldl</span><span class="special">&lt;</span>
4660         <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
4661         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
4662         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
4663       <span class="special">&gt;</span>
4664     <span class="special">&gt;,</span>
4665     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">sum_vector</span><span class="special">&gt;&gt;</span>
4666 <span class="special">&gt;;</span>
4667<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">foldl_start_with_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4668
4669<span class="keyword">using</span> <span class="identifier">exp_parser11</span> <span class="special">=</span>
4670 <span class="identifier">build_parser</span><span class="special">&lt;</span>
4671   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
4672     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span> <span class="comment">/* apply this parser repeatedly */</span>
4673     <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* use this parser to get the initial value */</span>
4674     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span> <span class="comment">/* use this function to add a new value to the summary */</span>
4675   <span class="special">&gt;</span>
4676 <span class="special">&gt;;</span>
4677<span class="keyword">using</span> <span class="identifier">minus_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'-'</span><span class="special">&gt;&gt;;</span>
4678
4679<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">one_of</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4680
4681<span class="keyword">using</span> <span class="identifier">exp_parser12</span> <span class="special">=</span>
4682 <span class="identifier">build_parser</span><span class="special">&lt;</span>
4683   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
4684     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
4685     <span class="identifier">int_token</span><span class="special">,</span>
4686     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
4687   <span class="special">&gt;</span>
4688 <span class="special">&gt;;</span>
4689<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">minus</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4690
4691<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">char</span> <span class="identifier">Op</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">;</span>
4692
4693<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'+'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
4694
4695<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'-'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">minus</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
4696
4697<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">S</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Item</span><span class="special">&gt;</span>
4698 <span class="keyword">struct</span> <span class="identifier">binary_op</span> <span class="special">:</span>
4699   <span class="identifier">eval_binary_op</span><span class="special">&lt;</span>
4700     <span class="identifier">S</span><span class="special">,</span>
4701     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">::</span><span class="identifier">value</span><span class="special">,</span>
4702     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;::</span><span class="identifier">type</span>
4703   <span class="special">&gt;</span>
4704   <span class="special">{};</span>
4705
4706<span class="keyword">using</span> <span class="identifier">exp_parser13</span> <span class="special">=</span>
4707 <span class="identifier">build_parser</span><span class="special">&lt;</span>
4708   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
4709     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
4710     <span class="identifier">int_token</span><span class="special">,</span>
4711     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
4712   <span class="special">&gt;</span>
4713 <span class="special">&gt;;</span>
4714</pre>
4715<p>
4716        <a name="before_7_1"></a><span class="emphasis"><em>Definitions before section 7.1.</em></span>
4717      </p>
4718<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">string</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4719<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">int_</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4720
4721<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">build_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4722
4723<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">metaparse</span><span class="special">;</span>
4724
4725<span class="keyword">using</span> <span class="identifier">exp_parser1</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
4726<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">entire_input</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4727
4728<span class="keyword">using</span> <span class="identifier">exp_parser2</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;;</span>
4729<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">token</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4730
4731<span class="keyword">using</span> <span class="identifier">exp_parser3</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;&gt;;</span>
4732<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">lit_c</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4733
4734<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">sequence</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4735
4736<span class="keyword">using</span> <span class="identifier">exp_parser4</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;&gt;;</span>
4737
4738<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">metashell</span><span class="special">/</span><span class="identifier">formatter</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4739
4740<span class="keyword">using</span> <span class="identifier">int_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
4741
4742<span class="keyword">using</span> <span class="identifier">plus_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;;</span>
4743
4744<span class="keyword">using</span> <span class="identifier">exp_parser5</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;;</span>
4745<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">transform</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4746
4747<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">plus</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4748
4749<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">at</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4750
4751<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">&gt;</span>
4752 <span class="keyword">struct</span> <span class="identifier">eval_plus</span> <span class="special">:</span>
4753   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span>
4754     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">,</span>
4755     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">2</span><span class="special">&gt;::</span><span class="identifier">type</span>
4756   <span class="special">&gt;</span> <span class="special">{};</span>
4757
4758<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">quote</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4759
4760<span class="keyword">using</span> <span class="identifier">exp_parser6</span> <span class="special">=</span>
4761 <span class="identifier">build_parser</span><span class="special">&lt;</span>
4762   <span class="identifier">transform</span><span class="special">&lt;</span>
4763     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
4764     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">eval_plus</span><span class="special">&gt;</span>
4765   <span class="special">&gt;</span>
4766 <span class="special">&gt;;</span>
4767<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">any</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4768
4769<span class="keyword">using</span> <span class="identifier">exp_parser7</span> <span class="special">=</span>
4770 <span class="identifier">build_parser</span><span class="special">&lt;</span>
4771   <span class="identifier">sequence</span><span class="special">&lt;</span>
4772     <span class="identifier">int_token</span><span class="special">,</span>                                <span class="comment">/* The first &lt;number&gt; */</span>
4773     <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;</span> <span class="comment">/* The "+ &lt;number&gt;" elements */</span>
4774   <span class="special">&gt;</span>
4775 <span class="special">&gt;;</span>
4776<span class="keyword">using</span> <span class="identifier">temp_result</span> <span class="special">=</span> <span class="identifier">exp_parser7</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 + 3 + 4"</span><span class="special">)&gt;::</span><span class="identifier">type</span><span class="special">;</span>
4777<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">fold</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4778
4779<span class="keyword">using</span> <span class="identifier">vector_of_numbers</span> <span class="special">=</span>
4780 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span>
4781   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">2</span><span class="special">&gt;,</span>
4782   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">5</span><span class="special">&gt;,</span>
4783   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">6</span><span class="special">&gt;</span>
4784 <span class="special">&gt;;</span>
4785
4786<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">&gt;</span>
4787 <span class="keyword">struct</span> <span class="identifier">sum_vector</span> <span class="special">:</span>
4788    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
4789      <span class="identifier">Vector</span><span class="special">,</span>
4790      <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
4791      <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
4792        <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_2</span><span class="special">&gt;</span>
4793      <span class="special">&gt;::</span><span class="identifier">type</span>
4794    <span class="special">&gt;</span>
4795  <span class="special">{};</span>
4796
4797<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Sum</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Item</span><span class="special">&gt;</span>
4798   <span class="keyword">struct</span> <span class="identifier">sum_items</span> <span class="special">:</span>
4799     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span>
4800       <span class="identifier">Sum</span><span class="special">,</span>
4801       <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;::</span><span class="identifier">type</span>
4802     <span class="special">&gt;</span>
4803 <span class="special">{};</span>
4804<span class="keyword">using</span> <span class="identifier">exp_parser8</span> <span class="special">=</span>
4805 <span class="identifier">build_parser</span><span class="special">&lt;</span>
4806   <span class="identifier">sequence</span><span class="special">&lt;</span>
4807     <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* parse the first &lt;number&gt; */</span>
4808     <span class="identifier">transform</span><span class="special">&lt;</span>
4809       <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;,</span> <span class="comment">/* parse the "+ &lt;number&gt;" elements */</span>
4810       <span class="comment">/* lambda expression summarising the "+ &lt;number&gt;" elements using fold */</span>
4811       <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
4812         <span class="comment">/* The folding expression we have just created */</span>
4813         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
4814           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span> <span class="comment">/* the argument of the lambda expression, the result */</span>
4815                           <span class="comment">/* of the repeated&lt;...&gt; parser */</span>
4816           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
4817           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
4818         <span class="special">&gt;</span>
4819       <span class="special">&gt;::</span><span class="identifier">type</span>
4820     <span class="special">&gt;</span>
4821   <span class="special">&gt;</span>
4822 <span class="special">&gt;;</span>
4823
4824<span class="keyword">using</span> <span class="identifier">exp_parser9</span> <span class="special">=</span>
4825 <span class="identifier">build_parser</span><span class="special">&lt;</span>
4826   <span class="identifier">transform</span><span class="special">&lt;</span>
4827     <span class="comment">/* What we had so far */</span>
4828     <span class="identifier">sequence</span><span class="special">&lt;</span>
4829       <span class="identifier">int_token</span><span class="special">,</span>
4830       <span class="identifier">transform</span><span class="special">&lt;</span>
4831         <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;,</span>
4832         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
4833           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
4834             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span>
4835             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
4836             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
4837           <span class="special">&gt;</span>
4838         <span class="special">&gt;::</span><span class="identifier">type</span>
4839       <span class="special">&gt;</span>
4840     <span class="special">&gt;,</span>
4841     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">sum_vector</span><span class="special">&gt;</span> <span class="comment">/* summarise the vector of numbers */</span>
4842   <span class="special">&gt;</span>
4843 <span class="special">&gt;;</span>
4844<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">foldl</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4845
4846<span class="keyword">using</span> <span class="identifier">exp_parser10</span> <span class="special">=</span>
4847 <span class="identifier">build_parser</span><span class="special">&lt;</span>
4848   <span class="identifier">transform</span><span class="special">&lt;</span>
4849     <span class="identifier">sequence</span><span class="special">&lt;</span>
4850       <span class="identifier">int_token</span><span class="special">,</span>
4851       <span class="identifier">foldl</span><span class="special">&lt;</span>
4852         <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
4853         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
4854         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
4855       <span class="special">&gt;</span>
4856     <span class="special">&gt;,</span>
4857     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">sum_vector</span><span class="special">&gt;&gt;</span>
4858 <span class="special">&gt;;</span>
4859<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">foldl_start_with_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4860
4861<span class="keyword">using</span> <span class="identifier">exp_parser11</span> <span class="special">=</span>
4862 <span class="identifier">build_parser</span><span class="special">&lt;</span>
4863   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
4864     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span> <span class="comment">/* apply this parser repeatedly */</span>
4865     <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* use this parser to get the initial value */</span>
4866     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span> <span class="comment">/* use this function to add a new value to the summary */</span>
4867   <span class="special">&gt;</span>
4868 <span class="special">&gt;;</span>
4869<span class="keyword">using</span> <span class="identifier">minus_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'-'</span><span class="special">&gt;&gt;;</span>
4870
4871<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">one_of</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4872
4873<span class="keyword">using</span> <span class="identifier">exp_parser12</span> <span class="special">=</span>
4874 <span class="identifier">build_parser</span><span class="special">&lt;</span>
4875   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
4876     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
4877     <span class="identifier">int_token</span><span class="special">,</span>
4878     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
4879   <span class="special">&gt;</span>
4880 <span class="special">&gt;;</span>
4881<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">minus</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4882
4883<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">char</span> <span class="identifier">Op</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">;</span>
4884
4885<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'+'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
4886
4887<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'-'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">minus</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
4888
4889<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">S</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Item</span><span class="special">&gt;</span>
4890 <span class="keyword">struct</span> <span class="identifier">binary_op</span> <span class="special">:</span>
4891   <span class="identifier">eval_binary_op</span><span class="special">&lt;</span>
4892     <span class="identifier">S</span><span class="special">,</span>
4893     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">::</span><span class="identifier">value</span><span class="special">,</span>
4894     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;::</span><span class="identifier">type</span>
4895   <span class="special">&gt;</span>
4896   <span class="special">{};</span>
4897
4898<span class="keyword">using</span> <span class="identifier">exp_parser13</span> <span class="special">=</span>
4899 <span class="identifier">build_parser</span><span class="special">&lt;</span>
4900   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
4901     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
4902     <span class="identifier">int_token</span><span class="special">,</span>
4903     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
4904   <span class="special">&gt;</span>
4905 <span class="special">&gt;;</span>
4906</pre>
4907<p>
4908        <a name="before_7_2"></a><span class="emphasis"><em>Definitions before section 7.2.</em></span>
4909      </p>
4910<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">string</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4911<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">int_</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4912
4913<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">build_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4914
4915<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">metaparse</span><span class="special">;</span>
4916
4917<span class="keyword">using</span> <span class="identifier">exp_parser1</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
4918<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">entire_input</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4919
4920<span class="keyword">using</span> <span class="identifier">exp_parser2</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;;</span>
4921<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">token</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4922
4923<span class="keyword">using</span> <span class="identifier">exp_parser3</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;&gt;;</span>
4924<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">lit_c</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4925
4926<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">sequence</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4927
4928<span class="keyword">using</span> <span class="identifier">exp_parser4</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;&gt;;</span>
4929
4930<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">metashell</span><span class="special">/</span><span class="identifier">formatter</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4931
4932<span class="keyword">using</span> <span class="identifier">int_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
4933
4934<span class="keyword">using</span> <span class="identifier">plus_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;;</span>
4935
4936<span class="keyword">using</span> <span class="identifier">exp_parser5</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;;</span>
4937<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">transform</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4938
4939<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">plus</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4940
4941<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">at</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4942
4943<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">&gt;</span>
4944 <span class="keyword">struct</span> <span class="identifier">eval_plus</span> <span class="special">:</span>
4945   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span>
4946     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">,</span>
4947     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">2</span><span class="special">&gt;::</span><span class="identifier">type</span>
4948   <span class="special">&gt;</span> <span class="special">{};</span>
4949
4950<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">quote</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4951
4952<span class="keyword">using</span> <span class="identifier">exp_parser6</span> <span class="special">=</span>
4953 <span class="identifier">build_parser</span><span class="special">&lt;</span>
4954   <span class="identifier">transform</span><span class="special">&lt;</span>
4955     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
4956     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">eval_plus</span><span class="special">&gt;</span>
4957   <span class="special">&gt;</span>
4958 <span class="special">&gt;;</span>
4959<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">any</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4960
4961<span class="keyword">using</span> <span class="identifier">exp_parser7</span> <span class="special">=</span>
4962 <span class="identifier">build_parser</span><span class="special">&lt;</span>
4963   <span class="identifier">sequence</span><span class="special">&lt;</span>
4964     <span class="identifier">int_token</span><span class="special">,</span>                                <span class="comment">/* The first &lt;number&gt; */</span>
4965     <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;</span> <span class="comment">/* The "+ &lt;number&gt;" elements */</span>
4966   <span class="special">&gt;</span>
4967 <span class="special">&gt;;</span>
4968<span class="keyword">using</span> <span class="identifier">temp_result</span> <span class="special">=</span> <span class="identifier">exp_parser7</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 + 3 + 4"</span><span class="special">)&gt;::</span><span class="identifier">type</span><span class="special">;</span>
4969<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">fold</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
4970
4971<span class="keyword">using</span> <span class="identifier">vector_of_numbers</span> <span class="special">=</span>
4972 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span>
4973   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">2</span><span class="special">&gt;,</span>
4974   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">5</span><span class="special">&gt;,</span>
4975   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">6</span><span class="special">&gt;</span>
4976 <span class="special">&gt;;</span>
4977
4978<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">&gt;</span>
4979 <span class="keyword">struct</span> <span class="identifier">sum_vector</span> <span class="special">:</span>
4980    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
4981      <span class="identifier">Vector</span><span class="special">,</span>
4982      <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
4983      <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
4984        <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_2</span><span class="special">&gt;</span>
4985      <span class="special">&gt;::</span><span class="identifier">type</span>
4986    <span class="special">&gt;</span>
4987  <span class="special">{};</span>
4988
4989<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Sum</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Item</span><span class="special">&gt;</span>
4990   <span class="keyword">struct</span> <span class="identifier">sum_items</span> <span class="special">:</span>
4991     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span>
4992       <span class="identifier">Sum</span><span class="special">,</span>
4993       <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;::</span><span class="identifier">type</span>
4994     <span class="special">&gt;</span>
4995 <span class="special">{};</span>
4996<span class="keyword">using</span> <span class="identifier">exp_parser8</span> <span class="special">=</span>
4997 <span class="identifier">build_parser</span><span class="special">&lt;</span>
4998   <span class="identifier">sequence</span><span class="special">&lt;</span>
4999     <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* parse the first &lt;number&gt; */</span>
5000     <span class="identifier">transform</span><span class="special">&lt;</span>
5001       <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;,</span> <span class="comment">/* parse the "+ &lt;number&gt;" elements */</span>
5002       <span class="comment">/* lambda expression summarising the "+ &lt;number&gt;" elements using fold */</span>
5003       <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
5004         <span class="comment">/* The folding expression we have just created */</span>
5005         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
5006           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span> <span class="comment">/* the argument of the lambda expression, the result */</span>
5007                           <span class="comment">/* of the repeated&lt;...&gt; parser */</span>
5008           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
5009           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
5010         <span class="special">&gt;</span>
5011       <span class="special">&gt;::</span><span class="identifier">type</span>
5012     <span class="special">&gt;</span>
5013   <span class="special">&gt;</span>
5014 <span class="special">&gt;;</span>
5015
5016<span class="keyword">using</span> <span class="identifier">exp_parser9</span> <span class="special">=</span>
5017 <span class="identifier">build_parser</span><span class="special">&lt;</span>
5018   <span class="identifier">transform</span><span class="special">&lt;</span>
5019     <span class="comment">/* What we had so far */</span>
5020     <span class="identifier">sequence</span><span class="special">&lt;</span>
5021       <span class="identifier">int_token</span><span class="special">,</span>
5022       <span class="identifier">transform</span><span class="special">&lt;</span>
5023         <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;,</span>
5024         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
5025           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
5026             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span>
5027             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
5028             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
5029           <span class="special">&gt;</span>
5030         <span class="special">&gt;::</span><span class="identifier">type</span>
5031       <span class="special">&gt;</span>
5032     <span class="special">&gt;,</span>
5033     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">sum_vector</span><span class="special">&gt;</span> <span class="comment">/* summarise the vector of numbers */</span>
5034   <span class="special">&gt;</span>
5035 <span class="special">&gt;;</span>
5036<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">foldl</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5037
5038<span class="keyword">using</span> <span class="identifier">exp_parser10</span> <span class="special">=</span>
5039 <span class="identifier">build_parser</span><span class="special">&lt;</span>
5040   <span class="identifier">transform</span><span class="special">&lt;</span>
5041     <span class="identifier">sequence</span><span class="special">&lt;</span>
5042       <span class="identifier">int_token</span><span class="special">,</span>
5043       <span class="identifier">foldl</span><span class="special">&lt;</span>
5044         <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
5045         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
5046         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
5047       <span class="special">&gt;</span>
5048     <span class="special">&gt;,</span>
5049     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">sum_vector</span><span class="special">&gt;&gt;</span>
5050 <span class="special">&gt;;</span>
5051<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">foldl_start_with_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5052
5053<span class="keyword">using</span> <span class="identifier">exp_parser11</span> <span class="special">=</span>
5054 <span class="identifier">build_parser</span><span class="special">&lt;</span>
5055   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
5056     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span> <span class="comment">/* apply this parser repeatedly */</span>
5057     <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* use this parser to get the initial value */</span>
5058     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span> <span class="comment">/* use this function to add a new value to the summary */</span>
5059   <span class="special">&gt;</span>
5060 <span class="special">&gt;;</span>
5061<span class="keyword">using</span> <span class="identifier">minus_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'-'</span><span class="special">&gt;&gt;;</span>
5062
5063<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">one_of</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5064
5065<span class="keyword">using</span> <span class="identifier">exp_parser12</span> <span class="special">=</span>
5066 <span class="identifier">build_parser</span><span class="special">&lt;</span>
5067   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
5068     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
5069     <span class="identifier">int_token</span><span class="special">,</span>
5070     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
5071   <span class="special">&gt;</span>
5072 <span class="special">&gt;;</span>
5073<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">minus</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5074
5075<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">char</span> <span class="identifier">Op</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">;</span>
5076
5077<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'+'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
5078
5079<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'-'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">minus</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
5080
5081<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">S</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Item</span><span class="special">&gt;</span>
5082 <span class="keyword">struct</span> <span class="identifier">binary_op</span> <span class="special">:</span>
5083   <span class="identifier">eval_binary_op</span><span class="special">&lt;</span>
5084     <span class="identifier">S</span><span class="special">,</span>
5085     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">::</span><span class="identifier">value</span><span class="special">,</span>
5086     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;::</span><span class="identifier">type</span>
5087   <span class="special">&gt;</span>
5088   <span class="special">{};</span>
5089
5090<span class="keyword">using</span> <span class="identifier">exp_parser13</span> <span class="special">=</span>
5091 <span class="identifier">build_parser</span><span class="special">&lt;</span>
5092   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
5093     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
5094     <span class="identifier">int_token</span><span class="special">,</span>
5095     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
5096   <span class="special">&gt;</span>
5097 <span class="special">&gt;;</span>
5098<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">times</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5099
5100<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'*'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">times</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
5101
5102<span class="keyword">using</span> <span class="identifier">times_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'*'</span><span class="special">&gt;&gt;;</span>
5103
5104<span class="keyword">using</span> <span class="identifier">exp_parser14</span> <span class="special">=</span>
5105 <span class="identifier">build_parser</span><span class="special">&lt;</span>
5106   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
5107     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">,</span> <span class="identifier">times_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
5108     <span class="identifier">int_token</span><span class="special">,</span>
5109     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
5110   <span class="special">&gt;</span>
5111 <span class="special">&gt;;</span>
5112</pre>
5113<p>
5114        <a name="before_8"></a><span class="emphasis"><em>Definitions before section 8.</em></span>
5115      </p>
5116<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">string</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5117<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">int_</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5118
5119<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">build_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5120
5121<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">metaparse</span><span class="special">;</span>
5122
5123<span class="keyword">using</span> <span class="identifier">exp_parser1</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
5124<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">entire_input</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5125
5126<span class="keyword">using</span> <span class="identifier">exp_parser2</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;;</span>
5127<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">token</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5128
5129<span class="keyword">using</span> <span class="identifier">exp_parser3</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;&gt;;</span>
5130<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">lit_c</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5131
5132<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">sequence</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5133
5134<span class="keyword">using</span> <span class="identifier">exp_parser4</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;&gt;;</span>
5135
5136<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">metashell</span><span class="special">/</span><span class="identifier">formatter</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5137
5138<span class="keyword">using</span> <span class="identifier">int_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
5139
5140<span class="keyword">using</span> <span class="identifier">plus_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;;</span>
5141
5142<span class="keyword">using</span> <span class="identifier">exp_parser5</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;;</span>
5143<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">transform</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5144
5145<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">plus</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5146
5147<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">at</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5148
5149<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">&gt;</span>
5150 <span class="keyword">struct</span> <span class="identifier">eval_plus</span> <span class="special">:</span>
5151   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span>
5152     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">,</span>
5153     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">2</span><span class="special">&gt;::</span><span class="identifier">type</span>
5154   <span class="special">&gt;</span> <span class="special">{};</span>
5155
5156<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">quote</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5157
5158<span class="keyword">using</span> <span class="identifier">exp_parser6</span> <span class="special">=</span>
5159 <span class="identifier">build_parser</span><span class="special">&lt;</span>
5160   <span class="identifier">transform</span><span class="special">&lt;</span>
5161     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
5162     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">eval_plus</span><span class="special">&gt;</span>
5163   <span class="special">&gt;</span>
5164 <span class="special">&gt;;</span>
5165<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">any</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5166
5167<span class="keyword">using</span> <span class="identifier">exp_parser7</span> <span class="special">=</span>
5168 <span class="identifier">build_parser</span><span class="special">&lt;</span>
5169   <span class="identifier">sequence</span><span class="special">&lt;</span>
5170     <span class="identifier">int_token</span><span class="special">,</span>                                <span class="comment">/* The first &lt;number&gt; */</span>
5171     <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;</span> <span class="comment">/* The "+ &lt;number&gt;" elements */</span>
5172   <span class="special">&gt;</span>
5173 <span class="special">&gt;;</span>
5174<span class="keyword">using</span> <span class="identifier">temp_result</span> <span class="special">=</span> <span class="identifier">exp_parser7</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 + 3 + 4"</span><span class="special">)&gt;::</span><span class="identifier">type</span><span class="special">;</span>
5175<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">fold</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5176
5177<span class="keyword">using</span> <span class="identifier">vector_of_numbers</span> <span class="special">=</span>
5178 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span>
5179   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">2</span><span class="special">&gt;,</span>
5180   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">5</span><span class="special">&gt;,</span>
5181   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">6</span><span class="special">&gt;</span>
5182 <span class="special">&gt;;</span>
5183
5184<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">&gt;</span>
5185 <span class="keyword">struct</span> <span class="identifier">sum_vector</span> <span class="special">:</span>
5186    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
5187      <span class="identifier">Vector</span><span class="special">,</span>
5188      <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
5189      <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
5190        <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_2</span><span class="special">&gt;</span>
5191      <span class="special">&gt;::</span><span class="identifier">type</span>
5192    <span class="special">&gt;</span>
5193  <span class="special">{};</span>
5194
5195<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Sum</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Item</span><span class="special">&gt;</span>
5196   <span class="keyword">struct</span> <span class="identifier">sum_items</span> <span class="special">:</span>
5197     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span>
5198       <span class="identifier">Sum</span><span class="special">,</span>
5199       <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;::</span><span class="identifier">type</span>
5200     <span class="special">&gt;</span>
5201 <span class="special">{};</span>
5202<span class="keyword">using</span> <span class="identifier">exp_parser8</span> <span class="special">=</span>
5203 <span class="identifier">build_parser</span><span class="special">&lt;</span>
5204   <span class="identifier">sequence</span><span class="special">&lt;</span>
5205     <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* parse the first &lt;number&gt; */</span>
5206     <span class="identifier">transform</span><span class="special">&lt;</span>
5207       <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;,</span> <span class="comment">/* parse the "+ &lt;number&gt;" elements */</span>
5208       <span class="comment">/* lambda expression summarising the "+ &lt;number&gt;" elements using fold */</span>
5209       <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
5210         <span class="comment">/* The folding expression we have just created */</span>
5211         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
5212           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span> <span class="comment">/* the argument of the lambda expression, the result */</span>
5213                           <span class="comment">/* of the repeated&lt;...&gt; parser */</span>
5214           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
5215           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
5216         <span class="special">&gt;</span>
5217       <span class="special">&gt;::</span><span class="identifier">type</span>
5218     <span class="special">&gt;</span>
5219   <span class="special">&gt;</span>
5220 <span class="special">&gt;;</span>
5221
5222<span class="keyword">using</span> <span class="identifier">exp_parser9</span> <span class="special">=</span>
5223 <span class="identifier">build_parser</span><span class="special">&lt;</span>
5224   <span class="identifier">transform</span><span class="special">&lt;</span>
5225     <span class="comment">/* What we had so far */</span>
5226     <span class="identifier">sequence</span><span class="special">&lt;</span>
5227       <span class="identifier">int_token</span><span class="special">,</span>
5228       <span class="identifier">transform</span><span class="special">&lt;</span>
5229         <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;,</span>
5230         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
5231           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
5232             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span>
5233             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
5234             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
5235           <span class="special">&gt;</span>
5236         <span class="special">&gt;::</span><span class="identifier">type</span>
5237       <span class="special">&gt;</span>
5238     <span class="special">&gt;,</span>
5239     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">sum_vector</span><span class="special">&gt;</span> <span class="comment">/* summarise the vector of numbers */</span>
5240   <span class="special">&gt;</span>
5241 <span class="special">&gt;;</span>
5242<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">foldl</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5243
5244<span class="keyword">using</span> <span class="identifier">exp_parser10</span> <span class="special">=</span>
5245 <span class="identifier">build_parser</span><span class="special">&lt;</span>
5246   <span class="identifier">transform</span><span class="special">&lt;</span>
5247     <span class="identifier">sequence</span><span class="special">&lt;</span>
5248       <span class="identifier">int_token</span><span class="special">,</span>
5249       <span class="identifier">foldl</span><span class="special">&lt;</span>
5250         <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
5251         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
5252         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
5253       <span class="special">&gt;</span>
5254     <span class="special">&gt;,</span>
5255     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">sum_vector</span><span class="special">&gt;&gt;</span>
5256 <span class="special">&gt;;</span>
5257<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">foldl_start_with_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5258
5259<span class="keyword">using</span> <span class="identifier">exp_parser11</span> <span class="special">=</span>
5260 <span class="identifier">build_parser</span><span class="special">&lt;</span>
5261   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
5262     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span> <span class="comment">/* apply this parser repeatedly */</span>
5263     <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* use this parser to get the initial value */</span>
5264     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span> <span class="comment">/* use this function to add a new value to the summary */</span>
5265   <span class="special">&gt;</span>
5266 <span class="special">&gt;;</span>
5267<span class="keyword">using</span> <span class="identifier">minus_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'-'</span><span class="special">&gt;&gt;;</span>
5268
5269<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">one_of</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5270
5271<span class="keyword">using</span> <span class="identifier">exp_parser12</span> <span class="special">=</span>
5272 <span class="identifier">build_parser</span><span class="special">&lt;</span>
5273   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
5274     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
5275     <span class="identifier">int_token</span><span class="special">,</span>
5276     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
5277   <span class="special">&gt;</span>
5278 <span class="special">&gt;;</span>
5279<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">minus</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5280
5281<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">char</span> <span class="identifier">Op</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">;</span>
5282
5283<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'+'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
5284
5285<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'-'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">minus</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
5286
5287<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">S</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Item</span><span class="special">&gt;</span>
5288 <span class="keyword">struct</span> <span class="identifier">binary_op</span> <span class="special">:</span>
5289   <span class="identifier">eval_binary_op</span><span class="special">&lt;</span>
5290     <span class="identifier">S</span><span class="special">,</span>
5291     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">::</span><span class="identifier">value</span><span class="special">,</span>
5292     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;::</span><span class="identifier">type</span>
5293   <span class="special">&gt;</span>
5294   <span class="special">{};</span>
5295
5296<span class="keyword">using</span> <span class="identifier">exp_parser13</span> <span class="special">=</span>
5297 <span class="identifier">build_parser</span><span class="special">&lt;</span>
5298   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
5299     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
5300     <span class="identifier">int_token</span><span class="special">,</span>
5301     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
5302   <span class="special">&gt;</span>
5303 <span class="special">&gt;;</span>
5304<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">times</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5305
5306<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'*'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">times</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
5307
5308<span class="keyword">using</span> <span class="identifier">times_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'*'</span><span class="special">&gt;&gt;;</span>
5309
5310<span class="keyword">using</span> <span class="identifier">exp_parser14</span> <span class="special">=</span>
5311 <span class="identifier">build_parser</span><span class="special">&lt;</span>
5312   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
5313     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">,</span> <span class="identifier">times_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
5314     <span class="identifier">int_token</span><span class="special">,</span>
5315     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
5316   <span class="special">&gt;</span>
5317 <span class="special">&gt;;</span>
5318<span class="keyword">using</span> <span class="identifier">mult_exp1</span> <span class="special">=</span> <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;&gt;;</span>
5319
5320<span class="keyword">using</span> <span class="identifier">exp_parser15</span> <span class="special">=</span>
5321 <span class="identifier">build_parser</span><span class="special">&lt;</span>
5322   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
5323     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp1</span><span class="special">&gt;,</span>
5324     <span class="identifier">mult_exp1</span><span class="special">,</span>
5325     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
5326   <span class="special">&gt;</span>
5327 <span class="special">&gt;;</span>
5328</pre>
5329<p>
5330        <a name="before_8_1"></a><span class="emphasis"><em>Definitions before section 8.1.</em></span>
5331      </p>
5332<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">string</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5333<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">int_</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5334
5335<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">build_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5336
5337<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">metaparse</span><span class="special">;</span>
5338
5339<span class="keyword">using</span> <span class="identifier">exp_parser1</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
5340<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">entire_input</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5341
5342<span class="keyword">using</span> <span class="identifier">exp_parser2</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;;</span>
5343<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">token</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5344
5345<span class="keyword">using</span> <span class="identifier">exp_parser3</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;&gt;;</span>
5346<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">lit_c</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5347
5348<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">sequence</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5349
5350<span class="keyword">using</span> <span class="identifier">exp_parser4</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;&gt;;</span>
5351
5352<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">metashell</span><span class="special">/</span><span class="identifier">formatter</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5353
5354<span class="keyword">using</span> <span class="identifier">int_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
5355
5356<span class="keyword">using</span> <span class="identifier">plus_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;;</span>
5357
5358<span class="keyword">using</span> <span class="identifier">exp_parser5</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;;</span>
5359<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">transform</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5360
5361<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">plus</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5362
5363<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">at</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5364
5365<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">&gt;</span>
5366 <span class="keyword">struct</span> <span class="identifier">eval_plus</span> <span class="special">:</span>
5367   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span>
5368     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">,</span>
5369     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">2</span><span class="special">&gt;::</span><span class="identifier">type</span>
5370   <span class="special">&gt;</span> <span class="special">{};</span>
5371
5372<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">quote</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5373
5374<span class="keyword">using</span> <span class="identifier">exp_parser6</span> <span class="special">=</span>
5375 <span class="identifier">build_parser</span><span class="special">&lt;</span>
5376   <span class="identifier">transform</span><span class="special">&lt;</span>
5377     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
5378     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">eval_plus</span><span class="special">&gt;</span>
5379   <span class="special">&gt;</span>
5380 <span class="special">&gt;;</span>
5381<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">any</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5382
5383<span class="keyword">using</span> <span class="identifier">exp_parser7</span> <span class="special">=</span>
5384 <span class="identifier">build_parser</span><span class="special">&lt;</span>
5385   <span class="identifier">sequence</span><span class="special">&lt;</span>
5386     <span class="identifier">int_token</span><span class="special">,</span>                                <span class="comment">/* The first &lt;number&gt; */</span>
5387     <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;</span> <span class="comment">/* The "+ &lt;number&gt;" elements */</span>
5388   <span class="special">&gt;</span>
5389 <span class="special">&gt;;</span>
5390<span class="keyword">using</span> <span class="identifier">temp_result</span> <span class="special">=</span> <span class="identifier">exp_parser7</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 + 3 + 4"</span><span class="special">)&gt;::</span><span class="identifier">type</span><span class="special">;</span>
5391<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">fold</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5392
5393<span class="keyword">using</span> <span class="identifier">vector_of_numbers</span> <span class="special">=</span>
5394 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span>
5395   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">2</span><span class="special">&gt;,</span>
5396   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">5</span><span class="special">&gt;,</span>
5397   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">6</span><span class="special">&gt;</span>
5398 <span class="special">&gt;;</span>
5399
5400<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">&gt;</span>
5401 <span class="keyword">struct</span> <span class="identifier">sum_vector</span> <span class="special">:</span>
5402    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
5403      <span class="identifier">Vector</span><span class="special">,</span>
5404      <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
5405      <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
5406        <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_2</span><span class="special">&gt;</span>
5407      <span class="special">&gt;::</span><span class="identifier">type</span>
5408    <span class="special">&gt;</span>
5409  <span class="special">{};</span>
5410
5411<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Sum</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Item</span><span class="special">&gt;</span>
5412   <span class="keyword">struct</span> <span class="identifier">sum_items</span> <span class="special">:</span>
5413     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span>
5414       <span class="identifier">Sum</span><span class="special">,</span>
5415       <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;::</span><span class="identifier">type</span>
5416     <span class="special">&gt;</span>
5417 <span class="special">{};</span>
5418<span class="keyword">using</span> <span class="identifier">exp_parser8</span> <span class="special">=</span>
5419 <span class="identifier">build_parser</span><span class="special">&lt;</span>
5420   <span class="identifier">sequence</span><span class="special">&lt;</span>
5421     <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* parse the first &lt;number&gt; */</span>
5422     <span class="identifier">transform</span><span class="special">&lt;</span>
5423       <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;,</span> <span class="comment">/* parse the "+ &lt;number&gt;" elements */</span>
5424       <span class="comment">/* lambda expression summarising the "+ &lt;number&gt;" elements using fold */</span>
5425       <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
5426         <span class="comment">/* The folding expression we have just created */</span>
5427         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
5428           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span> <span class="comment">/* the argument of the lambda expression, the result */</span>
5429                           <span class="comment">/* of the repeated&lt;...&gt; parser */</span>
5430           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
5431           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
5432         <span class="special">&gt;</span>
5433       <span class="special">&gt;::</span><span class="identifier">type</span>
5434     <span class="special">&gt;</span>
5435   <span class="special">&gt;</span>
5436 <span class="special">&gt;;</span>
5437
5438<span class="keyword">using</span> <span class="identifier">exp_parser9</span> <span class="special">=</span>
5439 <span class="identifier">build_parser</span><span class="special">&lt;</span>
5440   <span class="identifier">transform</span><span class="special">&lt;</span>
5441     <span class="comment">/* What we had so far */</span>
5442     <span class="identifier">sequence</span><span class="special">&lt;</span>
5443       <span class="identifier">int_token</span><span class="special">,</span>
5444       <span class="identifier">transform</span><span class="special">&lt;</span>
5445         <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;,</span>
5446         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
5447           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
5448             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span>
5449             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
5450             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
5451           <span class="special">&gt;</span>
5452         <span class="special">&gt;::</span><span class="identifier">type</span>
5453       <span class="special">&gt;</span>
5454     <span class="special">&gt;,</span>
5455     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">sum_vector</span><span class="special">&gt;</span> <span class="comment">/* summarise the vector of numbers */</span>
5456   <span class="special">&gt;</span>
5457 <span class="special">&gt;;</span>
5458<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">foldl</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5459
5460<span class="keyword">using</span> <span class="identifier">exp_parser10</span> <span class="special">=</span>
5461 <span class="identifier">build_parser</span><span class="special">&lt;</span>
5462   <span class="identifier">transform</span><span class="special">&lt;</span>
5463     <span class="identifier">sequence</span><span class="special">&lt;</span>
5464       <span class="identifier">int_token</span><span class="special">,</span>
5465       <span class="identifier">foldl</span><span class="special">&lt;</span>
5466         <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
5467         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
5468         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
5469       <span class="special">&gt;</span>
5470     <span class="special">&gt;,</span>
5471     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">sum_vector</span><span class="special">&gt;&gt;</span>
5472 <span class="special">&gt;;</span>
5473<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">foldl_start_with_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5474
5475<span class="keyword">using</span> <span class="identifier">exp_parser11</span> <span class="special">=</span>
5476 <span class="identifier">build_parser</span><span class="special">&lt;</span>
5477   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
5478     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span> <span class="comment">/* apply this parser repeatedly */</span>
5479     <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* use this parser to get the initial value */</span>
5480     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span> <span class="comment">/* use this function to add a new value to the summary */</span>
5481   <span class="special">&gt;</span>
5482 <span class="special">&gt;;</span>
5483<span class="keyword">using</span> <span class="identifier">minus_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'-'</span><span class="special">&gt;&gt;;</span>
5484
5485<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">one_of</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5486
5487<span class="keyword">using</span> <span class="identifier">exp_parser12</span> <span class="special">=</span>
5488 <span class="identifier">build_parser</span><span class="special">&lt;</span>
5489   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
5490     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
5491     <span class="identifier">int_token</span><span class="special">,</span>
5492     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
5493   <span class="special">&gt;</span>
5494 <span class="special">&gt;;</span>
5495<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">minus</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5496
5497<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">char</span> <span class="identifier">Op</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">;</span>
5498
5499<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'+'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
5500
5501<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'-'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">minus</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
5502
5503<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">S</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Item</span><span class="special">&gt;</span>
5504 <span class="keyword">struct</span> <span class="identifier">binary_op</span> <span class="special">:</span>
5505   <span class="identifier">eval_binary_op</span><span class="special">&lt;</span>
5506     <span class="identifier">S</span><span class="special">,</span>
5507     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">::</span><span class="identifier">value</span><span class="special">,</span>
5508     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;::</span><span class="identifier">type</span>
5509   <span class="special">&gt;</span>
5510   <span class="special">{};</span>
5511
5512<span class="keyword">using</span> <span class="identifier">exp_parser13</span> <span class="special">=</span>
5513 <span class="identifier">build_parser</span><span class="special">&lt;</span>
5514   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
5515     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
5516     <span class="identifier">int_token</span><span class="special">,</span>
5517     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
5518   <span class="special">&gt;</span>
5519 <span class="special">&gt;;</span>
5520<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">times</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5521
5522<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'*'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">times</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
5523
5524<span class="keyword">using</span> <span class="identifier">times_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'*'</span><span class="special">&gt;&gt;;</span>
5525
5526<span class="keyword">using</span> <span class="identifier">exp_parser14</span> <span class="special">=</span>
5527 <span class="identifier">build_parser</span><span class="special">&lt;</span>
5528   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
5529     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">,</span> <span class="identifier">times_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
5530     <span class="identifier">int_token</span><span class="special">,</span>
5531     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
5532   <span class="special">&gt;</span>
5533 <span class="special">&gt;;</span>
5534<span class="keyword">using</span> <span class="identifier">mult_exp1</span> <span class="special">=</span> <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;&gt;;</span>
5535
5536<span class="keyword">using</span> <span class="identifier">exp_parser15</span> <span class="special">=</span>
5537 <span class="identifier">build_parser</span><span class="special">&lt;</span>
5538   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
5539     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp1</span><span class="special">&gt;,</span>
5540     <span class="identifier">mult_exp1</span><span class="special">,</span>
5541     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
5542   <span class="special">&gt;</span>
5543 <span class="special">&gt;;</span>
5544<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">divides</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5545
5546<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'/'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">divides</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
5547
5548<span class="keyword">using</span> <span class="identifier">divides_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'/'</span><span class="special">&gt;&gt;;</span>
5549
5550<span class="keyword">using</span> <span class="identifier">mult_exp2</span> <span class="special">=</span>
5551 <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
5552   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
5553   <span class="identifier">int_token</span><span class="special">,</span>
5554   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
5555 <span class="special">&gt;;</span>
5556
5557<span class="keyword">using</span> <span class="identifier">exp_parser16</span> <span class="special">=</span>
5558 <span class="identifier">build_parser</span><span class="special">&lt;</span>
5559   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
5560     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp2</span><span class="special">&gt;,</span>
5561     <span class="identifier">mult_exp2</span><span class="special">,</span>
5562     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
5563   <span class="special">&gt;</span>
5564 <span class="special">&gt;;</span>
5565</pre>
5566<p>
5567        <a name="before_8_2"></a><span class="emphasis"><em>Definitions before section 8.2.</em></span>
5568      </p>
5569<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">string</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5570<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">int_</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5571
5572<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">build_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5573
5574<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">metaparse</span><span class="special">;</span>
5575
5576<span class="keyword">using</span> <span class="identifier">exp_parser1</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
5577<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">entire_input</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5578
5579<span class="keyword">using</span> <span class="identifier">exp_parser2</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;;</span>
5580<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">token</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5581
5582<span class="keyword">using</span> <span class="identifier">exp_parser3</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;&gt;;</span>
5583<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">lit_c</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5584
5585<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">sequence</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5586
5587<span class="keyword">using</span> <span class="identifier">exp_parser4</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;&gt;;</span>
5588
5589<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">metashell</span><span class="special">/</span><span class="identifier">formatter</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5590
5591<span class="keyword">using</span> <span class="identifier">int_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
5592
5593<span class="keyword">using</span> <span class="identifier">plus_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;;</span>
5594
5595<span class="keyword">using</span> <span class="identifier">exp_parser5</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;;</span>
5596<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">transform</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5597
5598<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">plus</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5599
5600<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">at</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5601
5602<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">&gt;</span>
5603 <span class="keyword">struct</span> <span class="identifier">eval_plus</span> <span class="special">:</span>
5604   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span>
5605     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">,</span>
5606     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">2</span><span class="special">&gt;::</span><span class="identifier">type</span>
5607   <span class="special">&gt;</span> <span class="special">{};</span>
5608
5609<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">quote</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5610
5611<span class="keyword">using</span> <span class="identifier">exp_parser6</span> <span class="special">=</span>
5612 <span class="identifier">build_parser</span><span class="special">&lt;</span>
5613   <span class="identifier">transform</span><span class="special">&lt;</span>
5614     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
5615     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">eval_plus</span><span class="special">&gt;</span>
5616   <span class="special">&gt;</span>
5617 <span class="special">&gt;;</span>
5618<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">any</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5619
5620<span class="keyword">using</span> <span class="identifier">exp_parser7</span> <span class="special">=</span>
5621 <span class="identifier">build_parser</span><span class="special">&lt;</span>
5622   <span class="identifier">sequence</span><span class="special">&lt;</span>
5623     <span class="identifier">int_token</span><span class="special">,</span>                                <span class="comment">/* The first &lt;number&gt; */</span>
5624     <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;</span> <span class="comment">/* The "+ &lt;number&gt;" elements */</span>
5625   <span class="special">&gt;</span>
5626 <span class="special">&gt;;</span>
5627<span class="keyword">using</span> <span class="identifier">temp_result</span> <span class="special">=</span> <span class="identifier">exp_parser7</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 + 3 + 4"</span><span class="special">)&gt;::</span><span class="identifier">type</span><span class="special">;</span>
5628<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">fold</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5629
5630<span class="keyword">using</span> <span class="identifier">vector_of_numbers</span> <span class="special">=</span>
5631 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span>
5632   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">2</span><span class="special">&gt;,</span>
5633   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">5</span><span class="special">&gt;,</span>
5634   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">6</span><span class="special">&gt;</span>
5635 <span class="special">&gt;;</span>
5636
5637<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">&gt;</span>
5638 <span class="keyword">struct</span> <span class="identifier">sum_vector</span> <span class="special">:</span>
5639    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
5640      <span class="identifier">Vector</span><span class="special">,</span>
5641      <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
5642      <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
5643        <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_2</span><span class="special">&gt;</span>
5644      <span class="special">&gt;::</span><span class="identifier">type</span>
5645    <span class="special">&gt;</span>
5646  <span class="special">{};</span>
5647
5648<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Sum</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Item</span><span class="special">&gt;</span>
5649   <span class="keyword">struct</span> <span class="identifier">sum_items</span> <span class="special">:</span>
5650     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span>
5651       <span class="identifier">Sum</span><span class="special">,</span>
5652       <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;::</span><span class="identifier">type</span>
5653     <span class="special">&gt;</span>
5654 <span class="special">{};</span>
5655<span class="keyword">using</span> <span class="identifier">exp_parser8</span> <span class="special">=</span>
5656 <span class="identifier">build_parser</span><span class="special">&lt;</span>
5657   <span class="identifier">sequence</span><span class="special">&lt;</span>
5658     <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* parse the first &lt;number&gt; */</span>
5659     <span class="identifier">transform</span><span class="special">&lt;</span>
5660       <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;,</span> <span class="comment">/* parse the "+ &lt;number&gt;" elements */</span>
5661       <span class="comment">/* lambda expression summarising the "+ &lt;number&gt;" elements using fold */</span>
5662       <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
5663         <span class="comment">/* The folding expression we have just created */</span>
5664         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
5665           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span> <span class="comment">/* the argument of the lambda expression, the result */</span>
5666                           <span class="comment">/* of the repeated&lt;...&gt; parser */</span>
5667           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
5668           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
5669         <span class="special">&gt;</span>
5670       <span class="special">&gt;::</span><span class="identifier">type</span>
5671     <span class="special">&gt;</span>
5672   <span class="special">&gt;</span>
5673 <span class="special">&gt;;</span>
5674
5675<span class="keyword">using</span> <span class="identifier">exp_parser9</span> <span class="special">=</span>
5676 <span class="identifier">build_parser</span><span class="special">&lt;</span>
5677   <span class="identifier">transform</span><span class="special">&lt;</span>
5678     <span class="comment">/* What we had so far */</span>
5679     <span class="identifier">sequence</span><span class="special">&lt;</span>
5680       <span class="identifier">int_token</span><span class="special">,</span>
5681       <span class="identifier">transform</span><span class="special">&lt;</span>
5682         <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;,</span>
5683         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
5684           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
5685             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span>
5686             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
5687             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
5688           <span class="special">&gt;</span>
5689         <span class="special">&gt;::</span><span class="identifier">type</span>
5690       <span class="special">&gt;</span>
5691     <span class="special">&gt;,</span>
5692     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">sum_vector</span><span class="special">&gt;</span> <span class="comment">/* summarise the vector of numbers */</span>
5693   <span class="special">&gt;</span>
5694 <span class="special">&gt;;</span>
5695<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">foldl</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5696
5697<span class="keyword">using</span> <span class="identifier">exp_parser10</span> <span class="special">=</span>
5698 <span class="identifier">build_parser</span><span class="special">&lt;</span>
5699   <span class="identifier">transform</span><span class="special">&lt;</span>
5700     <span class="identifier">sequence</span><span class="special">&lt;</span>
5701       <span class="identifier">int_token</span><span class="special">,</span>
5702       <span class="identifier">foldl</span><span class="special">&lt;</span>
5703         <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
5704         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
5705         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
5706       <span class="special">&gt;</span>
5707     <span class="special">&gt;,</span>
5708     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">sum_vector</span><span class="special">&gt;&gt;</span>
5709 <span class="special">&gt;;</span>
5710<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">foldl_start_with_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5711
5712<span class="keyword">using</span> <span class="identifier">exp_parser11</span> <span class="special">=</span>
5713 <span class="identifier">build_parser</span><span class="special">&lt;</span>
5714   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
5715     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span> <span class="comment">/* apply this parser repeatedly */</span>
5716     <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* use this parser to get the initial value */</span>
5717     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span> <span class="comment">/* use this function to add a new value to the summary */</span>
5718   <span class="special">&gt;</span>
5719 <span class="special">&gt;;</span>
5720<span class="keyword">using</span> <span class="identifier">minus_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'-'</span><span class="special">&gt;&gt;;</span>
5721
5722<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">one_of</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5723
5724<span class="keyword">using</span> <span class="identifier">exp_parser12</span> <span class="special">=</span>
5725 <span class="identifier">build_parser</span><span class="special">&lt;</span>
5726   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
5727     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
5728     <span class="identifier">int_token</span><span class="special">,</span>
5729     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
5730   <span class="special">&gt;</span>
5731 <span class="special">&gt;;</span>
5732<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">minus</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5733
5734<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">char</span> <span class="identifier">Op</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">;</span>
5735
5736<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'+'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
5737
5738<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'-'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">minus</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
5739
5740<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">S</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Item</span><span class="special">&gt;</span>
5741 <span class="keyword">struct</span> <span class="identifier">binary_op</span> <span class="special">:</span>
5742   <span class="identifier">eval_binary_op</span><span class="special">&lt;</span>
5743     <span class="identifier">S</span><span class="special">,</span>
5744     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">::</span><span class="identifier">value</span><span class="special">,</span>
5745     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;::</span><span class="identifier">type</span>
5746   <span class="special">&gt;</span>
5747   <span class="special">{};</span>
5748
5749<span class="keyword">using</span> <span class="identifier">exp_parser13</span> <span class="special">=</span>
5750 <span class="identifier">build_parser</span><span class="special">&lt;</span>
5751   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
5752     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
5753     <span class="identifier">int_token</span><span class="special">,</span>
5754     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
5755   <span class="special">&gt;</span>
5756 <span class="special">&gt;;</span>
5757<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">times</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5758
5759<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'*'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">times</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
5760
5761<span class="keyword">using</span> <span class="identifier">times_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'*'</span><span class="special">&gt;&gt;;</span>
5762
5763<span class="keyword">using</span> <span class="identifier">exp_parser14</span> <span class="special">=</span>
5764 <span class="identifier">build_parser</span><span class="special">&lt;</span>
5765   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
5766     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">,</span> <span class="identifier">times_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
5767     <span class="identifier">int_token</span><span class="special">,</span>
5768     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
5769   <span class="special">&gt;</span>
5770 <span class="special">&gt;;</span>
5771<span class="keyword">using</span> <span class="identifier">mult_exp1</span> <span class="special">=</span> <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;&gt;;</span>
5772
5773<span class="keyword">using</span> <span class="identifier">exp_parser15</span> <span class="special">=</span>
5774 <span class="identifier">build_parser</span><span class="special">&lt;</span>
5775   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
5776     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp1</span><span class="special">&gt;,</span>
5777     <span class="identifier">mult_exp1</span><span class="special">,</span>
5778     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
5779   <span class="special">&gt;</span>
5780 <span class="special">&gt;;</span>
5781<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">divides</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5782
5783<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'/'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">divides</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
5784
5785<span class="keyword">using</span> <span class="identifier">divides_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'/'</span><span class="special">&gt;&gt;;</span>
5786
5787<span class="keyword">using</span> <span class="identifier">mult_exp2</span> <span class="special">=</span>
5788 <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
5789   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
5790   <span class="identifier">int_token</span><span class="special">,</span>
5791   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
5792 <span class="special">&gt;;</span>
5793
5794<span class="keyword">using</span> <span class="identifier">exp_parser16</span> <span class="special">=</span>
5795 <span class="identifier">build_parser</span><span class="special">&lt;</span>
5796   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
5797     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp2</span><span class="special">&gt;,</span>
5798     <span class="identifier">mult_exp2</span><span class="special">,</span>
5799     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
5800   <span class="special">&gt;</span>
5801 <span class="special">&gt;;</span>
5802</pre>
5803<p>
5804        <a name="before_9"></a><span class="emphasis"><em>Definitions before section 9.</em></span>
5805      </p>
5806<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">string</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5807<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">int_</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5808
5809<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">build_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5810
5811<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">metaparse</span><span class="special">;</span>
5812
5813<span class="keyword">using</span> <span class="identifier">exp_parser1</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
5814<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">entire_input</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5815
5816<span class="keyword">using</span> <span class="identifier">exp_parser2</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;;</span>
5817<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">token</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5818
5819<span class="keyword">using</span> <span class="identifier">exp_parser3</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;&gt;;</span>
5820<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">lit_c</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5821
5822<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">sequence</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5823
5824<span class="keyword">using</span> <span class="identifier">exp_parser4</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;&gt;;</span>
5825
5826<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">metashell</span><span class="special">/</span><span class="identifier">formatter</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5827
5828<span class="keyword">using</span> <span class="identifier">int_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
5829
5830<span class="keyword">using</span> <span class="identifier">plus_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;;</span>
5831
5832<span class="keyword">using</span> <span class="identifier">exp_parser5</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;;</span>
5833<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">transform</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5834
5835<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">plus</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5836
5837<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">at</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5838
5839<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">&gt;</span>
5840 <span class="keyword">struct</span> <span class="identifier">eval_plus</span> <span class="special">:</span>
5841   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span>
5842     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">,</span>
5843     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">2</span><span class="special">&gt;::</span><span class="identifier">type</span>
5844   <span class="special">&gt;</span> <span class="special">{};</span>
5845
5846<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">quote</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5847
5848<span class="keyword">using</span> <span class="identifier">exp_parser6</span> <span class="special">=</span>
5849 <span class="identifier">build_parser</span><span class="special">&lt;</span>
5850   <span class="identifier">transform</span><span class="special">&lt;</span>
5851     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
5852     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">eval_plus</span><span class="special">&gt;</span>
5853   <span class="special">&gt;</span>
5854 <span class="special">&gt;;</span>
5855<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">any</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5856
5857<span class="keyword">using</span> <span class="identifier">exp_parser7</span> <span class="special">=</span>
5858 <span class="identifier">build_parser</span><span class="special">&lt;</span>
5859   <span class="identifier">sequence</span><span class="special">&lt;</span>
5860     <span class="identifier">int_token</span><span class="special">,</span>                                <span class="comment">/* The first &lt;number&gt; */</span>
5861     <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;</span> <span class="comment">/* The "+ &lt;number&gt;" elements */</span>
5862   <span class="special">&gt;</span>
5863 <span class="special">&gt;;</span>
5864<span class="keyword">using</span> <span class="identifier">temp_result</span> <span class="special">=</span> <span class="identifier">exp_parser7</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 + 3 + 4"</span><span class="special">)&gt;::</span><span class="identifier">type</span><span class="special">;</span>
5865<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">fold</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5866
5867<span class="keyword">using</span> <span class="identifier">vector_of_numbers</span> <span class="special">=</span>
5868 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span>
5869   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">2</span><span class="special">&gt;,</span>
5870   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">5</span><span class="special">&gt;,</span>
5871   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">6</span><span class="special">&gt;</span>
5872 <span class="special">&gt;;</span>
5873
5874<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">&gt;</span>
5875 <span class="keyword">struct</span> <span class="identifier">sum_vector</span> <span class="special">:</span>
5876    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
5877      <span class="identifier">Vector</span><span class="special">,</span>
5878      <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
5879      <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
5880        <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_2</span><span class="special">&gt;</span>
5881      <span class="special">&gt;::</span><span class="identifier">type</span>
5882    <span class="special">&gt;</span>
5883  <span class="special">{};</span>
5884
5885<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Sum</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Item</span><span class="special">&gt;</span>
5886   <span class="keyword">struct</span> <span class="identifier">sum_items</span> <span class="special">:</span>
5887     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span>
5888       <span class="identifier">Sum</span><span class="special">,</span>
5889       <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;::</span><span class="identifier">type</span>
5890     <span class="special">&gt;</span>
5891 <span class="special">{};</span>
5892<span class="keyword">using</span> <span class="identifier">exp_parser8</span> <span class="special">=</span>
5893 <span class="identifier">build_parser</span><span class="special">&lt;</span>
5894   <span class="identifier">sequence</span><span class="special">&lt;</span>
5895     <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* parse the first &lt;number&gt; */</span>
5896     <span class="identifier">transform</span><span class="special">&lt;</span>
5897       <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;,</span> <span class="comment">/* parse the "+ &lt;number&gt;" elements */</span>
5898       <span class="comment">/* lambda expression summarising the "+ &lt;number&gt;" elements using fold */</span>
5899       <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
5900         <span class="comment">/* The folding expression we have just created */</span>
5901         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
5902           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span> <span class="comment">/* the argument of the lambda expression, the result */</span>
5903                           <span class="comment">/* of the repeated&lt;...&gt; parser */</span>
5904           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
5905           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
5906         <span class="special">&gt;</span>
5907       <span class="special">&gt;::</span><span class="identifier">type</span>
5908     <span class="special">&gt;</span>
5909   <span class="special">&gt;</span>
5910 <span class="special">&gt;;</span>
5911
5912<span class="keyword">using</span> <span class="identifier">exp_parser9</span> <span class="special">=</span>
5913 <span class="identifier">build_parser</span><span class="special">&lt;</span>
5914   <span class="identifier">transform</span><span class="special">&lt;</span>
5915     <span class="comment">/* What we had so far */</span>
5916     <span class="identifier">sequence</span><span class="special">&lt;</span>
5917       <span class="identifier">int_token</span><span class="special">,</span>
5918       <span class="identifier">transform</span><span class="special">&lt;</span>
5919         <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;,</span>
5920         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
5921           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
5922             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span>
5923             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
5924             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
5925           <span class="special">&gt;</span>
5926         <span class="special">&gt;::</span><span class="identifier">type</span>
5927       <span class="special">&gt;</span>
5928     <span class="special">&gt;,</span>
5929     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">sum_vector</span><span class="special">&gt;</span> <span class="comment">/* summarise the vector of numbers */</span>
5930   <span class="special">&gt;</span>
5931 <span class="special">&gt;;</span>
5932<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">foldl</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5933
5934<span class="keyword">using</span> <span class="identifier">exp_parser10</span> <span class="special">=</span>
5935 <span class="identifier">build_parser</span><span class="special">&lt;</span>
5936   <span class="identifier">transform</span><span class="special">&lt;</span>
5937     <span class="identifier">sequence</span><span class="special">&lt;</span>
5938       <span class="identifier">int_token</span><span class="special">,</span>
5939       <span class="identifier">foldl</span><span class="special">&lt;</span>
5940         <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
5941         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
5942         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
5943       <span class="special">&gt;</span>
5944     <span class="special">&gt;,</span>
5945     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">sum_vector</span><span class="special">&gt;&gt;</span>
5946 <span class="special">&gt;;</span>
5947<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">foldl_start_with_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5948
5949<span class="keyword">using</span> <span class="identifier">exp_parser11</span> <span class="special">=</span>
5950 <span class="identifier">build_parser</span><span class="special">&lt;</span>
5951   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
5952     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span> <span class="comment">/* apply this parser repeatedly */</span>
5953     <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* use this parser to get the initial value */</span>
5954     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span> <span class="comment">/* use this function to add a new value to the summary */</span>
5955   <span class="special">&gt;</span>
5956 <span class="special">&gt;;</span>
5957<span class="keyword">using</span> <span class="identifier">minus_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'-'</span><span class="special">&gt;&gt;;</span>
5958
5959<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">one_of</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5960
5961<span class="keyword">using</span> <span class="identifier">exp_parser12</span> <span class="special">=</span>
5962 <span class="identifier">build_parser</span><span class="special">&lt;</span>
5963   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
5964     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
5965     <span class="identifier">int_token</span><span class="special">,</span>
5966     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
5967   <span class="special">&gt;</span>
5968 <span class="special">&gt;;</span>
5969<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">minus</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5970
5971<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">char</span> <span class="identifier">Op</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">;</span>
5972
5973<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'+'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
5974
5975<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'-'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">minus</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
5976
5977<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">S</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Item</span><span class="special">&gt;</span>
5978 <span class="keyword">struct</span> <span class="identifier">binary_op</span> <span class="special">:</span>
5979   <span class="identifier">eval_binary_op</span><span class="special">&lt;</span>
5980     <span class="identifier">S</span><span class="special">,</span>
5981     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">::</span><span class="identifier">value</span><span class="special">,</span>
5982     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;::</span><span class="identifier">type</span>
5983   <span class="special">&gt;</span>
5984   <span class="special">{};</span>
5985
5986<span class="keyword">using</span> <span class="identifier">exp_parser13</span> <span class="special">=</span>
5987 <span class="identifier">build_parser</span><span class="special">&lt;</span>
5988   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
5989     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
5990     <span class="identifier">int_token</span><span class="special">,</span>
5991     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
5992   <span class="special">&gt;</span>
5993 <span class="special">&gt;;</span>
5994<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">times</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
5995
5996<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'*'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">times</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
5997
5998<span class="keyword">using</span> <span class="identifier">times_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'*'</span><span class="special">&gt;&gt;;</span>
5999
6000<span class="keyword">using</span> <span class="identifier">exp_parser14</span> <span class="special">=</span>
6001 <span class="identifier">build_parser</span><span class="special">&lt;</span>
6002   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
6003     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">,</span> <span class="identifier">times_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
6004     <span class="identifier">int_token</span><span class="special">,</span>
6005     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
6006   <span class="special">&gt;</span>
6007 <span class="special">&gt;;</span>
6008<span class="keyword">using</span> <span class="identifier">mult_exp1</span> <span class="special">=</span> <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;&gt;;</span>
6009
6010<span class="keyword">using</span> <span class="identifier">exp_parser15</span> <span class="special">=</span>
6011 <span class="identifier">build_parser</span><span class="special">&lt;</span>
6012   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
6013     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp1</span><span class="special">&gt;,</span>
6014     <span class="identifier">mult_exp1</span><span class="special">,</span>
6015     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
6016   <span class="special">&gt;</span>
6017 <span class="special">&gt;;</span>
6018<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">divides</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6019
6020<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'/'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">divides</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
6021
6022<span class="keyword">using</span> <span class="identifier">divides_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'/'</span><span class="special">&gt;&gt;;</span>
6023
6024<span class="keyword">using</span> <span class="identifier">mult_exp2</span> <span class="special">=</span>
6025 <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
6026   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
6027   <span class="identifier">int_token</span><span class="special">,</span>
6028   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
6029 <span class="special">&gt;;</span>
6030
6031<span class="keyword">using</span> <span class="identifier">exp_parser16</span> <span class="special">=</span>
6032 <span class="identifier">build_parser</span><span class="special">&lt;</span>
6033   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
6034     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp2</span><span class="special">&gt;,</span>
6035     <span class="identifier">mult_exp2</span><span class="special">,</span>
6036     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
6037   <span class="special">&gt;</span>
6038 <span class="special">&gt;;</span>
6039<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">S</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Item</span><span class="special">&gt;</span>
6040 <span class="keyword">struct</span> <span class="identifier">reverse_binary_op</span> <span class="special">:</span>
6041   <span class="identifier">eval_binary_op</span><span class="special">&lt;</span>
6042     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">,</span>
6043     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">::</span><span class="identifier">value</span><span class="special">,</span>
6044     <span class="identifier">S</span>
6045   <span class="special">&gt;</span>
6046   <span class="special">{};</span>
6047
6048<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">foldr_start_with_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6049
6050<span class="keyword">using</span> <span class="identifier">mult_exp3</span> <span class="special">=</span>
6051 <span class="identifier">foldr_start_with_parser</span><span class="special">&lt;</span>
6052   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">&gt;&gt;,</span> <span class="comment">/* The parser applied repeatedly */</span>
6053   <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* The parser parsing the last number */</span>
6054   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">reverse_binary_op</span><span class="special">&gt;</span> <span class="comment">/* The function called for every result */</span>
6055                                         <span class="comment">/* of applying the above parser */</span>
6056 <span class="special">&gt;;</span>
6057
6058<span class="keyword">using</span> <span class="identifier">exp_parser17</span> <span class="special">=</span>
6059 <span class="identifier">build_parser</span><span class="special">&lt;</span>
6060   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
6061     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp3</span><span class="special">&gt;,</span>
6062     <span class="identifier">mult_exp3</span><span class="special">,</span>
6063     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
6064   <span class="special">&gt;</span>
6065 <span class="special">&gt;;</span>
6066</pre>
6067<p>
6068        <a name="before_10"></a><span class="emphasis"><em>Definitions before section 10.</em></span>
6069      </p>
6070<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">string</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6071<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">int_</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6072
6073<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">build_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6074
6075<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">metaparse</span><span class="special">;</span>
6076
6077<span class="keyword">using</span> <span class="identifier">exp_parser1</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
6078<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">entire_input</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6079
6080<span class="keyword">using</span> <span class="identifier">exp_parser2</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;;</span>
6081<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">token</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6082
6083<span class="keyword">using</span> <span class="identifier">exp_parser3</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;&gt;;</span>
6084<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">lit_c</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6085
6086<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">sequence</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6087
6088<span class="keyword">using</span> <span class="identifier">exp_parser4</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;&gt;;</span>
6089
6090<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">metashell</span><span class="special">/</span><span class="identifier">formatter</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6091
6092<span class="keyword">using</span> <span class="identifier">int_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
6093
6094<span class="keyword">using</span> <span class="identifier">plus_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;;</span>
6095
6096<span class="keyword">using</span> <span class="identifier">exp_parser5</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;;</span>
6097<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">transform</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6098
6099<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">plus</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6100
6101<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">at</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6102
6103<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">&gt;</span>
6104 <span class="keyword">struct</span> <span class="identifier">eval_plus</span> <span class="special">:</span>
6105   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span>
6106     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">,</span>
6107     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">2</span><span class="special">&gt;::</span><span class="identifier">type</span>
6108   <span class="special">&gt;</span> <span class="special">{};</span>
6109
6110<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">quote</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6111
6112<span class="keyword">using</span> <span class="identifier">exp_parser6</span> <span class="special">=</span>
6113 <span class="identifier">build_parser</span><span class="special">&lt;</span>
6114   <span class="identifier">transform</span><span class="special">&lt;</span>
6115     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
6116     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">eval_plus</span><span class="special">&gt;</span>
6117   <span class="special">&gt;</span>
6118 <span class="special">&gt;;</span>
6119<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">any</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6120
6121<span class="keyword">using</span> <span class="identifier">exp_parser7</span> <span class="special">=</span>
6122 <span class="identifier">build_parser</span><span class="special">&lt;</span>
6123   <span class="identifier">sequence</span><span class="special">&lt;</span>
6124     <span class="identifier">int_token</span><span class="special">,</span>                                <span class="comment">/* The first &lt;number&gt; */</span>
6125     <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;</span> <span class="comment">/* The "+ &lt;number&gt;" elements */</span>
6126   <span class="special">&gt;</span>
6127 <span class="special">&gt;;</span>
6128<span class="keyword">using</span> <span class="identifier">temp_result</span> <span class="special">=</span> <span class="identifier">exp_parser7</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 + 3 + 4"</span><span class="special">)&gt;::</span><span class="identifier">type</span><span class="special">;</span>
6129<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">fold</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6130
6131<span class="keyword">using</span> <span class="identifier">vector_of_numbers</span> <span class="special">=</span>
6132 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span>
6133   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">2</span><span class="special">&gt;,</span>
6134   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">5</span><span class="special">&gt;,</span>
6135   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">6</span><span class="special">&gt;</span>
6136 <span class="special">&gt;;</span>
6137
6138<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">&gt;</span>
6139 <span class="keyword">struct</span> <span class="identifier">sum_vector</span> <span class="special">:</span>
6140    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
6141      <span class="identifier">Vector</span><span class="special">,</span>
6142      <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
6143      <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
6144        <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_2</span><span class="special">&gt;</span>
6145      <span class="special">&gt;::</span><span class="identifier">type</span>
6146    <span class="special">&gt;</span>
6147  <span class="special">{};</span>
6148
6149<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Sum</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Item</span><span class="special">&gt;</span>
6150   <span class="keyword">struct</span> <span class="identifier">sum_items</span> <span class="special">:</span>
6151     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span>
6152       <span class="identifier">Sum</span><span class="special">,</span>
6153       <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;::</span><span class="identifier">type</span>
6154     <span class="special">&gt;</span>
6155 <span class="special">{};</span>
6156<span class="keyword">using</span> <span class="identifier">exp_parser8</span> <span class="special">=</span>
6157 <span class="identifier">build_parser</span><span class="special">&lt;</span>
6158   <span class="identifier">sequence</span><span class="special">&lt;</span>
6159     <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* parse the first &lt;number&gt; */</span>
6160     <span class="identifier">transform</span><span class="special">&lt;</span>
6161       <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;,</span> <span class="comment">/* parse the "+ &lt;number&gt;" elements */</span>
6162       <span class="comment">/* lambda expression summarising the "+ &lt;number&gt;" elements using fold */</span>
6163       <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
6164         <span class="comment">/* The folding expression we have just created */</span>
6165         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
6166           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span> <span class="comment">/* the argument of the lambda expression, the result */</span>
6167                           <span class="comment">/* of the repeated&lt;...&gt; parser */</span>
6168           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
6169           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
6170         <span class="special">&gt;</span>
6171       <span class="special">&gt;::</span><span class="identifier">type</span>
6172     <span class="special">&gt;</span>
6173   <span class="special">&gt;</span>
6174 <span class="special">&gt;;</span>
6175
6176<span class="keyword">using</span> <span class="identifier">exp_parser9</span> <span class="special">=</span>
6177 <span class="identifier">build_parser</span><span class="special">&lt;</span>
6178   <span class="identifier">transform</span><span class="special">&lt;</span>
6179     <span class="comment">/* What we had so far */</span>
6180     <span class="identifier">sequence</span><span class="special">&lt;</span>
6181       <span class="identifier">int_token</span><span class="special">,</span>
6182       <span class="identifier">transform</span><span class="special">&lt;</span>
6183         <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;,</span>
6184         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
6185           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
6186             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span>
6187             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
6188             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
6189           <span class="special">&gt;</span>
6190         <span class="special">&gt;::</span><span class="identifier">type</span>
6191       <span class="special">&gt;</span>
6192     <span class="special">&gt;,</span>
6193     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">sum_vector</span><span class="special">&gt;</span> <span class="comment">/* summarise the vector of numbers */</span>
6194   <span class="special">&gt;</span>
6195 <span class="special">&gt;;</span>
6196<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">foldl</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6197
6198<span class="keyword">using</span> <span class="identifier">exp_parser10</span> <span class="special">=</span>
6199 <span class="identifier">build_parser</span><span class="special">&lt;</span>
6200   <span class="identifier">transform</span><span class="special">&lt;</span>
6201     <span class="identifier">sequence</span><span class="special">&lt;</span>
6202       <span class="identifier">int_token</span><span class="special">,</span>
6203       <span class="identifier">foldl</span><span class="special">&lt;</span>
6204         <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
6205         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
6206         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
6207       <span class="special">&gt;</span>
6208     <span class="special">&gt;,</span>
6209     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">sum_vector</span><span class="special">&gt;&gt;</span>
6210 <span class="special">&gt;;</span>
6211<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">foldl_start_with_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6212
6213<span class="keyword">using</span> <span class="identifier">exp_parser11</span> <span class="special">=</span>
6214 <span class="identifier">build_parser</span><span class="special">&lt;</span>
6215   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
6216     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span> <span class="comment">/* apply this parser repeatedly */</span>
6217     <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* use this parser to get the initial value */</span>
6218     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span> <span class="comment">/* use this function to add a new value to the summary */</span>
6219   <span class="special">&gt;</span>
6220 <span class="special">&gt;;</span>
6221<span class="keyword">using</span> <span class="identifier">minus_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'-'</span><span class="special">&gt;&gt;;</span>
6222
6223<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">one_of</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6224
6225<span class="keyword">using</span> <span class="identifier">exp_parser12</span> <span class="special">=</span>
6226 <span class="identifier">build_parser</span><span class="special">&lt;</span>
6227   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
6228     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
6229     <span class="identifier">int_token</span><span class="special">,</span>
6230     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
6231   <span class="special">&gt;</span>
6232 <span class="special">&gt;;</span>
6233<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">minus</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6234
6235<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">char</span> <span class="identifier">Op</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">;</span>
6236
6237<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'+'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
6238
6239<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'-'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">minus</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
6240
6241<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">S</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Item</span><span class="special">&gt;</span>
6242 <span class="keyword">struct</span> <span class="identifier">binary_op</span> <span class="special">:</span>
6243   <span class="identifier">eval_binary_op</span><span class="special">&lt;</span>
6244     <span class="identifier">S</span><span class="special">,</span>
6245     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">::</span><span class="identifier">value</span><span class="special">,</span>
6246     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;::</span><span class="identifier">type</span>
6247   <span class="special">&gt;</span>
6248   <span class="special">{};</span>
6249
6250<span class="keyword">using</span> <span class="identifier">exp_parser13</span> <span class="special">=</span>
6251 <span class="identifier">build_parser</span><span class="special">&lt;</span>
6252   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
6253     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
6254     <span class="identifier">int_token</span><span class="special">,</span>
6255     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
6256   <span class="special">&gt;</span>
6257 <span class="special">&gt;;</span>
6258<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">times</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6259
6260<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'*'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">times</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
6261
6262<span class="keyword">using</span> <span class="identifier">times_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'*'</span><span class="special">&gt;&gt;;</span>
6263
6264<span class="keyword">using</span> <span class="identifier">exp_parser14</span> <span class="special">=</span>
6265 <span class="identifier">build_parser</span><span class="special">&lt;</span>
6266   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
6267     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">,</span> <span class="identifier">times_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
6268     <span class="identifier">int_token</span><span class="special">,</span>
6269     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
6270   <span class="special">&gt;</span>
6271 <span class="special">&gt;;</span>
6272<span class="keyword">using</span> <span class="identifier">mult_exp1</span> <span class="special">=</span> <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;&gt;;</span>
6273
6274<span class="keyword">using</span> <span class="identifier">exp_parser15</span> <span class="special">=</span>
6275 <span class="identifier">build_parser</span><span class="special">&lt;</span>
6276   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
6277     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp1</span><span class="special">&gt;,</span>
6278     <span class="identifier">mult_exp1</span><span class="special">,</span>
6279     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
6280   <span class="special">&gt;</span>
6281 <span class="special">&gt;;</span>
6282<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">divides</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6283
6284<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'/'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">divides</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
6285
6286<span class="keyword">using</span> <span class="identifier">divides_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'/'</span><span class="special">&gt;&gt;;</span>
6287
6288<span class="keyword">using</span> <span class="identifier">mult_exp2</span> <span class="special">=</span>
6289 <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
6290   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
6291   <span class="identifier">int_token</span><span class="special">,</span>
6292   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
6293 <span class="special">&gt;;</span>
6294
6295<span class="keyword">using</span> <span class="identifier">exp_parser16</span> <span class="special">=</span>
6296 <span class="identifier">build_parser</span><span class="special">&lt;</span>
6297   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
6298     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp2</span><span class="special">&gt;,</span>
6299     <span class="identifier">mult_exp2</span><span class="special">,</span>
6300     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
6301   <span class="special">&gt;</span>
6302 <span class="special">&gt;;</span>
6303<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">S</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Item</span><span class="special">&gt;</span>
6304 <span class="keyword">struct</span> <span class="identifier">reverse_binary_op</span> <span class="special">:</span>
6305   <span class="identifier">eval_binary_op</span><span class="special">&lt;</span>
6306     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">,</span>
6307     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">::</span><span class="identifier">value</span><span class="special">,</span>
6308     <span class="identifier">S</span>
6309   <span class="special">&gt;</span>
6310   <span class="special">{};</span>
6311
6312<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">foldr_start_with_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6313
6314<span class="keyword">using</span> <span class="identifier">mult_exp3</span> <span class="special">=</span>
6315 <span class="identifier">foldr_start_with_parser</span><span class="special">&lt;</span>
6316   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">&gt;&gt;,</span> <span class="comment">/* The parser applied repeatedly */</span>
6317   <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* The parser parsing the last number */</span>
6318   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">reverse_binary_op</span><span class="special">&gt;</span> <span class="comment">/* The function called for every result */</span>
6319                                         <span class="comment">/* of applying the above parser */</span>
6320 <span class="special">&gt;;</span>
6321
6322<span class="keyword">using</span> <span class="identifier">exp_parser17</span> <span class="special">=</span>
6323 <span class="identifier">build_parser</span><span class="special">&lt;</span>
6324   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
6325     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp3</span><span class="special">&gt;,</span>
6326     <span class="identifier">mult_exp3</span><span class="special">,</span>
6327     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
6328   <span class="special">&gt;</span>
6329 <span class="special">&gt;;</span>
6330<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">negate</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6331
6332<span class="keyword">using</span> <span class="identifier">unary_exp1</span> <span class="special">=</span>
6333 <span class="identifier">foldr_start_with_parser</span><span class="special">&lt;</span>
6334   <span class="identifier">minus_token</span><span class="special">,</span>
6335   <span class="identifier">int_token</span><span class="special">,</span>
6336   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">negate</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">&gt;&gt;::</span><span class="identifier">type</span>
6337 <span class="special">&gt;;</span>
6338
6339<span class="keyword">using</span> <span class="identifier">mult_exp4</span> <span class="special">=</span>
6340 <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
6341   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">&gt;,</span> <span class="identifier">unary_exp1</span><span class="special">&gt;,</span>
6342   <span class="identifier">unary_exp1</span><span class="special">,</span>
6343   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
6344 <span class="special">&gt;;</span>
6345
6346<span class="keyword">using</span> <span class="identifier">exp_parser18</span> <span class="special">=</span>
6347 <span class="identifier">build_parser</span><span class="special">&lt;</span>
6348   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
6349     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp4</span><span class="special">&gt;,</span>
6350     <span class="identifier">mult_exp4</span><span class="special">,</span>
6351     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
6352   <span class="special">&gt;</span>
6353 <span class="special">&gt;;</span>
6354</pre>
6355<p>
6356        <a name="before_11"></a><span class="emphasis"><em>Definitions before section 11.</em></span>
6357      </p>
6358<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">string</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6359<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">int_</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6360
6361<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">build_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6362
6363<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">metaparse</span><span class="special">;</span>
6364
6365<span class="keyword">using</span> <span class="identifier">exp_parser1</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
6366<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">entire_input</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6367
6368<span class="keyword">using</span> <span class="identifier">exp_parser2</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;;</span>
6369<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">token</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6370
6371<span class="keyword">using</span> <span class="identifier">exp_parser3</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;&gt;;</span>
6372<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">lit_c</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6373
6374<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">sequence</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6375
6376<span class="keyword">using</span> <span class="identifier">exp_parser4</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;&gt;;</span>
6377
6378<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">metashell</span><span class="special">/</span><span class="identifier">formatter</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6379
6380<span class="keyword">using</span> <span class="identifier">int_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
6381
6382<span class="keyword">using</span> <span class="identifier">plus_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;;</span>
6383
6384<span class="keyword">using</span> <span class="identifier">exp_parser5</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;;</span>
6385<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">transform</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6386
6387<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">plus</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6388
6389<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">at</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6390
6391<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">&gt;</span>
6392 <span class="keyword">struct</span> <span class="identifier">eval_plus</span> <span class="special">:</span>
6393   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span>
6394     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">,</span>
6395     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">2</span><span class="special">&gt;::</span><span class="identifier">type</span>
6396   <span class="special">&gt;</span> <span class="special">{};</span>
6397
6398<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">quote</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6399
6400<span class="keyword">using</span> <span class="identifier">exp_parser6</span> <span class="special">=</span>
6401 <span class="identifier">build_parser</span><span class="special">&lt;</span>
6402   <span class="identifier">transform</span><span class="special">&lt;</span>
6403     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
6404     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">eval_plus</span><span class="special">&gt;</span>
6405   <span class="special">&gt;</span>
6406 <span class="special">&gt;;</span>
6407<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">any</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6408
6409<span class="keyword">using</span> <span class="identifier">exp_parser7</span> <span class="special">=</span>
6410 <span class="identifier">build_parser</span><span class="special">&lt;</span>
6411   <span class="identifier">sequence</span><span class="special">&lt;</span>
6412     <span class="identifier">int_token</span><span class="special">,</span>                                <span class="comment">/* The first &lt;number&gt; */</span>
6413     <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;</span> <span class="comment">/* The "+ &lt;number&gt;" elements */</span>
6414   <span class="special">&gt;</span>
6415 <span class="special">&gt;;</span>
6416<span class="keyword">using</span> <span class="identifier">temp_result</span> <span class="special">=</span> <span class="identifier">exp_parser7</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 + 3 + 4"</span><span class="special">)&gt;::</span><span class="identifier">type</span><span class="special">;</span>
6417<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">fold</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6418
6419<span class="keyword">using</span> <span class="identifier">vector_of_numbers</span> <span class="special">=</span>
6420 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span>
6421   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">2</span><span class="special">&gt;,</span>
6422   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">5</span><span class="special">&gt;,</span>
6423   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">6</span><span class="special">&gt;</span>
6424 <span class="special">&gt;;</span>
6425
6426<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">&gt;</span>
6427 <span class="keyword">struct</span> <span class="identifier">sum_vector</span> <span class="special">:</span>
6428    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
6429      <span class="identifier">Vector</span><span class="special">,</span>
6430      <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
6431      <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
6432        <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_2</span><span class="special">&gt;</span>
6433      <span class="special">&gt;::</span><span class="identifier">type</span>
6434    <span class="special">&gt;</span>
6435  <span class="special">{};</span>
6436
6437<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Sum</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Item</span><span class="special">&gt;</span>
6438   <span class="keyword">struct</span> <span class="identifier">sum_items</span> <span class="special">:</span>
6439     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span>
6440       <span class="identifier">Sum</span><span class="special">,</span>
6441       <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;::</span><span class="identifier">type</span>
6442     <span class="special">&gt;</span>
6443 <span class="special">{};</span>
6444<span class="keyword">using</span> <span class="identifier">exp_parser8</span> <span class="special">=</span>
6445 <span class="identifier">build_parser</span><span class="special">&lt;</span>
6446   <span class="identifier">sequence</span><span class="special">&lt;</span>
6447     <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* parse the first &lt;number&gt; */</span>
6448     <span class="identifier">transform</span><span class="special">&lt;</span>
6449       <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;,</span> <span class="comment">/* parse the "+ &lt;number&gt;" elements */</span>
6450       <span class="comment">/* lambda expression summarising the "+ &lt;number&gt;" elements using fold */</span>
6451       <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
6452         <span class="comment">/* The folding expression we have just created */</span>
6453         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
6454           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span> <span class="comment">/* the argument of the lambda expression, the result */</span>
6455                           <span class="comment">/* of the repeated&lt;...&gt; parser */</span>
6456           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
6457           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
6458         <span class="special">&gt;</span>
6459       <span class="special">&gt;::</span><span class="identifier">type</span>
6460     <span class="special">&gt;</span>
6461   <span class="special">&gt;</span>
6462 <span class="special">&gt;;</span>
6463
6464<span class="keyword">using</span> <span class="identifier">exp_parser9</span> <span class="special">=</span>
6465 <span class="identifier">build_parser</span><span class="special">&lt;</span>
6466   <span class="identifier">transform</span><span class="special">&lt;</span>
6467     <span class="comment">/* What we had so far */</span>
6468     <span class="identifier">sequence</span><span class="special">&lt;</span>
6469       <span class="identifier">int_token</span><span class="special">,</span>
6470       <span class="identifier">transform</span><span class="special">&lt;</span>
6471         <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;,</span>
6472         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
6473           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
6474             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span>
6475             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
6476             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
6477           <span class="special">&gt;</span>
6478         <span class="special">&gt;::</span><span class="identifier">type</span>
6479       <span class="special">&gt;</span>
6480     <span class="special">&gt;,</span>
6481     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">sum_vector</span><span class="special">&gt;</span> <span class="comment">/* summarise the vector of numbers */</span>
6482   <span class="special">&gt;</span>
6483 <span class="special">&gt;;</span>
6484<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">foldl</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6485
6486<span class="keyword">using</span> <span class="identifier">exp_parser10</span> <span class="special">=</span>
6487 <span class="identifier">build_parser</span><span class="special">&lt;</span>
6488   <span class="identifier">transform</span><span class="special">&lt;</span>
6489     <span class="identifier">sequence</span><span class="special">&lt;</span>
6490       <span class="identifier">int_token</span><span class="special">,</span>
6491       <span class="identifier">foldl</span><span class="special">&lt;</span>
6492         <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
6493         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
6494         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
6495       <span class="special">&gt;</span>
6496     <span class="special">&gt;,</span>
6497     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">sum_vector</span><span class="special">&gt;&gt;</span>
6498 <span class="special">&gt;;</span>
6499<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">foldl_start_with_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6500
6501<span class="keyword">using</span> <span class="identifier">exp_parser11</span> <span class="special">=</span>
6502 <span class="identifier">build_parser</span><span class="special">&lt;</span>
6503   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
6504     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span> <span class="comment">/* apply this parser repeatedly */</span>
6505     <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* use this parser to get the initial value */</span>
6506     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span> <span class="comment">/* use this function to add a new value to the summary */</span>
6507   <span class="special">&gt;</span>
6508 <span class="special">&gt;;</span>
6509<span class="keyword">using</span> <span class="identifier">minus_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'-'</span><span class="special">&gt;&gt;;</span>
6510
6511<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">one_of</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6512
6513<span class="keyword">using</span> <span class="identifier">exp_parser12</span> <span class="special">=</span>
6514 <span class="identifier">build_parser</span><span class="special">&lt;</span>
6515   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
6516     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
6517     <span class="identifier">int_token</span><span class="special">,</span>
6518     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
6519   <span class="special">&gt;</span>
6520 <span class="special">&gt;;</span>
6521<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">minus</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6522
6523<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">char</span> <span class="identifier">Op</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">;</span>
6524
6525<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'+'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
6526
6527<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'-'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">minus</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
6528
6529<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">S</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Item</span><span class="special">&gt;</span>
6530 <span class="keyword">struct</span> <span class="identifier">binary_op</span> <span class="special">:</span>
6531   <span class="identifier">eval_binary_op</span><span class="special">&lt;</span>
6532     <span class="identifier">S</span><span class="special">,</span>
6533     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">::</span><span class="identifier">value</span><span class="special">,</span>
6534     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;::</span><span class="identifier">type</span>
6535   <span class="special">&gt;</span>
6536   <span class="special">{};</span>
6537
6538<span class="keyword">using</span> <span class="identifier">exp_parser13</span> <span class="special">=</span>
6539 <span class="identifier">build_parser</span><span class="special">&lt;</span>
6540   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
6541     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
6542     <span class="identifier">int_token</span><span class="special">,</span>
6543     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
6544   <span class="special">&gt;</span>
6545 <span class="special">&gt;;</span>
6546<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">times</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6547
6548<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'*'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">times</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
6549
6550<span class="keyword">using</span> <span class="identifier">times_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'*'</span><span class="special">&gt;&gt;;</span>
6551
6552<span class="keyword">using</span> <span class="identifier">exp_parser14</span> <span class="special">=</span>
6553 <span class="identifier">build_parser</span><span class="special">&lt;</span>
6554   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
6555     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">,</span> <span class="identifier">times_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
6556     <span class="identifier">int_token</span><span class="special">,</span>
6557     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
6558   <span class="special">&gt;</span>
6559 <span class="special">&gt;;</span>
6560<span class="keyword">using</span> <span class="identifier">mult_exp1</span> <span class="special">=</span> <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;&gt;;</span>
6561
6562<span class="keyword">using</span> <span class="identifier">exp_parser15</span> <span class="special">=</span>
6563 <span class="identifier">build_parser</span><span class="special">&lt;</span>
6564   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
6565     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp1</span><span class="special">&gt;,</span>
6566     <span class="identifier">mult_exp1</span><span class="special">,</span>
6567     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
6568   <span class="special">&gt;</span>
6569 <span class="special">&gt;;</span>
6570<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">divides</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6571
6572<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'/'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">divides</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
6573
6574<span class="keyword">using</span> <span class="identifier">divides_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'/'</span><span class="special">&gt;&gt;;</span>
6575
6576<span class="keyword">using</span> <span class="identifier">mult_exp2</span> <span class="special">=</span>
6577 <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
6578   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
6579   <span class="identifier">int_token</span><span class="special">,</span>
6580   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
6581 <span class="special">&gt;;</span>
6582
6583<span class="keyword">using</span> <span class="identifier">exp_parser16</span> <span class="special">=</span>
6584 <span class="identifier">build_parser</span><span class="special">&lt;</span>
6585   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
6586     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp2</span><span class="special">&gt;,</span>
6587     <span class="identifier">mult_exp2</span><span class="special">,</span>
6588     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
6589   <span class="special">&gt;</span>
6590 <span class="special">&gt;;</span>
6591<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">S</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Item</span><span class="special">&gt;</span>
6592 <span class="keyword">struct</span> <span class="identifier">reverse_binary_op</span> <span class="special">:</span>
6593   <span class="identifier">eval_binary_op</span><span class="special">&lt;</span>
6594     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">,</span>
6595     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">::</span><span class="identifier">value</span><span class="special">,</span>
6596     <span class="identifier">S</span>
6597   <span class="special">&gt;</span>
6598   <span class="special">{};</span>
6599
6600<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">foldr_start_with_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6601
6602<span class="keyword">using</span> <span class="identifier">mult_exp3</span> <span class="special">=</span>
6603 <span class="identifier">foldr_start_with_parser</span><span class="special">&lt;</span>
6604   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">&gt;&gt;,</span> <span class="comment">/* The parser applied repeatedly */</span>
6605   <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* The parser parsing the last number */</span>
6606   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">reverse_binary_op</span><span class="special">&gt;</span> <span class="comment">/* The function called for every result */</span>
6607                                         <span class="comment">/* of applying the above parser */</span>
6608 <span class="special">&gt;;</span>
6609
6610<span class="keyword">using</span> <span class="identifier">exp_parser17</span> <span class="special">=</span>
6611 <span class="identifier">build_parser</span><span class="special">&lt;</span>
6612   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
6613     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp3</span><span class="special">&gt;,</span>
6614     <span class="identifier">mult_exp3</span><span class="special">,</span>
6615     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
6616   <span class="special">&gt;</span>
6617 <span class="special">&gt;;</span>
6618<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">negate</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6619
6620<span class="keyword">using</span> <span class="identifier">unary_exp1</span> <span class="special">=</span>
6621 <span class="identifier">foldr_start_with_parser</span><span class="special">&lt;</span>
6622   <span class="identifier">minus_token</span><span class="special">,</span>
6623   <span class="identifier">int_token</span><span class="special">,</span>
6624   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">negate</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">&gt;&gt;::</span><span class="identifier">type</span>
6625 <span class="special">&gt;;</span>
6626
6627<span class="keyword">using</span> <span class="identifier">mult_exp4</span> <span class="special">=</span>
6628 <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
6629   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">&gt;,</span> <span class="identifier">unary_exp1</span><span class="special">&gt;,</span>
6630   <span class="identifier">unary_exp1</span><span class="special">,</span>
6631   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
6632 <span class="special">&gt;;</span>
6633
6634<span class="keyword">using</span> <span class="identifier">exp_parser18</span> <span class="special">=</span>
6635 <span class="identifier">build_parser</span><span class="special">&lt;</span>
6636   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
6637     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp4</span><span class="special">&gt;,</span>
6638     <span class="identifier">mult_exp4</span><span class="special">,</span>
6639     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
6640   <span class="special">&gt;</span>
6641 <span class="special">&gt;;</span>
6642<span class="keyword">using</span> <span class="identifier">lparen_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'('</span><span class="special">&gt;&gt;;</span>
6643
6644<span class="keyword">using</span> <span class="identifier">rparen_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">')'</span><span class="special">&gt;&gt;;</span>
6645
6646<span class="keyword">using</span> <span class="identifier">plus_exp1</span> <span class="special">=</span>
6647 <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
6648   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp4</span><span class="special">&gt;,</span>
6649   <span class="identifier">mult_exp4</span><span class="special">,</span>
6650   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
6651 <span class="special">&gt;;</span>
6652
6653<span class="keyword">using</span> <span class="identifier">paren_exp1</span> <span class="special">=</span> <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">lparen_token</span><span class="special">,</span> <span class="identifier">plus_exp1</span><span class="special">,</span> <span class="identifier">rparen_token</span><span class="special">&gt;;</span>
6654
6655<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">middle_of</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6656
6657<span class="keyword">using</span> <span class="identifier">paren_exp2</span> <span class="special">=</span> <span class="identifier">middle_of</span><span class="special">&lt;</span><span class="identifier">lparen_token</span><span class="special">,</span> <span class="identifier">plus_exp1</span><span class="special">,</span> <span class="identifier">rparen_token</span><span class="special">&gt;;</span>
6658
6659<span class="keyword">using</span> <span class="identifier">primary_exp1</span> <span class="special">=</span> <span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">paren_exp2</span><span class="special">&gt;;</span>
6660
6661<span class="keyword">struct</span> <span class="identifier">plus_exp2</span><span class="special">;</span>
6662
6663<span class="keyword">using</span> <span class="identifier">paren_exp3</span> <span class="special">=</span> <span class="identifier">middle_of</span><span class="special">&lt;</span><span class="identifier">lparen_token</span><span class="special">,</span> <span class="identifier">plus_exp2</span><span class="special">,</span> <span class="identifier">rparen_token</span><span class="special">&gt;;</span>
6664
6665<span class="keyword">using</span> <span class="identifier">primary_exp2</span> <span class="special">=</span> <span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">paren_exp2</span><span class="special">&gt;;</span>
6666
6667<span class="keyword">using</span> <span class="identifier">unary_exp2</span> <span class="special">=</span>
6668 <span class="identifier">foldr_start_with_parser</span><span class="special">&lt;</span>
6669   <span class="identifier">minus_token</span><span class="special">,</span>
6670   <span class="identifier">primary_exp2</span><span class="special">,</span>
6671   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">negate</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">&gt;&gt;::</span><span class="identifier">type</span>
6672 <span class="special">&gt;;</span>
6673
6674<span class="keyword">using</span> <span class="identifier">mult_exp5</span> <span class="special">=</span>
6675 <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
6676   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">&gt;,</span> <span class="identifier">unary_exp2</span><span class="special">&gt;,</span>
6677   <span class="identifier">unary_exp2</span><span class="special">,</span>
6678   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
6679 <span class="special">&gt;;</span>
6680
6681<span class="keyword">struct</span> <span class="identifier">plus_exp2</span> <span class="special">:</span>
6682 <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
6683   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp5</span><span class="special">&gt;,</span>
6684   <span class="identifier">mult_exp5</span><span class="special">,</span>
6685   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
6686 <span class="special">&gt;</span> <span class="special">{};</span>
6687
6688<span class="keyword">using</span> <span class="identifier">exp_parser19</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">plus_exp2</span><span class="special">&gt;;</span>
6689</pre>
6690<p>
6691        <a name="before_11_1"></a><span class="emphasis"><em>Definitions before section 11.1.</em></span>
6692      </p>
6693<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">string</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6694<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">int_</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6695
6696<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">build_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6697
6698<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">metaparse</span><span class="special">;</span>
6699
6700<span class="keyword">using</span> <span class="identifier">exp_parser1</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
6701<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">entire_input</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6702
6703<span class="keyword">using</span> <span class="identifier">exp_parser2</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;;</span>
6704<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">token</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6705
6706<span class="keyword">using</span> <span class="identifier">exp_parser3</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;&gt;;</span>
6707<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">lit_c</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6708
6709<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">sequence</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6710
6711<span class="keyword">using</span> <span class="identifier">exp_parser4</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;&gt;;</span>
6712
6713<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">metashell</span><span class="special">/</span><span class="identifier">formatter</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6714
6715<span class="keyword">using</span> <span class="identifier">int_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
6716
6717<span class="keyword">using</span> <span class="identifier">plus_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;;</span>
6718
6719<span class="keyword">using</span> <span class="identifier">exp_parser5</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;;</span>
6720<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">transform</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6721
6722<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">plus</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6723
6724<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">at</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6725
6726<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">&gt;</span>
6727 <span class="keyword">struct</span> <span class="identifier">eval_plus</span> <span class="special">:</span>
6728   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span>
6729     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">,</span>
6730     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">2</span><span class="special">&gt;::</span><span class="identifier">type</span>
6731   <span class="special">&gt;</span> <span class="special">{};</span>
6732
6733<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">quote</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6734
6735<span class="keyword">using</span> <span class="identifier">exp_parser6</span> <span class="special">=</span>
6736 <span class="identifier">build_parser</span><span class="special">&lt;</span>
6737   <span class="identifier">transform</span><span class="special">&lt;</span>
6738     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
6739     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">eval_plus</span><span class="special">&gt;</span>
6740   <span class="special">&gt;</span>
6741 <span class="special">&gt;;</span>
6742<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">any</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6743
6744<span class="keyword">using</span> <span class="identifier">exp_parser7</span> <span class="special">=</span>
6745 <span class="identifier">build_parser</span><span class="special">&lt;</span>
6746   <span class="identifier">sequence</span><span class="special">&lt;</span>
6747     <span class="identifier">int_token</span><span class="special">,</span>                                <span class="comment">/* The first &lt;number&gt; */</span>
6748     <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;</span> <span class="comment">/* The "+ &lt;number&gt;" elements */</span>
6749   <span class="special">&gt;</span>
6750 <span class="special">&gt;;</span>
6751<span class="keyword">using</span> <span class="identifier">temp_result</span> <span class="special">=</span> <span class="identifier">exp_parser7</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 + 3 + 4"</span><span class="special">)&gt;::</span><span class="identifier">type</span><span class="special">;</span>
6752<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">fold</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6753
6754<span class="keyword">using</span> <span class="identifier">vector_of_numbers</span> <span class="special">=</span>
6755 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span>
6756   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">2</span><span class="special">&gt;,</span>
6757   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">5</span><span class="special">&gt;,</span>
6758   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">6</span><span class="special">&gt;</span>
6759 <span class="special">&gt;;</span>
6760
6761<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">&gt;</span>
6762 <span class="keyword">struct</span> <span class="identifier">sum_vector</span> <span class="special">:</span>
6763    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
6764      <span class="identifier">Vector</span><span class="special">,</span>
6765      <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
6766      <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
6767        <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_2</span><span class="special">&gt;</span>
6768      <span class="special">&gt;::</span><span class="identifier">type</span>
6769    <span class="special">&gt;</span>
6770  <span class="special">{};</span>
6771
6772<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Sum</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Item</span><span class="special">&gt;</span>
6773   <span class="keyword">struct</span> <span class="identifier">sum_items</span> <span class="special">:</span>
6774     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span>
6775       <span class="identifier">Sum</span><span class="special">,</span>
6776       <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;::</span><span class="identifier">type</span>
6777     <span class="special">&gt;</span>
6778 <span class="special">{};</span>
6779<span class="keyword">using</span> <span class="identifier">exp_parser8</span> <span class="special">=</span>
6780 <span class="identifier">build_parser</span><span class="special">&lt;</span>
6781   <span class="identifier">sequence</span><span class="special">&lt;</span>
6782     <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* parse the first &lt;number&gt; */</span>
6783     <span class="identifier">transform</span><span class="special">&lt;</span>
6784       <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;,</span> <span class="comment">/* parse the "+ &lt;number&gt;" elements */</span>
6785       <span class="comment">/* lambda expression summarising the "+ &lt;number&gt;" elements using fold */</span>
6786       <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
6787         <span class="comment">/* The folding expression we have just created */</span>
6788         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
6789           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span> <span class="comment">/* the argument of the lambda expression, the result */</span>
6790                           <span class="comment">/* of the repeated&lt;...&gt; parser */</span>
6791           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
6792           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
6793         <span class="special">&gt;</span>
6794       <span class="special">&gt;::</span><span class="identifier">type</span>
6795     <span class="special">&gt;</span>
6796   <span class="special">&gt;</span>
6797 <span class="special">&gt;;</span>
6798
6799<span class="keyword">using</span> <span class="identifier">exp_parser9</span> <span class="special">=</span>
6800 <span class="identifier">build_parser</span><span class="special">&lt;</span>
6801   <span class="identifier">transform</span><span class="special">&lt;</span>
6802     <span class="comment">/* What we had so far */</span>
6803     <span class="identifier">sequence</span><span class="special">&lt;</span>
6804       <span class="identifier">int_token</span><span class="special">,</span>
6805       <span class="identifier">transform</span><span class="special">&lt;</span>
6806         <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;,</span>
6807         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
6808           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
6809             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span>
6810             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
6811             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
6812           <span class="special">&gt;</span>
6813         <span class="special">&gt;::</span><span class="identifier">type</span>
6814       <span class="special">&gt;</span>
6815     <span class="special">&gt;,</span>
6816     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">sum_vector</span><span class="special">&gt;</span> <span class="comment">/* summarise the vector of numbers */</span>
6817   <span class="special">&gt;</span>
6818 <span class="special">&gt;;</span>
6819<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">foldl</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6820
6821<span class="keyword">using</span> <span class="identifier">exp_parser10</span> <span class="special">=</span>
6822 <span class="identifier">build_parser</span><span class="special">&lt;</span>
6823   <span class="identifier">transform</span><span class="special">&lt;</span>
6824     <span class="identifier">sequence</span><span class="special">&lt;</span>
6825       <span class="identifier">int_token</span><span class="special">,</span>
6826       <span class="identifier">foldl</span><span class="special">&lt;</span>
6827         <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
6828         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
6829         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
6830       <span class="special">&gt;</span>
6831     <span class="special">&gt;,</span>
6832     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">sum_vector</span><span class="special">&gt;&gt;</span>
6833 <span class="special">&gt;;</span>
6834<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">foldl_start_with_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6835
6836<span class="keyword">using</span> <span class="identifier">exp_parser11</span> <span class="special">=</span>
6837 <span class="identifier">build_parser</span><span class="special">&lt;</span>
6838   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
6839     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span> <span class="comment">/* apply this parser repeatedly */</span>
6840     <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* use this parser to get the initial value */</span>
6841     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span> <span class="comment">/* use this function to add a new value to the summary */</span>
6842   <span class="special">&gt;</span>
6843 <span class="special">&gt;;</span>
6844<span class="keyword">using</span> <span class="identifier">minus_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'-'</span><span class="special">&gt;&gt;;</span>
6845
6846<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">one_of</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6847
6848<span class="keyword">using</span> <span class="identifier">exp_parser12</span> <span class="special">=</span>
6849 <span class="identifier">build_parser</span><span class="special">&lt;</span>
6850   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
6851     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
6852     <span class="identifier">int_token</span><span class="special">,</span>
6853     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
6854   <span class="special">&gt;</span>
6855 <span class="special">&gt;;</span>
6856<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">minus</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6857
6858<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">char</span> <span class="identifier">Op</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">;</span>
6859
6860<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'+'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
6861
6862<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'-'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">minus</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
6863
6864<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">S</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Item</span><span class="special">&gt;</span>
6865 <span class="keyword">struct</span> <span class="identifier">binary_op</span> <span class="special">:</span>
6866   <span class="identifier">eval_binary_op</span><span class="special">&lt;</span>
6867     <span class="identifier">S</span><span class="special">,</span>
6868     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">::</span><span class="identifier">value</span><span class="special">,</span>
6869     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;::</span><span class="identifier">type</span>
6870   <span class="special">&gt;</span>
6871   <span class="special">{};</span>
6872
6873<span class="keyword">using</span> <span class="identifier">exp_parser13</span> <span class="special">=</span>
6874 <span class="identifier">build_parser</span><span class="special">&lt;</span>
6875   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
6876     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
6877     <span class="identifier">int_token</span><span class="special">,</span>
6878     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
6879   <span class="special">&gt;</span>
6880 <span class="special">&gt;;</span>
6881<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">times</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6882
6883<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'*'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">times</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
6884
6885<span class="keyword">using</span> <span class="identifier">times_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'*'</span><span class="special">&gt;&gt;;</span>
6886
6887<span class="keyword">using</span> <span class="identifier">exp_parser14</span> <span class="special">=</span>
6888 <span class="identifier">build_parser</span><span class="special">&lt;</span>
6889   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
6890     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">,</span> <span class="identifier">times_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
6891     <span class="identifier">int_token</span><span class="special">,</span>
6892     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
6893   <span class="special">&gt;</span>
6894 <span class="special">&gt;;</span>
6895<span class="keyword">using</span> <span class="identifier">mult_exp1</span> <span class="special">=</span> <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;&gt;;</span>
6896
6897<span class="keyword">using</span> <span class="identifier">exp_parser15</span> <span class="special">=</span>
6898 <span class="identifier">build_parser</span><span class="special">&lt;</span>
6899   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
6900     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp1</span><span class="special">&gt;,</span>
6901     <span class="identifier">mult_exp1</span><span class="special">,</span>
6902     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
6903   <span class="special">&gt;</span>
6904 <span class="special">&gt;;</span>
6905<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">divides</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6906
6907<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'/'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">divides</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
6908
6909<span class="keyword">using</span> <span class="identifier">divides_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'/'</span><span class="special">&gt;&gt;;</span>
6910
6911<span class="keyword">using</span> <span class="identifier">mult_exp2</span> <span class="special">=</span>
6912 <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
6913   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
6914   <span class="identifier">int_token</span><span class="special">,</span>
6915   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
6916 <span class="special">&gt;;</span>
6917
6918<span class="keyword">using</span> <span class="identifier">exp_parser16</span> <span class="special">=</span>
6919 <span class="identifier">build_parser</span><span class="special">&lt;</span>
6920   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
6921     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp2</span><span class="special">&gt;,</span>
6922     <span class="identifier">mult_exp2</span><span class="special">,</span>
6923     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
6924   <span class="special">&gt;</span>
6925 <span class="special">&gt;;</span>
6926<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">S</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Item</span><span class="special">&gt;</span>
6927 <span class="keyword">struct</span> <span class="identifier">reverse_binary_op</span> <span class="special">:</span>
6928   <span class="identifier">eval_binary_op</span><span class="special">&lt;</span>
6929     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">,</span>
6930     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">::</span><span class="identifier">value</span><span class="special">,</span>
6931     <span class="identifier">S</span>
6932   <span class="special">&gt;</span>
6933   <span class="special">{};</span>
6934
6935<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">foldr_start_with_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6936
6937<span class="keyword">using</span> <span class="identifier">mult_exp3</span> <span class="special">=</span>
6938 <span class="identifier">foldr_start_with_parser</span><span class="special">&lt;</span>
6939   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">&gt;&gt;,</span> <span class="comment">/* The parser applied repeatedly */</span>
6940   <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* The parser parsing the last number */</span>
6941   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">reverse_binary_op</span><span class="special">&gt;</span> <span class="comment">/* The function called for every result */</span>
6942                                         <span class="comment">/* of applying the above parser */</span>
6943 <span class="special">&gt;;</span>
6944
6945<span class="keyword">using</span> <span class="identifier">exp_parser17</span> <span class="special">=</span>
6946 <span class="identifier">build_parser</span><span class="special">&lt;</span>
6947   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
6948     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp3</span><span class="special">&gt;,</span>
6949     <span class="identifier">mult_exp3</span><span class="special">,</span>
6950     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
6951   <span class="special">&gt;</span>
6952 <span class="special">&gt;;</span>
6953<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">negate</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6954
6955<span class="keyword">using</span> <span class="identifier">unary_exp1</span> <span class="special">=</span>
6956 <span class="identifier">foldr_start_with_parser</span><span class="special">&lt;</span>
6957   <span class="identifier">minus_token</span><span class="special">,</span>
6958   <span class="identifier">int_token</span><span class="special">,</span>
6959   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">negate</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">&gt;&gt;::</span><span class="identifier">type</span>
6960 <span class="special">&gt;;</span>
6961
6962<span class="keyword">using</span> <span class="identifier">mult_exp4</span> <span class="special">=</span>
6963 <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
6964   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">&gt;,</span> <span class="identifier">unary_exp1</span><span class="special">&gt;,</span>
6965   <span class="identifier">unary_exp1</span><span class="special">,</span>
6966   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
6967 <span class="special">&gt;;</span>
6968
6969<span class="keyword">using</span> <span class="identifier">exp_parser18</span> <span class="special">=</span>
6970 <span class="identifier">build_parser</span><span class="special">&lt;</span>
6971   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
6972     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp4</span><span class="special">&gt;,</span>
6973     <span class="identifier">mult_exp4</span><span class="special">,</span>
6974     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
6975   <span class="special">&gt;</span>
6976 <span class="special">&gt;;</span>
6977<span class="keyword">using</span> <span class="identifier">lparen_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'('</span><span class="special">&gt;&gt;;</span>
6978
6979<span class="keyword">using</span> <span class="identifier">rparen_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">')'</span><span class="special">&gt;&gt;;</span>
6980
6981<span class="keyword">using</span> <span class="identifier">plus_exp1</span> <span class="special">=</span>
6982 <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
6983   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp4</span><span class="special">&gt;,</span>
6984   <span class="identifier">mult_exp4</span><span class="special">,</span>
6985   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
6986 <span class="special">&gt;;</span>
6987
6988<span class="keyword">using</span> <span class="identifier">paren_exp1</span> <span class="special">=</span> <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">lparen_token</span><span class="special">,</span> <span class="identifier">plus_exp1</span><span class="special">,</span> <span class="identifier">rparen_token</span><span class="special">&gt;;</span>
6989
6990<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">middle_of</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
6991
6992<span class="keyword">using</span> <span class="identifier">paren_exp2</span> <span class="special">=</span> <span class="identifier">middle_of</span><span class="special">&lt;</span><span class="identifier">lparen_token</span><span class="special">,</span> <span class="identifier">plus_exp1</span><span class="special">,</span> <span class="identifier">rparen_token</span><span class="special">&gt;;</span>
6993
6994<span class="keyword">using</span> <span class="identifier">primary_exp1</span> <span class="special">=</span> <span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">paren_exp2</span><span class="special">&gt;;</span>
6995
6996<span class="keyword">struct</span> <span class="identifier">plus_exp2</span><span class="special">;</span>
6997
6998<span class="keyword">using</span> <span class="identifier">paren_exp3</span> <span class="special">=</span> <span class="identifier">middle_of</span><span class="special">&lt;</span><span class="identifier">lparen_token</span><span class="special">,</span> <span class="identifier">plus_exp2</span><span class="special">,</span> <span class="identifier">rparen_token</span><span class="special">&gt;;</span>
6999
7000<span class="keyword">using</span> <span class="identifier">primary_exp2</span> <span class="special">=</span> <span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">paren_exp2</span><span class="special">&gt;;</span>
7001
7002<span class="keyword">using</span> <span class="identifier">unary_exp2</span> <span class="special">=</span>
7003 <span class="identifier">foldr_start_with_parser</span><span class="special">&lt;</span>
7004   <span class="identifier">minus_token</span><span class="special">,</span>
7005   <span class="identifier">primary_exp2</span><span class="special">,</span>
7006   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">negate</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">&gt;&gt;::</span><span class="identifier">type</span>
7007 <span class="special">&gt;;</span>
7008
7009<span class="keyword">using</span> <span class="identifier">mult_exp5</span> <span class="special">=</span>
7010 <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
7011   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">&gt;,</span> <span class="identifier">unary_exp2</span><span class="special">&gt;,</span>
7012   <span class="identifier">unary_exp2</span><span class="special">,</span>
7013   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
7014 <span class="special">&gt;;</span>
7015
7016<span class="keyword">struct</span> <span class="identifier">plus_exp2</span> <span class="special">:</span>
7017 <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
7018   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp5</span><span class="special">&gt;,</span>
7019   <span class="identifier">mult_exp5</span><span class="special">,</span>
7020   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
7021 <span class="special">&gt;</span> <span class="special">{};</span>
7022
7023<span class="keyword">using</span> <span class="identifier">exp_parser19</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">plus_exp2</span><span class="special">&gt;;</span>
7024</pre>
7025<p>
7026        <a name="before_11_2"></a><span class="emphasis"><em>Definitions before section 11.2.</em></span>
7027      </p>
7028<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">string</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7029<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">int_</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7030
7031<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">build_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7032
7033<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">metaparse</span><span class="special">;</span>
7034
7035<span class="keyword">using</span> <span class="identifier">exp_parser1</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
7036<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">entire_input</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7037
7038<span class="keyword">using</span> <span class="identifier">exp_parser2</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;;</span>
7039<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">token</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7040
7041<span class="keyword">using</span> <span class="identifier">exp_parser3</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;&gt;;</span>
7042<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">lit_c</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7043
7044<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">sequence</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7045
7046<span class="keyword">using</span> <span class="identifier">exp_parser4</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;&gt;;</span>
7047
7048<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">metashell</span><span class="special">/</span><span class="identifier">formatter</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7049
7050<span class="keyword">using</span> <span class="identifier">int_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
7051
7052<span class="keyword">using</span> <span class="identifier">plus_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;;</span>
7053
7054<span class="keyword">using</span> <span class="identifier">exp_parser5</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;;</span>
7055<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">transform</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7056
7057<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">plus</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7058
7059<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">at</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7060
7061<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">&gt;</span>
7062 <span class="keyword">struct</span> <span class="identifier">eval_plus</span> <span class="special">:</span>
7063   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span>
7064     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">,</span>
7065     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">2</span><span class="special">&gt;::</span><span class="identifier">type</span>
7066   <span class="special">&gt;</span> <span class="special">{};</span>
7067
7068<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">quote</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7069
7070<span class="keyword">using</span> <span class="identifier">exp_parser6</span> <span class="special">=</span>
7071 <span class="identifier">build_parser</span><span class="special">&lt;</span>
7072   <span class="identifier">transform</span><span class="special">&lt;</span>
7073     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
7074     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">eval_plus</span><span class="special">&gt;</span>
7075   <span class="special">&gt;</span>
7076 <span class="special">&gt;;</span>
7077<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">any</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7078
7079<span class="keyword">using</span> <span class="identifier">exp_parser7</span> <span class="special">=</span>
7080 <span class="identifier">build_parser</span><span class="special">&lt;</span>
7081   <span class="identifier">sequence</span><span class="special">&lt;</span>
7082     <span class="identifier">int_token</span><span class="special">,</span>                                <span class="comment">/* The first &lt;number&gt; */</span>
7083     <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;</span> <span class="comment">/* The "+ &lt;number&gt;" elements */</span>
7084   <span class="special">&gt;</span>
7085 <span class="special">&gt;;</span>
7086<span class="keyword">using</span> <span class="identifier">temp_result</span> <span class="special">=</span> <span class="identifier">exp_parser7</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 + 3 + 4"</span><span class="special">)&gt;::</span><span class="identifier">type</span><span class="special">;</span>
7087<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">fold</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7088
7089<span class="keyword">using</span> <span class="identifier">vector_of_numbers</span> <span class="special">=</span>
7090 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span>
7091   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">2</span><span class="special">&gt;,</span>
7092   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">5</span><span class="special">&gt;,</span>
7093   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">6</span><span class="special">&gt;</span>
7094 <span class="special">&gt;;</span>
7095
7096<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">&gt;</span>
7097 <span class="keyword">struct</span> <span class="identifier">sum_vector</span> <span class="special">:</span>
7098    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
7099      <span class="identifier">Vector</span><span class="special">,</span>
7100      <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
7101      <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
7102        <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_2</span><span class="special">&gt;</span>
7103      <span class="special">&gt;::</span><span class="identifier">type</span>
7104    <span class="special">&gt;</span>
7105  <span class="special">{};</span>
7106
7107<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Sum</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Item</span><span class="special">&gt;</span>
7108   <span class="keyword">struct</span> <span class="identifier">sum_items</span> <span class="special">:</span>
7109     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span>
7110       <span class="identifier">Sum</span><span class="special">,</span>
7111       <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;::</span><span class="identifier">type</span>
7112     <span class="special">&gt;</span>
7113 <span class="special">{};</span>
7114<span class="keyword">using</span> <span class="identifier">exp_parser8</span> <span class="special">=</span>
7115 <span class="identifier">build_parser</span><span class="special">&lt;</span>
7116   <span class="identifier">sequence</span><span class="special">&lt;</span>
7117     <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* parse the first &lt;number&gt; */</span>
7118     <span class="identifier">transform</span><span class="special">&lt;</span>
7119       <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;,</span> <span class="comment">/* parse the "+ &lt;number&gt;" elements */</span>
7120       <span class="comment">/* lambda expression summarising the "+ &lt;number&gt;" elements using fold */</span>
7121       <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
7122         <span class="comment">/* The folding expression we have just created */</span>
7123         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
7124           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span> <span class="comment">/* the argument of the lambda expression, the result */</span>
7125                           <span class="comment">/* of the repeated&lt;...&gt; parser */</span>
7126           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
7127           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
7128         <span class="special">&gt;</span>
7129       <span class="special">&gt;::</span><span class="identifier">type</span>
7130     <span class="special">&gt;</span>
7131   <span class="special">&gt;</span>
7132 <span class="special">&gt;;</span>
7133
7134<span class="keyword">using</span> <span class="identifier">exp_parser9</span> <span class="special">=</span>
7135 <span class="identifier">build_parser</span><span class="special">&lt;</span>
7136   <span class="identifier">transform</span><span class="special">&lt;</span>
7137     <span class="comment">/* What we had so far */</span>
7138     <span class="identifier">sequence</span><span class="special">&lt;</span>
7139       <span class="identifier">int_token</span><span class="special">,</span>
7140       <span class="identifier">transform</span><span class="special">&lt;</span>
7141         <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;,</span>
7142         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
7143           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
7144             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span>
7145             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
7146             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
7147           <span class="special">&gt;</span>
7148         <span class="special">&gt;::</span><span class="identifier">type</span>
7149       <span class="special">&gt;</span>
7150     <span class="special">&gt;,</span>
7151     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">sum_vector</span><span class="special">&gt;</span> <span class="comment">/* summarise the vector of numbers */</span>
7152   <span class="special">&gt;</span>
7153 <span class="special">&gt;;</span>
7154<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">foldl</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7155
7156<span class="keyword">using</span> <span class="identifier">exp_parser10</span> <span class="special">=</span>
7157 <span class="identifier">build_parser</span><span class="special">&lt;</span>
7158   <span class="identifier">transform</span><span class="special">&lt;</span>
7159     <span class="identifier">sequence</span><span class="special">&lt;</span>
7160       <span class="identifier">int_token</span><span class="special">,</span>
7161       <span class="identifier">foldl</span><span class="special">&lt;</span>
7162         <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
7163         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
7164         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
7165       <span class="special">&gt;</span>
7166     <span class="special">&gt;,</span>
7167     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">sum_vector</span><span class="special">&gt;&gt;</span>
7168 <span class="special">&gt;;</span>
7169<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">foldl_start_with_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7170
7171<span class="keyword">using</span> <span class="identifier">exp_parser11</span> <span class="special">=</span>
7172 <span class="identifier">build_parser</span><span class="special">&lt;</span>
7173   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
7174     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span> <span class="comment">/* apply this parser repeatedly */</span>
7175     <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* use this parser to get the initial value */</span>
7176     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span> <span class="comment">/* use this function to add a new value to the summary */</span>
7177   <span class="special">&gt;</span>
7178 <span class="special">&gt;;</span>
7179<span class="keyword">using</span> <span class="identifier">minus_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'-'</span><span class="special">&gt;&gt;;</span>
7180
7181<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">one_of</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7182
7183<span class="keyword">using</span> <span class="identifier">exp_parser12</span> <span class="special">=</span>
7184 <span class="identifier">build_parser</span><span class="special">&lt;</span>
7185   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
7186     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
7187     <span class="identifier">int_token</span><span class="special">,</span>
7188     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
7189   <span class="special">&gt;</span>
7190 <span class="special">&gt;;</span>
7191<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">minus</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7192
7193<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">char</span> <span class="identifier">Op</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">;</span>
7194
7195<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'+'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
7196
7197<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'-'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">minus</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
7198
7199<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">S</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Item</span><span class="special">&gt;</span>
7200 <span class="keyword">struct</span> <span class="identifier">binary_op</span> <span class="special">:</span>
7201   <span class="identifier">eval_binary_op</span><span class="special">&lt;</span>
7202     <span class="identifier">S</span><span class="special">,</span>
7203     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">::</span><span class="identifier">value</span><span class="special">,</span>
7204     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;::</span><span class="identifier">type</span>
7205   <span class="special">&gt;</span>
7206   <span class="special">{};</span>
7207
7208<span class="keyword">using</span> <span class="identifier">exp_parser13</span> <span class="special">=</span>
7209 <span class="identifier">build_parser</span><span class="special">&lt;</span>
7210   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
7211     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
7212     <span class="identifier">int_token</span><span class="special">,</span>
7213     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
7214   <span class="special">&gt;</span>
7215 <span class="special">&gt;;</span>
7216<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">times</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7217
7218<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'*'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">times</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
7219
7220<span class="keyword">using</span> <span class="identifier">times_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'*'</span><span class="special">&gt;&gt;;</span>
7221
7222<span class="keyword">using</span> <span class="identifier">exp_parser14</span> <span class="special">=</span>
7223 <span class="identifier">build_parser</span><span class="special">&lt;</span>
7224   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
7225     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">,</span> <span class="identifier">times_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
7226     <span class="identifier">int_token</span><span class="special">,</span>
7227     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
7228   <span class="special">&gt;</span>
7229 <span class="special">&gt;;</span>
7230<span class="keyword">using</span> <span class="identifier">mult_exp1</span> <span class="special">=</span> <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;&gt;;</span>
7231
7232<span class="keyword">using</span> <span class="identifier">exp_parser15</span> <span class="special">=</span>
7233 <span class="identifier">build_parser</span><span class="special">&lt;</span>
7234   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
7235     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp1</span><span class="special">&gt;,</span>
7236     <span class="identifier">mult_exp1</span><span class="special">,</span>
7237     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
7238   <span class="special">&gt;</span>
7239 <span class="special">&gt;;</span>
7240<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">divides</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7241
7242<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'/'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">divides</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
7243
7244<span class="keyword">using</span> <span class="identifier">divides_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'/'</span><span class="special">&gt;&gt;;</span>
7245
7246<span class="keyword">using</span> <span class="identifier">mult_exp2</span> <span class="special">=</span>
7247 <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
7248   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
7249   <span class="identifier">int_token</span><span class="special">,</span>
7250   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
7251 <span class="special">&gt;;</span>
7252
7253<span class="keyword">using</span> <span class="identifier">exp_parser16</span> <span class="special">=</span>
7254 <span class="identifier">build_parser</span><span class="special">&lt;</span>
7255   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
7256     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp2</span><span class="special">&gt;,</span>
7257     <span class="identifier">mult_exp2</span><span class="special">,</span>
7258     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
7259   <span class="special">&gt;</span>
7260 <span class="special">&gt;;</span>
7261<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">S</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Item</span><span class="special">&gt;</span>
7262 <span class="keyword">struct</span> <span class="identifier">reverse_binary_op</span> <span class="special">:</span>
7263   <span class="identifier">eval_binary_op</span><span class="special">&lt;</span>
7264     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">,</span>
7265     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">::</span><span class="identifier">value</span><span class="special">,</span>
7266     <span class="identifier">S</span>
7267   <span class="special">&gt;</span>
7268   <span class="special">{};</span>
7269
7270<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">foldr_start_with_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7271
7272<span class="keyword">using</span> <span class="identifier">mult_exp3</span> <span class="special">=</span>
7273 <span class="identifier">foldr_start_with_parser</span><span class="special">&lt;</span>
7274   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">&gt;&gt;,</span> <span class="comment">/* The parser applied repeatedly */</span>
7275   <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* The parser parsing the last number */</span>
7276   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">reverse_binary_op</span><span class="special">&gt;</span> <span class="comment">/* The function called for every result */</span>
7277                                         <span class="comment">/* of applying the above parser */</span>
7278 <span class="special">&gt;;</span>
7279
7280<span class="keyword">using</span> <span class="identifier">exp_parser17</span> <span class="special">=</span>
7281 <span class="identifier">build_parser</span><span class="special">&lt;</span>
7282   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
7283     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp3</span><span class="special">&gt;,</span>
7284     <span class="identifier">mult_exp3</span><span class="special">,</span>
7285     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
7286   <span class="special">&gt;</span>
7287 <span class="special">&gt;;</span>
7288<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">negate</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7289
7290<span class="keyword">using</span> <span class="identifier">unary_exp1</span> <span class="special">=</span>
7291 <span class="identifier">foldr_start_with_parser</span><span class="special">&lt;</span>
7292   <span class="identifier">minus_token</span><span class="special">,</span>
7293   <span class="identifier">int_token</span><span class="special">,</span>
7294   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">negate</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">&gt;&gt;::</span><span class="identifier">type</span>
7295 <span class="special">&gt;;</span>
7296
7297<span class="keyword">using</span> <span class="identifier">mult_exp4</span> <span class="special">=</span>
7298 <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
7299   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">&gt;,</span> <span class="identifier">unary_exp1</span><span class="special">&gt;,</span>
7300   <span class="identifier">unary_exp1</span><span class="special">,</span>
7301   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
7302 <span class="special">&gt;;</span>
7303
7304<span class="keyword">using</span> <span class="identifier">exp_parser18</span> <span class="special">=</span>
7305 <span class="identifier">build_parser</span><span class="special">&lt;</span>
7306   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
7307     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp4</span><span class="special">&gt;,</span>
7308     <span class="identifier">mult_exp4</span><span class="special">,</span>
7309     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
7310   <span class="special">&gt;</span>
7311 <span class="special">&gt;;</span>
7312<span class="keyword">using</span> <span class="identifier">lparen_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'('</span><span class="special">&gt;&gt;;</span>
7313
7314<span class="keyword">using</span> <span class="identifier">rparen_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">')'</span><span class="special">&gt;&gt;;</span>
7315
7316<span class="keyword">using</span> <span class="identifier">plus_exp1</span> <span class="special">=</span>
7317 <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
7318   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp4</span><span class="special">&gt;,</span>
7319   <span class="identifier">mult_exp4</span><span class="special">,</span>
7320   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
7321 <span class="special">&gt;;</span>
7322
7323<span class="keyword">using</span> <span class="identifier">paren_exp1</span> <span class="special">=</span> <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">lparen_token</span><span class="special">,</span> <span class="identifier">plus_exp1</span><span class="special">,</span> <span class="identifier">rparen_token</span><span class="special">&gt;;</span>
7324
7325<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">middle_of</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7326
7327<span class="keyword">using</span> <span class="identifier">paren_exp2</span> <span class="special">=</span> <span class="identifier">middle_of</span><span class="special">&lt;</span><span class="identifier">lparen_token</span><span class="special">,</span> <span class="identifier">plus_exp1</span><span class="special">,</span> <span class="identifier">rparen_token</span><span class="special">&gt;;</span>
7328
7329<span class="keyword">using</span> <span class="identifier">primary_exp1</span> <span class="special">=</span> <span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">paren_exp2</span><span class="special">&gt;;</span>
7330
7331<span class="keyword">struct</span> <span class="identifier">plus_exp2</span><span class="special">;</span>
7332
7333<span class="keyword">using</span> <span class="identifier">paren_exp3</span> <span class="special">=</span> <span class="identifier">middle_of</span><span class="special">&lt;</span><span class="identifier">lparen_token</span><span class="special">,</span> <span class="identifier">plus_exp2</span><span class="special">,</span> <span class="identifier">rparen_token</span><span class="special">&gt;;</span>
7334
7335<span class="keyword">using</span> <span class="identifier">primary_exp2</span> <span class="special">=</span> <span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">paren_exp2</span><span class="special">&gt;;</span>
7336
7337<span class="keyword">using</span> <span class="identifier">unary_exp2</span> <span class="special">=</span>
7338 <span class="identifier">foldr_start_with_parser</span><span class="special">&lt;</span>
7339   <span class="identifier">minus_token</span><span class="special">,</span>
7340   <span class="identifier">primary_exp2</span><span class="special">,</span>
7341   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">negate</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">&gt;&gt;::</span><span class="identifier">type</span>
7342 <span class="special">&gt;;</span>
7343
7344<span class="keyword">using</span> <span class="identifier">mult_exp5</span> <span class="special">=</span>
7345 <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
7346   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">&gt;,</span> <span class="identifier">unary_exp2</span><span class="special">&gt;,</span>
7347   <span class="identifier">unary_exp2</span><span class="special">,</span>
7348   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
7349 <span class="special">&gt;;</span>
7350
7351<span class="keyword">struct</span> <span class="identifier">plus_exp2</span> <span class="special">:</span>
7352 <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
7353   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp5</span><span class="special">&gt;,</span>
7354   <span class="identifier">mult_exp5</span><span class="special">,</span>
7355   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
7356 <span class="special">&gt;</span> <span class="special">{};</span>
7357
7358<span class="keyword">using</span> <span class="identifier">exp_parser19</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">plus_exp2</span><span class="special">&gt;;</span>
7359</pre>
7360<p>
7361        <a name="before_11_3"></a><span class="emphasis"><em>Definitions before section 11.3.</em></span>
7362      </p>
7363<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">string</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7364<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">int_</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7365
7366<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">build_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7367
7368<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">metaparse</span><span class="special">;</span>
7369
7370<span class="keyword">using</span> <span class="identifier">exp_parser1</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
7371<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">entire_input</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7372
7373<span class="keyword">using</span> <span class="identifier">exp_parser2</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;;</span>
7374<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">token</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7375
7376<span class="keyword">using</span> <span class="identifier">exp_parser3</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;&gt;;</span>
7377<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">lit_c</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7378
7379<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">sequence</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7380
7381<span class="keyword">using</span> <span class="identifier">exp_parser4</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;&gt;;</span>
7382
7383<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">metashell</span><span class="special">/</span><span class="identifier">formatter</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7384
7385<span class="keyword">using</span> <span class="identifier">int_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
7386
7387<span class="keyword">using</span> <span class="identifier">plus_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;;</span>
7388
7389<span class="keyword">using</span> <span class="identifier">exp_parser5</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;;</span>
7390<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">transform</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7391
7392<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">plus</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7393
7394<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">at</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7395
7396<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">&gt;</span>
7397 <span class="keyword">struct</span> <span class="identifier">eval_plus</span> <span class="special">:</span>
7398   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span>
7399     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">,</span>
7400     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">2</span><span class="special">&gt;::</span><span class="identifier">type</span>
7401   <span class="special">&gt;</span> <span class="special">{};</span>
7402
7403<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">quote</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7404
7405<span class="keyword">using</span> <span class="identifier">exp_parser6</span> <span class="special">=</span>
7406 <span class="identifier">build_parser</span><span class="special">&lt;</span>
7407   <span class="identifier">transform</span><span class="special">&lt;</span>
7408     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
7409     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">eval_plus</span><span class="special">&gt;</span>
7410   <span class="special">&gt;</span>
7411 <span class="special">&gt;;</span>
7412<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">any</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7413
7414<span class="keyword">using</span> <span class="identifier">exp_parser7</span> <span class="special">=</span>
7415 <span class="identifier">build_parser</span><span class="special">&lt;</span>
7416   <span class="identifier">sequence</span><span class="special">&lt;</span>
7417     <span class="identifier">int_token</span><span class="special">,</span>                                <span class="comment">/* The first &lt;number&gt; */</span>
7418     <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;</span> <span class="comment">/* The "+ &lt;number&gt;" elements */</span>
7419   <span class="special">&gt;</span>
7420 <span class="special">&gt;;</span>
7421<span class="keyword">using</span> <span class="identifier">temp_result</span> <span class="special">=</span> <span class="identifier">exp_parser7</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 + 3 + 4"</span><span class="special">)&gt;::</span><span class="identifier">type</span><span class="special">;</span>
7422<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">fold</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7423
7424<span class="keyword">using</span> <span class="identifier">vector_of_numbers</span> <span class="special">=</span>
7425 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span>
7426   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">2</span><span class="special">&gt;,</span>
7427   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">5</span><span class="special">&gt;,</span>
7428   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">6</span><span class="special">&gt;</span>
7429 <span class="special">&gt;;</span>
7430
7431<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">&gt;</span>
7432 <span class="keyword">struct</span> <span class="identifier">sum_vector</span> <span class="special">:</span>
7433    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
7434      <span class="identifier">Vector</span><span class="special">,</span>
7435      <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
7436      <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
7437        <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_2</span><span class="special">&gt;</span>
7438      <span class="special">&gt;::</span><span class="identifier">type</span>
7439    <span class="special">&gt;</span>
7440  <span class="special">{};</span>
7441
7442<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Sum</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Item</span><span class="special">&gt;</span>
7443   <span class="keyword">struct</span> <span class="identifier">sum_items</span> <span class="special">:</span>
7444     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span>
7445       <span class="identifier">Sum</span><span class="special">,</span>
7446       <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;::</span><span class="identifier">type</span>
7447     <span class="special">&gt;</span>
7448 <span class="special">{};</span>
7449<span class="keyword">using</span> <span class="identifier">exp_parser8</span> <span class="special">=</span>
7450 <span class="identifier">build_parser</span><span class="special">&lt;</span>
7451   <span class="identifier">sequence</span><span class="special">&lt;</span>
7452     <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* parse the first &lt;number&gt; */</span>
7453     <span class="identifier">transform</span><span class="special">&lt;</span>
7454       <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;,</span> <span class="comment">/* parse the "+ &lt;number&gt;" elements */</span>
7455       <span class="comment">/* lambda expression summarising the "+ &lt;number&gt;" elements using fold */</span>
7456       <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
7457         <span class="comment">/* The folding expression we have just created */</span>
7458         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
7459           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span> <span class="comment">/* the argument of the lambda expression, the result */</span>
7460                           <span class="comment">/* of the repeated&lt;...&gt; parser */</span>
7461           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
7462           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
7463         <span class="special">&gt;</span>
7464       <span class="special">&gt;::</span><span class="identifier">type</span>
7465     <span class="special">&gt;</span>
7466   <span class="special">&gt;</span>
7467 <span class="special">&gt;;</span>
7468
7469<span class="keyword">using</span> <span class="identifier">exp_parser9</span> <span class="special">=</span>
7470 <span class="identifier">build_parser</span><span class="special">&lt;</span>
7471   <span class="identifier">transform</span><span class="special">&lt;</span>
7472     <span class="comment">/* What we had so far */</span>
7473     <span class="identifier">sequence</span><span class="special">&lt;</span>
7474       <span class="identifier">int_token</span><span class="special">,</span>
7475       <span class="identifier">transform</span><span class="special">&lt;</span>
7476         <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;,</span>
7477         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
7478           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
7479             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span>
7480             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
7481             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
7482           <span class="special">&gt;</span>
7483         <span class="special">&gt;::</span><span class="identifier">type</span>
7484       <span class="special">&gt;</span>
7485     <span class="special">&gt;,</span>
7486     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">sum_vector</span><span class="special">&gt;</span> <span class="comment">/* summarise the vector of numbers */</span>
7487   <span class="special">&gt;</span>
7488 <span class="special">&gt;;</span>
7489<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">foldl</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7490
7491<span class="keyword">using</span> <span class="identifier">exp_parser10</span> <span class="special">=</span>
7492 <span class="identifier">build_parser</span><span class="special">&lt;</span>
7493   <span class="identifier">transform</span><span class="special">&lt;</span>
7494     <span class="identifier">sequence</span><span class="special">&lt;</span>
7495       <span class="identifier">int_token</span><span class="special">,</span>
7496       <span class="identifier">foldl</span><span class="special">&lt;</span>
7497         <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
7498         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
7499         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
7500       <span class="special">&gt;</span>
7501     <span class="special">&gt;,</span>
7502     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">sum_vector</span><span class="special">&gt;&gt;</span>
7503 <span class="special">&gt;;</span>
7504<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">foldl_start_with_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7505
7506<span class="keyword">using</span> <span class="identifier">exp_parser11</span> <span class="special">=</span>
7507 <span class="identifier">build_parser</span><span class="special">&lt;</span>
7508   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
7509     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span> <span class="comment">/* apply this parser repeatedly */</span>
7510     <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* use this parser to get the initial value */</span>
7511     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span> <span class="comment">/* use this function to add a new value to the summary */</span>
7512   <span class="special">&gt;</span>
7513 <span class="special">&gt;;</span>
7514<span class="keyword">using</span> <span class="identifier">minus_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'-'</span><span class="special">&gt;&gt;;</span>
7515
7516<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">one_of</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7517
7518<span class="keyword">using</span> <span class="identifier">exp_parser12</span> <span class="special">=</span>
7519 <span class="identifier">build_parser</span><span class="special">&lt;</span>
7520   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
7521     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
7522     <span class="identifier">int_token</span><span class="special">,</span>
7523     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
7524   <span class="special">&gt;</span>
7525 <span class="special">&gt;;</span>
7526<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">minus</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7527
7528<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">char</span> <span class="identifier">Op</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">;</span>
7529
7530<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'+'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
7531
7532<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'-'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">minus</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
7533
7534<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">S</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Item</span><span class="special">&gt;</span>
7535 <span class="keyword">struct</span> <span class="identifier">binary_op</span> <span class="special">:</span>
7536   <span class="identifier">eval_binary_op</span><span class="special">&lt;</span>
7537     <span class="identifier">S</span><span class="special">,</span>
7538     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">::</span><span class="identifier">value</span><span class="special">,</span>
7539     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;::</span><span class="identifier">type</span>
7540   <span class="special">&gt;</span>
7541   <span class="special">{};</span>
7542
7543<span class="keyword">using</span> <span class="identifier">exp_parser13</span> <span class="special">=</span>
7544 <span class="identifier">build_parser</span><span class="special">&lt;</span>
7545   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
7546     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
7547     <span class="identifier">int_token</span><span class="special">,</span>
7548     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
7549   <span class="special">&gt;</span>
7550 <span class="special">&gt;;</span>
7551<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">times</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7552
7553<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'*'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">times</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
7554
7555<span class="keyword">using</span> <span class="identifier">times_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'*'</span><span class="special">&gt;&gt;;</span>
7556
7557<span class="keyword">using</span> <span class="identifier">exp_parser14</span> <span class="special">=</span>
7558 <span class="identifier">build_parser</span><span class="special">&lt;</span>
7559   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
7560     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">,</span> <span class="identifier">times_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
7561     <span class="identifier">int_token</span><span class="special">,</span>
7562     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
7563   <span class="special">&gt;</span>
7564 <span class="special">&gt;;</span>
7565<span class="keyword">using</span> <span class="identifier">mult_exp1</span> <span class="special">=</span> <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;&gt;;</span>
7566
7567<span class="keyword">using</span> <span class="identifier">exp_parser15</span> <span class="special">=</span>
7568 <span class="identifier">build_parser</span><span class="special">&lt;</span>
7569   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
7570     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp1</span><span class="special">&gt;,</span>
7571     <span class="identifier">mult_exp1</span><span class="special">,</span>
7572     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
7573   <span class="special">&gt;</span>
7574 <span class="special">&gt;;</span>
7575<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">divides</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7576
7577<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'/'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">divides</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
7578
7579<span class="keyword">using</span> <span class="identifier">divides_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'/'</span><span class="special">&gt;&gt;;</span>
7580
7581<span class="keyword">using</span> <span class="identifier">mult_exp2</span> <span class="special">=</span>
7582 <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
7583   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
7584   <span class="identifier">int_token</span><span class="special">,</span>
7585   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
7586 <span class="special">&gt;;</span>
7587
7588<span class="keyword">using</span> <span class="identifier">exp_parser16</span> <span class="special">=</span>
7589 <span class="identifier">build_parser</span><span class="special">&lt;</span>
7590   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
7591     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp2</span><span class="special">&gt;,</span>
7592     <span class="identifier">mult_exp2</span><span class="special">,</span>
7593     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
7594   <span class="special">&gt;</span>
7595 <span class="special">&gt;;</span>
7596<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">S</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Item</span><span class="special">&gt;</span>
7597 <span class="keyword">struct</span> <span class="identifier">reverse_binary_op</span> <span class="special">:</span>
7598   <span class="identifier">eval_binary_op</span><span class="special">&lt;</span>
7599     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">,</span>
7600     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">::</span><span class="identifier">value</span><span class="special">,</span>
7601     <span class="identifier">S</span>
7602   <span class="special">&gt;</span>
7603   <span class="special">{};</span>
7604
7605<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">foldr_start_with_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7606
7607<span class="keyword">using</span> <span class="identifier">mult_exp3</span> <span class="special">=</span>
7608 <span class="identifier">foldr_start_with_parser</span><span class="special">&lt;</span>
7609   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">&gt;&gt;,</span> <span class="comment">/* The parser applied repeatedly */</span>
7610   <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* The parser parsing the last number */</span>
7611   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">reverse_binary_op</span><span class="special">&gt;</span> <span class="comment">/* The function called for every result */</span>
7612                                         <span class="comment">/* of applying the above parser */</span>
7613 <span class="special">&gt;;</span>
7614
7615<span class="keyword">using</span> <span class="identifier">exp_parser17</span> <span class="special">=</span>
7616 <span class="identifier">build_parser</span><span class="special">&lt;</span>
7617   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
7618     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp3</span><span class="special">&gt;,</span>
7619     <span class="identifier">mult_exp3</span><span class="special">,</span>
7620     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
7621   <span class="special">&gt;</span>
7622 <span class="special">&gt;;</span>
7623<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">negate</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7624
7625<span class="keyword">using</span> <span class="identifier">unary_exp1</span> <span class="special">=</span>
7626 <span class="identifier">foldr_start_with_parser</span><span class="special">&lt;</span>
7627   <span class="identifier">minus_token</span><span class="special">,</span>
7628   <span class="identifier">int_token</span><span class="special">,</span>
7629   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">negate</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">&gt;&gt;::</span><span class="identifier">type</span>
7630 <span class="special">&gt;;</span>
7631
7632<span class="keyword">using</span> <span class="identifier">mult_exp4</span> <span class="special">=</span>
7633 <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
7634   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">&gt;,</span> <span class="identifier">unary_exp1</span><span class="special">&gt;,</span>
7635   <span class="identifier">unary_exp1</span><span class="special">,</span>
7636   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
7637 <span class="special">&gt;;</span>
7638
7639<span class="keyword">using</span> <span class="identifier">exp_parser18</span> <span class="special">=</span>
7640 <span class="identifier">build_parser</span><span class="special">&lt;</span>
7641   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
7642     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp4</span><span class="special">&gt;,</span>
7643     <span class="identifier">mult_exp4</span><span class="special">,</span>
7644     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
7645   <span class="special">&gt;</span>
7646 <span class="special">&gt;;</span>
7647<span class="keyword">using</span> <span class="identifier">lparen_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'('</span><span class="special">&gt;&gt;;</span>
7648
7649<span class="keyword">using</span> <span class="identifier">rparen_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">')'</span><span class="special">&gt;&gt;;</span>
7650
7651<span class="keyword">using</span> <span class="identifier">plus_exp1</span> <span class="special">=</span>
7652 <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
7653   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp4</span><span class="special">&gt;,</span>
7654   <span class="identifier">mult_exp4</span><span class="special">,</span>
7655   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
7656 <span class="special">&gt;;</span>
7657
7658<span class="keyword">using</span> <span class="identifier">paren_exp1</span> <span class="special">=</span> <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">lparen_token</span><span class="special">,</span> <span class="identifier">plus_exp1</span><span class="special">,</span> <span class="identifier">rparen_token</span><span class="special">&gt;;</span>
7659
7660<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">middle_of</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7661
7662<span class="keyword">using</span> <span class="identifier">paren_exp2</span> <span class="special">=</span> <span class="identifier">middle_of</span><span class="special">&lt;</span><span class="identifier">lparen_token</span><span class="special">,</span> <span class="identifier">plus_exp1</span><span class="special">,</span> <span class="identifier">rparen_token</span><span class="special">&gt;;</span>
7663
7664<span class="keyword">using</span> <span class="identifier">primary_exp1</span> <span class="special">=</span> <span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">paren_exp2</span><span class="special">&gt;;</span>
7665
7666<span class="keyword">struct</span> <span class="identifier">plus_exp2</span><span class="special">;</span>
7667
7668<span class="keyword">using</span> <span class="identifier">paren_exp3</span> <span class="special">=</span> <span class="identifier">middle_of</span><span class="special">&lt;</span><span class="identifier">lparen_token</span><span class="special">,</span> <span class="identifier">plus_exp2</span><span class="special">,</span> <span class="identifier">rparen_token</span><span class="special">&gt;;</span>
7669
7670<span class="keyword">using</span> <span class="identifier">primary_exp2</span> <span class="special">=</span> <span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">paren_exp2</span><span class="special">&gt;;</span>
7671
7672<span class="keyword">using</span> <span class="identifier">unary_exp2</span> <span class="special">=</span>
7673 <span class="identifier">foldr_start_with_parser</span><span class="special">&lt;</span>
7674   <span class="identifier">minus_token</span><span class="special">,</span>
7675   <span class="identifier">primary_exp2</span><span class="special">,</span>
7676   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">negate</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">&gt;&gt;::</span><span class="identifier">type</span>
7677 <span class="special">&gt;;</span>
7678
7679<span class="keyword">using</span> <span class="identifier">mult_exp5</span> <span class="special">=</span>
7680 <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
7681   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">&gt;,</span> <span class="identifier">unary_exp2</span><span class="special">&gt;,</span>
7682   <span class="identifier">unary_exp2</span><span class="special">,</span>
7683   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
7684 <span class="special">&gt;;</span>
7685
7686<span class="keyword">struct</span> <span class="identifier">plus_exp2</span> <span class="special">:</span>
7687 <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
7688   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp5</span><span class="special">&gt;,</span>
7689   <span class="identifier">mult_exp5</span><span class="special">,</span>
7690   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
7691 <span class="special">&gt;</span> <span class="special">{};</span>
7692
7693<span class="keyword">using</span> <span class="identifier">exp_parser19</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">plus_exp2</span><span class="special">&gt;;</span>
7694<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">define_error</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7695
7696<span class="identifier">BOOST_METAPARSE_DEFINE_ERROR</span><span class="special">(</span><span class="identifier">missing_primary_expression</span><span class="special">,</span> <span class="string">"Missing primary expression"</span><span class="special">);</span>
7697
7698<span class="keyword">struct</span> <span class="identifier">plus_exp3</span><span class="special">;</span>
7699
7700<span class="keyword">using</span> <span class="identifier">paren_exp4</span> <span class="special">=</span> <span class="identifier">middle_of</span><span class="special">&lt;</span><span class="identifier">lparen_token</span><span class="special">,</span> <span class="identifier">plus_exp3</span><span class="special">,</span> <span class="identifier">rparen_token</span><span class="special">&gt;;</span>
7701
7702<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">fail</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7703
7704<span class="keyword">using</span> <span class="identifier">primary_exp3</span> <span class="special">=</span> <span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">paren_exp4</span><span class="special">,</span> <span class="identifier">fail</span><span class="special">&lt;</span><span class="identifier">missing_primary_expression</span><span class="special">&gt;&gt;;</span>
7705
7706<span class="keyword">using</span> <span class="identifier">unary_exp3</span> <span class="special">=</span>
7707 <span class="identifier">foldr_start_with_parser</span><span class="special">&lt;</span>
7708   <span class="identifier">minus_token</span><span class="special">,</span>
7709   <span class="identifier">primary_exp3</span><span class="special">,</span>
7710   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">negate</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">&gt;&gt;::</span><span class="identifier">type</span>
7711 <span class="special">&gt;;</span>
7712
7713<span class="keyword">using</span> <span class="identifier">mult_exp6</span> <span class="special">=</span>
7714 <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
7715   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">&gt;,</span> <span class="identifier">unary_exp3</span><span class="special">&gt;,</span>
7716   <span class="identifier">unary_exp3</span><span class="special">,</span>
7717   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
7718 <span class="special">&gt;;</span>
7719
7720<span class="keyword">struct</span> <span class="identifier">plus_exp3</span> <span class="special">:</span>
7721 <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
7722   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp6</span><span class="special">&gt;,</span>
7723   <span class="identifier">mult_exp6</span><span class="special">,</span>
7724   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
7725 <span class="special">&gt;</span> <span class="special">{};</span>
7726
7727<span class="keyword">using</span> <span class="identifier">exp_parser20</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">plus_exp3</span><span class="special">&gt;;</span>
7728</pre>
7729<p>
7730        <a name="before_11_3_1"></a><span class="emphasis"><em>Definitions before section 11.3.1.</em></span>
7731      </p>
7732<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">string</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7733<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">int_</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7734
7735<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">build_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7736
7737<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">metaparse</span><span class="special">;</span>
7738
7739<span class="keyword">using</span> <span class="identifier">exp_parser1</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
7740<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">entire_input</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7741
7742<span class="keyword">using</span> <span class="identifier">exp_parser2</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;;</span>
7743<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">token</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7744
7745<span class="keyword">using</span> <span class="identifier">exp_parser3</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;&gt;;</span>
7746<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">lit_c</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7747
7748<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">sequence</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7749
7750<span class="keyword">using</span> <span class="identifier">exp_parser4</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;&gt;;</span>
7751
7752<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">metashell</span><span class="special">/</span><span class="identifier">formatter</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7753
7754<span class="keyword">using</span> <span class="identifier">int_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
7755
7756<span class="keyword">using</span> <span class="identifier">plus_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;;</span>
7757
7758<span class="keyword">using</span> <span class="identifier">exp_parser5</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;;</span>
7759<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">transform</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7760
7761<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">plus</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7762
7763<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">at</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7764
7765<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">&gt;</span>
7766 <span class="keyword">struct</span> <span class="identifier">eval_plus</span> <span class="special">:</span>
7767   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span>
7768     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">,</span>
7769     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">2</span><span class="special">&gt;::</span><span class="identifier">type</span>
7770   <span class="special">&gt;</span> <span class="special">{};</span>
7771
7772<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">quote</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7773
7774<span class="keyword">using</span> <span class="identifier">exp_parser6</span> <span class="special">=</span>
7775 <span class="identifier">build_parser</span><span class="special">&lt;</span>
7776   <span class="identifier">transform</span><span class="special">&lt;</span>
7777     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
7778     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">eval_plus</span><span class="special">&gt;</span>
7779   <span class="special">&gt;</span>
7780 <span class="special">&gt;;</span>
7781<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">any</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7782
7783<span class="keyword">using</span> <span class="identifier">exp_parser7</span> <span class="special">=</span>
7784 <span class="identifier">build_parser</span><span class="special">&lt;</span>
7785   <span class="identifier">sequence</span><span class="special">&lt;</span>
7786     <span class="identifier">int_token</span><span class="special">,</span>                                <span class="comment">/* The first &lt;number&gt; */</span>
7787     <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;</span> <span class="comment">/* The "+ &lt;number&gt;" elements */</span>
7788   <span class="special">&gt;</span>
7789 <span class="special">&gt;;</span>
7790<span class="keyword">using</span> <span class="identifier">temp_result</span> <span class="special">=</span> <span class="identifier">exp_parser7</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 + 3 + 4"</span><span class="special">)&gt;::</span><span class="identifier">type</span><span class="special">;</span>
7791<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">fold</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7792
7793<span class="keyword">using</span> <span class="identifier">vector_of_numbers</span> <span class="special">=</span>
7794 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span>
7795   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">2</span><span class="special">&gt;,</span>
7796   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">5</span><span class="special">&gt;,</span>
7797   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">6</span><span class="special">&gt;</span>
7798 <span class="special">&gt;;</span>
7799
7800<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">&gt;</span>
7801 <span class="keyword">struct</span> <span class="identifier">sum_vector</span> <span class="special">:</span>
7802    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
7803      <span class="identifier">Vector</span><span class="special">,</span>
7804      <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
7805      <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
7806        <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_2</span><span class="special">&gt;</span>
7807      <span class="special">&gt;::</span><span class="identifier">type</span>
7808    <span class="special">&gt;</span>
7809  <span class="special">{};</span>
7810
7811<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Sum</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Item</span><span class="special">&gt;</span>
7812   <span class="keyword">struct</span> <span class="identifier">sum_items</span> <span class="special">:</span>
7813     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span>
7814       <span class="identifier">Sum</span><span class="special">,</span>
7815       <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;::</span><span class="identifier">type</span>
7816     <span class="special">&gt;</span>
7817 <span class="special">{};</span>
7818<span class="keyword">using</span> <span class="identifier">exp_parser8</span> <span class="special">=</span>
7819 <span class="identifier">build_parser</span><span class="special">&lt;</span>
7820   <span class="identifier">sequence</span><span class="special">&lt;</span>
7821     <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* parse the first &lt;number&gt; */</span>
7822     <span class="identifier">transform</span><span class="special">&lt;</span>
7823       <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;,</span> <span class="comment">/* parse the "+ &lt;number&gt;" elements */</span>
7824       <span class="comment">/* lambda expression summarising the "+ &lt;number&gt;" elements using fold */</span>
7825       <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
7826         <span class="comment">/* The folding expression we have just created */</span>
7827         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
7828           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span> <span class="comment">/* the argument of the lambda expression, the result */</span>
7829                           <span class="comment">/* of the repeated&lt;...&gt; parser */</span>
7830           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
7831           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
7832         <span class="special">&gt;</span>
7833       <span class="special">&gt;::</span><span class="identifier">type</span>
7834     <span class="special">&gt;</span>
7835   <span class="special">&gt;</span>
7836 <span class="special">&gt;;</span>
7837
7838<span class="keyword">using</span> <span class="identifier">exp_parser9</span> <span class="special">=</span>
7839 <span class="identifier">build_parser</span><span class="special">&lt;</span>
7840   <span class="identifier">transform</span><span class="special">&lt;</span>
7841     <span class="comment">/* What we had so far */</span>
7842     <span class="identifier">sequence</span><span class="special">&lt;</span>
7843       <span class="identifier">int_token</span><span class="special">,</span>
7844       <span class="identifier">transform</span><span class="special">&lt;</span>
7845         <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;,</span>
7846         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
7847           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
7848             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span>
7849             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
7850             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
7851           <span class="special">&gt;</span>
7852         <span class="special">&gt;::</span><span class="identifier">type</span>
7853       <span class="special">&gt;</span>
7854     <span class="special">&gt;,</span>
7855     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">sum_vector</span><span class="special">&gt;</span> <span class="comment">/* summarise the vector of numbers */</span>
7856   <span class="special">&gt;</span>
7857 <span class="special">&gt;;</span>
7858<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">foldl</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7859
7860<span class="keyword">using</span> <span class="identifier">exp_parser10</span> <span class="special">=</span>
7861 <span class="identifier">build_parser</span><span class="special">&lt;</span>
7862   <span class="identifier">transform</span><span class="special">&lt;</span>
7863     <span class="identifier">sequence</span><span class="special">&lt;</span>
7864       <span class="identifier">int_token</span><span class="special">,</span>
7865       <span class="identifier">foldl</span><span class="special">&lt;</span>
7866         <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
7867         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
7868         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
7869       <span class="special">&gt;</span>
7870     <span class="special">&gt;,</span>
7871     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">sum_vector</span><span class="special">&gt;&gt;</span>
7872 <span class="special">&gt;;</span>
7873<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">foldl_start_with_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7874
7875<span class="keyword">using</span> <span class="identifier">exp_parser11</span> <span class="special">=</span>
7876 <span class="identifier">build_parser</span><span class="special">&lt;</span>
7877   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
7878     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span> <span class="comment">/* apply this parser repeatedly */</span>
7879     <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* use this parser to get the initial value */</span>
7880     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span> <span class="comment">/* use this function to add a new value to the summary */</span>
7881   <span class="special">&gt;</span>
7882 <span class="special">&gt;;</span>
7883<span class="keyword">using</span> <span class="identifier">minus_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'-'</span><span class="special">&gt;&gt;;</span>
7884
7885<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">one_of</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7886
7887<span class="keyword">using</span> <span class="identifier">exp_parser12</span> <span class="special">=</span>
7888 <span class="identifier">build_parser</span><span class="special">&lt;</span>
7889   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
7890     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
7891     <span class="identifier">int_token</span><span class="special">,</span>
7892     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
7893   <span class="special">&gt;</span>
7894 <span class="special">&gt;;</span>
7895<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">minus</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7896
7897<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">char</span> <span class="identifier">Op</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">;</span>
7898
7899<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'+'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
7900
7901<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'-'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">minus</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
7902
7903<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">S</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Item</span><span class="special">&gt;</span>
7904 <span class="keyword">struct</span> <span class="identifier">binary_op</span> <span class="special">:</span>
7905   <span class="identifier">eval_binary_op</span><span class="special">&lt;</span>
7906     <span class="identifier">S</span><span class="special">,</span>
7907     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">::</span><span class="identifier">value</span><span class="special">,</span>
7908     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;::</span><span class="identifier">type</span>
7909   <span class="special">&gt;</span>
7910   <span class="special">{};</span>
7911
7912<span class="keyword">using</span> <span class="identifier">exp_parser13</span> <span class="special">=</span>
7913 <span class="identifier">build_parser</span><span class="special">&lt;</span>
7914   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
7915     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
7916     <span class="identifier">int_token</span><span class="special">,</span>
7917     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
7918   <span class="special">&gt;</span>
7919 <span class="special">&gt;;</span>
7920<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">times</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7921
7922<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'*'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">times</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
7923
7924<span class="keyword">using</span> <span class="identifier">times_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'*'</span><span class="special">&gt;&gt;;</span>
7925
7926<span class="keyword">using</span> <span class="identifier">exp_parser14</span> <span class="special">=</span>
7927 <span class="identifier">build_parser</span><span class="special">&lt;</span>
7928   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
7929     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">,</span> <span class="identifier">times_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
7930     <span class="identifier">int_token</span><span class="special">,</span>
7931     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
7932   <span class="special">&gt;</span>
7933 <span class="special">&gt;;</span>
7934<span class="keyword">using</span> <span class="identifier">mult_exp1</span> <span class="special">=</span> <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;&gt;;</span>
7935
7936<span class="keyword">using</span> <span class="identifier">exp_parser15</span> <span class="special">=</span>
7937 <span class="identifier">build_parser</span><span class="special">&lt;</span>
7938   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
7939     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp1</span><span class="special">&gt;,</span>
7940     <span class="identifier">mult_exp1</span><span class="special">,</span>
7941     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
7942   <span class="special">&gt;</span>
7943 <span class="special">&gt;;</span>
7944<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">divides</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7945
7946<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'/'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">divides</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
7947
7948<span class="keyword">using</span> <span class="identifier">divides_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'/'</span><span class="special">&gt;&gt;;</span>
7949
7950<span class="keyword">using</span> <span class="identifier">mult_exp2</span> <span class="special">=</span>
7951 <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
7952   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
7953   <span class="identifier">int_token</span><span class="special">,</span>
7954   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
7955 <span class="special">&gt;;</span>
7956
7957<span class="keyword">using</span> <span class="identifier">exp_parser16</span> <span class="special">=</span>
7958 <span class="identifier">build_parser</span><span class="special">&lt;</span>
7959   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
7960     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp2</span><span class="special">&gt;,</span>
7961     <span class="identifier">mult_exp2</span><span class="special">,</span>
7962     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
7963   <span class="special">&gt;</span>
7964 <span class="special">&gt;;</span>
7965<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">S</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Item</span><span class="special">&gt;</span>
7966 <span class="keyword">struct</span> <span class="identifier">reverse_binary_op</span> <span class="special">:</span>
7967   <span class="identifier">eval_binary_op</span><span class="special">&lt;</span>
7968     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">,</span>
7969     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">::</span><span class="identifier">value</span><span class="special">,</span>
7970     <span class="identifier">S</span>
7971   <span class="special">&gt;</span>
7972   <span class="special">{};</span>
7973
7974<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">foldr_start_with_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7975
7976<span class="keyword">using</span> <span class="identifier">mult_exp3</span> <span class="special">=</span>
7977 <span class="identifier">foldr_start_with_parser</span><span class="special">&lt;</span>
7978   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">&gt;&gt;,</span> <span class="comment">/* The parser applied repeatedly */</span>
7979   <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* The parser parsing the last number */</span>
7980   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">reverse_binary_op</span><span class="special">&gt;</span> <span class="comment">/* The function called for every result */</span>
7981                                         <span class="comment">/* of applying the above parser */</span>
7982 <span class="special">&gt;;</span>
7983
7984<span class="keyword">using</span> <span class="identifier">exp_parser17</span> <span class="special">=</span>
7985 <span class="identifier">build_parser</span><span class="special">&lt;</span>
7986   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
7987     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp3</span><span class="special">&gt;,</span>
7988     <span class="identifier">mult_exp3</span><span class="special">,</span>
7989     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
7990   <span class="special">&gt;</span>
7991 <span class="special">&gt;;</span>
7992<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">negate</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
7993
7994<span class="keyword">using</span> <span class="identifier">unary_exp1</span> <span class="special">=</span>
7995 <span class="identifier">foldr_start_with_parser</span><span class="special">&lt;</span>
7996   <span class="identifier">minus_token</span><span class="special">,</span>
7997   <span class="identifier">int_token</span><span class="special">,</span>
7998   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">negate</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">&gt;&gt;::</span><span class="identifier">type</span>
7999 <span class="special">&gt;;</span>
8000
8001<span class="keyword">using</span> <span class="identifier">mult_exp4</span> <span class="special">=</span>
8002 <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
8003   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">&gt;,</span> <span class="identifier">unary_exp1</span><span class="special">&gt;,</span>
8004   <span class="identifier">unary_exp1</span><span class="special">,</span>
8005   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
8006 <span class="special">&gt;;</span>
8007
8008<span class="keyword">using</span> <span class="identifier">exp_parser18</span> <span class="special">=</span>
8009 <span class="identifier">build_parser</span><span class="special">&lt;</span>
8010   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
8011     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp4</span><span class="special">&gt;,</span>
8012     <span class="identifier">mult_exp4</span><span class="special">,</span>
8013     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
8014   <span class="special">&gt;</span>
8015 <span class="special">&gt;;</span>
8016<span class="keyword">using</span> <span class="identifier">lparen_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'('</span><span class="special">&gt;&gt;;</span>
8017
8018<span class="keyword">using</span> <span class="identifier">rparen_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">')'</span><span class="special">&gt;&gt;;</span>
8019
8020<span class="keyword">using</span> <span class="identifier">plus_exp1</span> <span class="special">=</span>
8021 <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
8022   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp4</span><span class="special">&gt;,</span>
8023   <span class="identifier">mult_exp4</span><span class="special">,</span>
8024   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
8025 <span class="special">&gt;;</span>
8026
8027<span class="keyword">using</span> <span class="identifier">paren_exp1</span> <span class="special">=</span> <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">lparen_token</span><span class="special">,</span> <span class="identifier">plus_exp1</span><span class="special">,</span> <span class="identifier">rparen_token</span><span class="special">&gt;;</span>
8028
8029<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">middle_of</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8030
8031<span class="keyword">using</span> <span class="identifier">paren_exp2</span> <span class="special">=</span> <span class="identifier">middle_of</span><span class="special">&lt;</span><span class="identifier">lparen_token</span><span class="special">,</span> <span class="identifier">plus_exp1</span><span class="special">,</span> <span class="identifier">rparen_token</span><span class="special">&gt;;</span>
8032
8033<span class="keyword">using</span> <span class="identifier">primary_exp1</span> <span class="special">=</span> <span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">paren_exp2</span><span class="special">&gt;;</span>
8034
8035<span class="keyword">struct</span> <span class="identifier">plus_exp2</span><span class="special">;</span>
8036
8037<span class="keyword">using</span> <span class="identifier">paren_exp3</span> <span class="special">=</span> <span class="identifier">middle_of</span><span class="special">&lt;</span><span class="identifier">lparen_token</span><span class="special">,</span> <span class="identifier">plus_exp2</span><span class="special">,</span> <span class="identifier">rparen_token</span><span class="special">&gt;;</span>
8038
8039<span class="keyword">using</span> <span class="identifier">primary_exp2</span> <span class="special">=</span> <span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">paren_exp2</span><span class="special">&gt;;</span>
8040
8041<span class="keyword">using</span> <span class="identifier">unary_exp2</span> <span class="special">=</span>
8042 <span class="identifier">foldr_start_with_parser</span><span class="special">&lt;</span>
8043   <span class="identifier">minus_token</span><span class="special">,</span>
8044   <span class="identifier">primary_exp2</span><span class="special">,</span>
8045   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">negate</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">&gt;&gt;::</span><span class="identifier">type</span>
8046 <span class="special">&gt;;</span>
8047
8048<span class="keyword">using</span> <span class="identifier">mult_exp5</span> <span class="special">=</span>
8049 <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
8050   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">&gt;,</span> <span class="identifier">unary_exp2</span><span class="special">&gt;,</span>
8051   <span class="identifier">unary_exp2</span><span class="special">,</span>
8052   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
8053 <span class="special">&gt;;</span>
8054
8055<span class="keyword">struct</span> <span class="identifier">plus_exp2</span> <span class="special">:</span>
8056 <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
8057   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp5</span><span class="special">&gt;,</span>
8058   <span class="identifier">mult_exp5</span><span class="special">,</span>
8059   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
8060 <span class="special">&gt;</span> <span class="special">{};</span>
8061
8062<span class="keyword">using</span> <span class="identifier">exp_parser19</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">plus_exp2</span><span class="special">&gt;;</span>
8063<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">define_error</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8064
8065<span class="identifier">BOOST_METAPARSE_DEFINE_ERROR</span><span class="special">(</span><span class="identifier">missing_primary_expression</span><span class="special">,</span> <span class="string">"Missing primary expression"</span><span class="special">);</span>
8066
8067<span class="keyword">struct</span> <span class="identifier">plus_exp3</span><span class="special">;</span>
8068
8069<span class="keyword">using</span> <span class="identifier">paren_exp4</span> <span class="special">=</span> <span class="identifier">middle_of</span><span class="special">&lt;</span><span class="identifier">lparen_token</span><span class="special">,</span> <span class="identifier">plus_exp3</span><span class="special">,</span> <span class="identifier">rparen_token</span><span class="special">&gt;;</span>
8070
8071<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">fail</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8072
8073<span class="keyword">using</span> <span class="identifier">primary_exp3</span> <span class="special">=</span> <span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">paren_exp4</span><span class="special">,</span> <span class="identifier">fail</span><span class="special">&lt;</span><span class="identifier">missing_primary_expression</span><span class="special">&gt;&gt;;</span>
8074
8075<span class="keyword">using</span> <span class="identifier">unary_exp3</span> <span class="special">=</span>
8076 <span class="identifier">foldr_start_with_parser</span><span class="special">&lt;</span>
8077   <span class="identifier">minus_token</span><span class="special">,</span>
8078   <span class="identifier">primary_exp3</span><span class="special">,</span>
8079   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">negate</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">&gt;&gt;::</span><span class="identifier">type</span>
8080 <span class="special">&gt;;</span>
8081
8082<span class="keyword">using</span> <span class="identifier">mult_exp6</span> <span class="special">=</span>
8083 <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
8084   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">&gt;,</span> <span class="identifier">unary_exp3</span><span class="special">&gt;,</span>
8085   <span class="identifier">unary_exp3</span><span class="special">,</span>
8086   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
8087 <span class="special">&gt;;</span>
8088
8089<span class="keyword">struct</span> <span class="identifier">plus_exp3</span> <span class="special">:</span>
8090 <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
8091   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp6</span><span class="special">&gt;,</span>
8092   <span class="identifier">mult_exp6</span><span class="special">,</span>
8093   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
8094 <span class="special">&gt;</span> <span class="special">{};</span>
8095
8096<span class="keyword">using</span> <span class="identifier">exp_parser20</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">plus_exp3</span><span class="special">&gt;;</span>
8097<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">fail_at_first_char_expected</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8098
8099<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">first_of</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8100
8101<span class="keyword">struct</span> <span class="identifier">plus_exp4</span> <span class="special">:</span>
8102 <span class="identifier">first_of</span><span class="special">&lt;</span>
8103   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
8104     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp6</span><span class="special">&gt;,</span>
8105     <span class="identifier">mult_exp6</span><span class="special">,</span>
8106     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
8107   <span class="special">&gt;,</span>
8108   <span class="identifier">fail_at_first_char_expected</span><span class="special">&lt;</span>
8109     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp6</span><span class="special">&gt;</span>
8110   <span class="special">&gt;</span>
8111 <span class="special">&gt;</span> <span class="special">{};</span>
8112
8113<span class="keyword">using</span> <span class="identifier">exp_parser21</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">plus_exp4</span><span class="special">&gt;;</span>
8114</pre>
8115<p>
8116        <a name="before_11_3_2"></a><span class="emphasis"><em>Definitions before section 11.3.2.</em></span>
8117      </p>
8118<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">string</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8119<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">int_</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8120
8121<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">build_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8122
8123<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">metaparse</span><span class="special">;</span>
8124
8125<span class="keyword">using</span> <span class="identifier">exp_parser1</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
8126<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">entire_input</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8127
8128<span class="keyword">using</span> <span class="identifier">exp_parser2</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;;</span>
8129<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">token</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8130
8131<span class="keyword">using</span> <span class="identifier">exp_parser3</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;&gt;;</span>
8132<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">lit_c</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8133
8134<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">sequence</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8135
8136<span class="keyword">using</span> <span class="identifier">exp_parser4</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;&gt;;</span>
8137
8138<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">metashell</span><span class="special">/</span><span class="identifier">formatter</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8139
8140<span class="keyword">using</span> <span class="identifier">int_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
8141
8142<span class="keyword">using</span> <span class="identifier">plus_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;;</span>
8143
8144<span class="keyword">using</span> <span class="identifier">exp_parser5</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;;</span>
8145<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">transform</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8146
8147<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">plus</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8148
8149<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">at</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8150
8151<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">&gt;</span>
8152 <span class="keyword">struct</span> <span class="identifier">eval_plus</span> <span class="special">:</span>
8153   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span>
8154     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">,</span>
8155     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">2</span><span class="special">&gt;::</span><span class="identifier">type</span>
8156   <span class="special">&gt;</span> <span class="special">{};</span>
8157
8158<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">quote</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8159
8160<span class="keyword">using</span> <span class="identifier">exp_parser6</span> <span class="special">=</span>
8161 <span class="identifier">build_parser</span><span class="special">&lt;</span>
8162   <span class="identifier">transform</span><span class="special">&lt;</span>
8163     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
8164     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">eval_plus</span><span class="special">&gt;</span>
8165   <span class="special">&gt;</span>
8166 <span class="special">&gt;;</span>
8167<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">any</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8168
8169<span class="keyword">using</span> <span class="identifier">exp_parser7</span> <span class="special">=</span>
8170 <span class="identifier">build_parser</span><span class="special">&lt;</span>
8171   <span class="identifier">sequence</span><span class="special">&lt;</span>
8172     <span class="identifier">int_token</span><span class="special">,</span>                                <span class="comment">/* The first &lt;number&gt; */</span>
8173     <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;</span> <span class="comment">/* The "+ &lt;number&gt;" elements */</span>
8174   <span class="special">&gt;</span>
8175 <span class="special">&gt;;</span>
8176<span class="keyword">using</span> <span class="identifier">temp_result</span> <span class="special">=</span> <span class="identifier">exp_parser7</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 + 3 + 4"</span><span class="special">)&gt;::</span><span class="identifier">type</span><span class="special">;</span>
8177<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">fold</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8178
8179<span class="keyword">using</span> <span class="identifier">vector_of_numbers</span> <span class="special">=</span>
8180 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span>
8181   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">2</span><span class="special">&gt;,</span>
8182   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">5</span><span class="special">&gt;,</span>
8183   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">6</span><span class="special">&gt;</span>
8184 <span class="special">&gt;;</span>
8185
8186<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">&gt;</span>
8187 <span class="keyword">struct</span> <span class="identifier">sum_vector</span> <span class="special">:</span>
8188    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
8189      <span class="identifier">Vector</span><span class="special">,</span>
8190      <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
8191      <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
8192        <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_2</span><span class="special">&gt;</span>
8193      <span class="special">&gt;::</span><span class="identifier">type</span>
8194    <span class="special">&gt;</span>
8195  <span class="special">{};</span>
8196
8197<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Sum</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Item</span><span class="special">&gt;</span>
8198   <span class="keyword">struct</span> <span class="identifier">sum_items</span> <span class="special">:</span>
8199     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span>
8200       <span class="identifier">Sum</span><span class="special">,</span>
8201       <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;::</span><span class="identifier">type</span>
8202     <span class="special">&gt;</span>
8203 <span class="special">{};</span>
8204<span class="keyword">using</span> <span class="identifier">exp_parser8</span> <span class="special">=</span>
8205 <span class="identifier">build_parser</span><span class="special">&lt;</span>
8206   <span class="identifier">sequence</span><span class="special">&lt;</span>
8207     <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* parse the first &lt;number&gt; */</span>
8208     <span class="identifier">transform</span><span class="special">&lt;</span>
8209       <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;,</span> <span class="comment">/* parse the "+ &lt;number&gt;" elements */</span>
8210       <span class="comment">/* lambda expression summarising the "+ &lt;number&gt;" elements using fold */</span>
8211       <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
8212         <span class="comment">/* The folding expression we have just created */</span>
8213         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
8214           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span> <span class="comment">/* the argument of the lambda expression, the result */</span>
8215                           <span class="comment">/* of the repeated&lt;...&gt; parser */</span>
8216           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
8217           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
8218         <span class="special">&gt;</span>
8219       <span class="special">&gt;::</span><span class="identifier">type</span>
8220     <span class="special">&gt;</span>
8221   <span class="special">&gt;</span>
8222 <span class="special">&gt;;</span>
8223
8224<span class="keyword">using</span> <span class="identifier">exp_parser9</span> <span class="special">=</span>
8225 <span class="identifier">build_parser</span><span class="special">&lt;</span>
8226   <span class="identifier">transform</span><span class="special">&lt;</span>
8227     <span class="comment">/* What we had so far */</span>
8228     <span class="identifier">sequence</span><span class="special">&lt;</span>
8229       <span class="identifier">int_token</span><span class="special">,</span>
8230       <span class="identifier">transform</span><span class="special">&lt;</span>
8231         <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;,</span>
8232         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
8233           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
8234             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span>
8235             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
8236             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
8237           <span class="special">&gt;</span>
8238         <span class="special">&gt;::</span><span class="identifier">type</span>
8239       <span class="special">&gt;</span>
8240     <span class="special">&gt;,</span>
8241     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">sum_vector</span><span class="special">&gt;</span> <span class="comment">/* summarise the vector of numbers */</span>
8242   <span class="special">&gt;</span>
8243 <span class="special">&gt;;</span>
8244<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">foldl</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8245
8246<span class="keyword">using</span> <span class="identifier">exp_parser10</span> <span class="special">=</span>
8247 <span class="identifier">build_parser</span><span class="special">&lt;</span>
8248   <span class="identifier">transform</span><span class="special">&lt;</span>
8249     <span class="identifier">sequence</span><span class="special">&lt;</span>
8250       <span class="identifier">int_token</span><span class="special">,</span>
8251       <span class="identifier">foldl</span><span class="special">&lt;</span>
8252         <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
8253         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
8254         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
8255       <span class="special">&gt;</span>
8256     <span class="special">&gt;,</span>
8257     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">sum_vector</span><span class="special">&gt;&gt;</span>
8258 <span class="special">&gt;;</span>
8259<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">foldl_start_with_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8260
8261<span class="keyword">using</span> <span class="identifier">exp_parser11</span> <span class="special">=</span>
8262 <span class="identifier">build_parser</span><span class="special">&lt;</span>
8263   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
8264     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span> <span class="comment">/* apply this parser repeatedly */</span>
8265     <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* use this parser to get the initial value */</span>
8266     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span> <span class="comment">/* use this function to add a new value to the summary */</span>
8267   <span class="special">&gt;</span>
8268 <span class="special">&gt;;</span>
8269<span class="keyword">using</span> <span class="identifier">minus_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'-'</span><span class="special">&gt;&gt;;</span>
8270
8271<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">one_of</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8272
8273<span class="keyword">using</span> <span class="identifier">exp_parser12</span> <span class="special">=</span>
8274 <span class="identifier">build_parser</span><span class="special">&lt;</span>
8275   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
8276     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
8277     <span class="identifier">int_token</span><span class="special">,</span>
8278     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
8279   <span class="special">&gt;</span>
8280 <span class="special">&gt;;</span>
8281<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">minus</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8282
8283<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">char</span> <span class="identifier">Op</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">;</span>
8284
8285<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'+'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
8286
8287<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'-'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">minus</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
8288
8289<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">S</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Item</span><span class="special">&gt;</span>
8290 <span class="keyword">struct</span> <span class="identifier">binary_op</span> <span class="special">:</span>
8291   <span class="identifier">eval_binary_op</span><span class="special">&lt;</span>
8292     <span class="identifier">S</span><span class="special">,</span>
8293     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">::</span><span class="identifier">value</span><span class="special">,</span>
8294     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;::</span><span class="identifier">type</span>
8295   <span class="special">&gt;</span>
8296   <span class="special">{};</span>
8297
8298<span class="keyword">using</span> <span class="identifier">exp_parser13</span> <span class="special">=</span>
8299 <span class="identifier">build_parser</span><span class="special">&lt;</span>
8300   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
8301     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
8302     <span class="identifier">int_token</span><span class="special">,</span>
8303     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
8304   <span class="special">&gt;</span>
8305 <span class="special">&gt;;</span>
8306<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">times</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8307
8308<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'*'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">times</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
8309
8310<span class="keyword">using</span> <span class="identifier">times_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'*'</span><span class="special">&gt;&gt;;</span>
8311
8312<span class="keyword">using</span> <span class="identifier">exp_parser14</span> <span class="special">=</span>
8313 <span class="identifier">build_parser</span><span class="special">&lt;</span>
8314   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
8315     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">,</span> <span class="identifier">times_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
8316     <span class="identifier">int_token</span><span class="special">,</span>
8317     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
8318   <span class="special">&gt;</span>
8319 <span class="special">&gt;;</span>
8320<span class="keyword">using</span> <span class="identifier">mult_exp1</span> <span class="special">=</span> <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;&gt;;</span>
8321
8322<span class="keyword">using</span> <span class="identifier">exp_parser15</span> <span class="special">=</span>
8323 <span class="identifier">build_parser</span><span class="special">&lt;</span>
8324   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
8325     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp1</span><span class="special">&gt;,</span>
8326     <span class="identifier">mult_exp1</span><span class="special">,</span>
8327     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
8328   <span class="special">&gt;</span>
8329 <span class="special">&gt;;</span>
8330<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">divides</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8331
8332<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'/'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">divides</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
8333
8334<span class="keyword">using</span> <span class="identifier">divides_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'/'</span><span class="special">&gt;&gt;;</span>
8335
8336<span class="keyword">using</span> <span class="identifier">mult_exp2</span> <span class="special">=</span>
8337 <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
8338   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
8339   <span class="identifier">int_token</span><span class="special">,</span>
8340   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
8341 <span class="special">&gt;;</span>
8342
8343<span class="keyword">using</span> <span class="identifier">exp_parser16</span> <span class="special">=</span>
8344 <span class="identifier">build_parser</span><span class="special">&lt;</span>
8345   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
8346     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp2</span><span class="special">&gt;,</span>
8347     <span class="identifier">mult_exp2</span><span class="special">,</span>
8348     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
8349   <span class="special">&gt;</span>
8350 <span class="special">&gt;;</span>
8351<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">S</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Item</span><span class="special">&gt;</span>
8352 <span class="keyword">struct</span> <span class="identifier">reverse_binary_op</span> <span class="special">:</span>
8353   <span class="identifier">eval_binary_op</span><span class="special">&lt;</span>
8354     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">,</span>
8355     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">::</span><span class="identifier">value</span><span class="special">,</span>
8356     <span class="identifier">S</span>
8357   <span class="special">&gt;</span>
8358   <span class="special">{};</span>
8359
8360<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">foldr_start_with_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8361
8362<span class="keyword">using</span> <span class="identifier">mult_exp3</span> <span class="special">=</span>
8363 <span class="identifier">foldr_start_with_parser</span><span class="special">&lt;</span>
8364   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">&gt;&gt;,</span> <span class="comment">/* The parser applied repeatedly */</span>
8365   <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* The parser parsing the last number */</span>
8366   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">reverse_binary_op</span><span class="special">&gt;</span> <span class="comment">/* The function called for every result */</span>
8367                                         <span class="comment">/* of applying the above parser */</span>
8368 <span class="special">&gt;;</span>
8369
8370<span class="keyword">using</span> <span class="identifier">exp_parser17</span> <span class="special">=</span>
8371 <span class="identifier">build_parser</span><span class="special">&lt;</span>
8372   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
8373     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp3</span><span class="special">&gt;,</span>
8374     <span class="identifier">mult_exp3</span><span class="special">,</span>
8375     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
8376   <span class="special">&gt;</span>
8377 <span class="special">&gt;;</span>
8378<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">negate</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8379
8380<span class="keyword">using</span> <span class="identifier">unary_exp1</span> <span class="special">=</span>
8381 <span class="identifier">foldr_start_with_parser</span><span class="special">&lt;</span>
8382   <span class="identifier">minus_token</span><span class="special">,</span>
8383   <span class="identifier">int_token</span><span class="special">,</span>
8384   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">negate</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">&gt;&gt;::</span><span class="identifier">type</span>
8385 <span class="special">&gt;;</span>
8386
8387<span class="keyword">using</span> <span class="identifier">mult_exp4</span> <span class="special">=</span>
8388 <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
8389   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">&gt;,</span> <span class="identifier">unary_exp1</span><span class="special">&gt;,</span>
8390   <span class="identifier">unary_exp1</span><span class="special">,</span>
8391   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
8392 <span class="special">&gt;;</span>
8393
8394<span class="keyword">using</span> <span class="identifier">exp_parser18</span> <span class="special">=</span>
8395 <span class="identifier">build_parser</span><span class="special">&lt;</span>
8396   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
8397     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp4</span><span class="special">&gt;,</span>
8398     <span class="identifier">mult_exp4</span><span class="special">,</span>
8399     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
8400   <span class="special">&gt;</span>
8401 <span class="special">&gt;;</span>
8402<span class="keyword">using</span> <span class="identifier">lparen_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'('</span><span class="special">&gt;&gt;;</span>
8403
8404<span class="keyword">using</span> <span class="identifier">rparen_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">')'</span><span class="special">&gt;&gt;;</span>
8405
8406<span class="keyword">using</span> <span class="identifier">plus_exp1</span> <span class="special">=</span>
8407 <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
8408   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp4</span><span class="special">&gt;,</span>
8409   <span class="identifier">mult_exp4</span><span class="special">,</span>
8410   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
8411 <span class="special">&gt;;</span>
8412
8413<span class="keyword">using</span> <span class="identifier">paren_exp1</span> <span class="special">=</span> <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">lparen_token</span><span class="special">,</span> <span class="identifier">plus_exp1</span><span class="special">,</span> <span class="identifier">rparen_token</span><span class="special">&gt;;</span>
8414
8415<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">middle_of</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8416
8417<span class="keyword">using</span> <span class="identifier">paren_exp2</span> <span class="special">=</span> <span class="identifier">middle_of</span><span class="special">&lt;</span><span class="identifier">lparen_token</span><span class="special">,</span> <span class="identifier">plus_exp1</span><span class="special">,</span> <span class="identifier">rparen_token</span><span class="special">&gt;;</span>
8418
8419<span class="keyword">using</span> <span class="identifier">primary_exp1</span> <span class="special">=</span> <span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">paren_exp2</span><span class="special">&gt;;</span>
8420
8421<span class="keyword">struct</span> <span class="identifier">plus_exp2</span><span class="special">;</span>
8422
8423<span class="keyword">using</span> <span class="identifier">paren_exp3</span> <span class="special">=</span> <span class="identifier">middle_of</span><span class="special">&lt;</span><span class="identifier">lparen_token</span><span class="special">,</span> <span class="identifier">plus_exp2</span><span class="special">,</span> <span class="identifier">rparen_token</span><span class="special">&gt;;</span>
8424
8425<span class="keyword">using</span> <span class="identifier">primary_exp2</span> <span class="special">=</span> <span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">paren_exp2</span><span class="special">&gt;;</span>
8426
8427<span class="keyword">using</span> <span class="identifier">unary_exp2</span> <span class="special">=</span>
8428 <span class="identifier">foldr_start_with_parser</span><span class="special">&lt;</span>
8429   <span class="identifier">minus_token</span><span class="special">,</span>
8430   <span class="identifier">primary_exp2</span><span class="special">,</span>
8431   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">negate</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">&gt;&gt;::</span><span class="identifier">type</span>
8432 <span class="special">&gt;;</span>
8433
8434<span class="keyword">using</span> <span class="identifier">mult_exp5</span> <span class="special">=</span>
8435 <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
8436   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">&gt;,</span> <span class="identifier">unary_exp2</span><span class="special">&gt;,</span>
8437   <span class="identifier">unary_exp2</span><span class="special">,</span>
8438   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
8439 <span class="special">&gt;;</span>
8440
8441<span class="keyword">struct</span> <span class="identifier">plus_exp2</span> <span class="special">:</span>
8442 <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
8443   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp5</span><span class="special">&gt;,</span>
8444   <span class="identifier">mult_exp5</span><span class="special">,</span>
8445   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
8446 <span class="special">&gt;</span> <span class="special">{};</span>
8447
8448<span class="keyword">using</span> <span class="identifier">exp_parser19</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">plus_exp2</span><span class="special">&gt;;</span>
8449<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">define_error</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8450
8451<span class="identifier">BOOST_METAPARSE_DEFINE_ERROR</span><span class="special">(</span><span class="identifier">missing_primary_expression</span><span class="special">,</span> <span class="string">"Missing primary expression"</span><span class="special">);</span>
8452
8453<span class="keyword">struct</span> <span class="identifier">plus_exp3</span><span class="special">;</span>
8454
8455<span class="keyword">using</span> <span class="identifier">paren_exp4</span> <span class="special">=</span> <span class="identifier">middle_of</span><span class="special">&lt;</span><span class="identifier">lparen_token</span><span class="special">,</span> <span class="identifier">plus_exp3</span><span class="special">,</span> <span class="identifier">rparen_token</span><span class="special">&gt;;</span>
8456
8457<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">fail</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8458
8459<span class="keyword">using</span> <span class="identifier">primary_exp3</span> <span class="special">=</span> <span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">paren_exp4</span><span class="special">,</span> <span class="identifier">fail</span><span class="special">&lt;</span><span class="identifier">missing_primary_expression</span><span class="special">&gt;&gt;;</span>
8460
8461<span class="keyword">using</span> <span class="identifier">unary_exp3</span> <span class="special">=</span>
8462 <span class="identifier">foldr_start_with_parser</span><span class="special">&lt;</span>
8463   <span class="identifier">minus_token</span><span class="special">,</span>
8464   <span class="identifier">primary_exp3</span><span class="special">,</span>
8465   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">negate</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">&gt;&gt;::</span><span class="identifier">type</span>
8466 <span class="special">&gt;;</span>
8467
8468<span class="keyword">using</span> <span class="identifier">mult_exp6</span> <span class="special">=</span>
8469 <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
8470   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">&gt;,</span> <span class="identifier">unary_exp3</span><span class="special">&gt;,</span>
8471   <span class="identifier">unary_exp3</span><span class="special">,</span>
8472   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
8473 <span class="special">&gt;;</span>
8474
8475<span class="keyword">struct</span> <span class="identifier">plus_exp3</span> <span class="special">:</span>
8476 <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
8477   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp6</span><span class="special">&gt;,</span>
8478   <span class="identifier">mult_exp6</span><span class="special">,</span>
8479   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
8480 <span class="special">&gt;</span> <span class="special">{};</span>
8481
8482<span class="keyword">using</span> <span class="identifier">exp_parser20</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">plus_exp3</span><span class="special">&gt;;</span>
8483<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">fail_at_first_char_expected</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8484
8485<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">first_of</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8486
8487<span class="keyword">struct</span> <span class="identifier">plus_exp4</span> <span class="special">:</span>
8488 <span class="identifier">first_of</span><span class="special">&lt;</span>
8489   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
8490     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp6</span><span class="special">&gt;,</span>
8491     <span class="identifier">mult_exp6</span><span class="special">,</span>
8492     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
8493   <span class="special">&gt;,</span>
8494   <span class="identifier">fail_at_first_char_expected</span><span class="special">&lt;</span>
8495     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp6</span><span class="special">&gt;</span>
8496   <span class="special">&gt;</span>
8497 <span class="special">&gt;</span> <span class="special">{};</span>
8498
8499<span class="keyword">using</span> <span class="identifier">exp_parser21</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">plus_exp4</span><span class="special">&gt;;</span>
8500<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">foldl_reject_incomplete_start_with_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8501
8502<span class="keyword">struct</span> <span class="identifier">plus_exp5</span> <span class="special">:</span>
8503 <span class="identifier">foldl_reject_incomplete_start_with_parser</span><span class="special">&lt;</span>
8504   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp6</span><span class="special">&gt;,</span>
8505   <span class="identifier">mult_exp6</span><span class="special">,</span>
8506   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
8507 <span class="special">&gt;</span> <span class="special">{};</span>
8508
8509<span class="keyword">using</span> <span class="identifier">exp_parser22</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">plus_exp5</span><span class="special">&gt;;</span>
8510</pre>
8511<p>
8512        <a name="before_12"></a><span class="emphasis"><em>Definitions before section 12.</em></span>
8513      </p>
8514<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">string</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8515<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">int_</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8516
8517<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">build_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8518
8519<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">metaparse</span><span class="special">;</span>
8520
8521<span class="keyword">using</span> <span class="identifier">exp_parser1</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
8522<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">entire_input</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8523
8524<span class="keyword">using</span> <span class="identifier">exp_parser2</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;;</span>
8525<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">token</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8526
8527<span class="keyword">using</span> <span class="identifier">exp_parser3</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">entire_input</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;&gt;;</span>
8528<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">lit_c</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8529
8530<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">sequence</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8531
8532<span class="keyword">using</span> <span class="identifier">exp_parser4</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;,</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;&gt;&gt;;</span>
8533
8534<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">metashell</span><span class="special">/</span><span class="identifier">formatter</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8535
8536<span class="keyword">using</span> <span class="identifier">int_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">int_</span><span class="special">&gt;;</span>
8537
8538<span class="keyword">using</span> <span class="identifier">plus_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'+'</span><span class="special">&gt;&gt;;</span>
8539
8540<span class="keyword">using</span> <span class="identifier">exp_parser5</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;;</span>
8541<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">transform</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8542
8543<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">plus</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8544
8545<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">at</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8546
8547<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">&gt;</span>
8548 <span class="keyword">struct</span> <span class="identifier">eval_plus</span> <span class="special">:</span>
8549   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span>
8550     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">,</span>
8551     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">2</span><span class="special">&gt;::</span><span class="identifier">type</span>
8552   <span class="special">&gt;</span> <span class="special">{};</span>
8553
8554<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">quote</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8555
8556<span class="keyword">using</span> <span class="identifier">exp_parser6</span> <span class="special">=</span>
8557 <span class="identifier">build_parser</span><span class="special">&lt;</span>
8558   <span class="identifier">transform</span><span class="special">&lt;</span>
8559     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
8560     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">eval_plus</span><span class="special">&gt;</span>
8561   <span class="special">&gt;</span>
8562 <span class="special">&gt;;</span>
8563<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">any</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8564
8565<span class="keyword">using</span> <span class="identifier">exp_parser7</span> <span class="special">=</span>
8566 <span class="identifier">build_parser</span><span class="special">&lt;</span>
8567   <span class="identifier">sequence</span><span class="special">&lt;</span>
8568     <span class="identifier">int_token</span><span class="special">,</span>                                <span class="comment">/* The first &lt;number&gt; */</span>
8569     <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;</span> <span class="comment">/* The "+ &lt;number&gt;" elements */</span>
8570   <span class="special">&gt;</span>
8571 <span class="special">&gt;;</span>
8572<span class="keyword">using</span> <span class="identifier">temp_result</span> <span class="special">=</span> <span class="identifier">exp_parser7</span><span class="special">::</span><span class="identifier">apply</span><span class="special">&lt;</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 + 3 + 4"</span><span class="special">)&gt;::</span><span class="identifier">type</span><span class="special">;</span>
8573<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">fold</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8574
8575<span class="keyword">using</span> <span class="identifier">vector_of_numbers</span> <span class="special">=</span>
8576 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span>
8577   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">2</span><span class="special">&gt;,</span>
8578   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">5</span><span class="special">&gt;,</span>
8579   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">6</span><span class="special">&gt;</span>
8580 <span class="special">&gt;;</span>
8581
8582<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">&gt;</span>
8583 <span class="keyword">struct</span> <span class="identifier">sum_vector</span> <span class="special">:</span>
8584    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
8585      <span class="identifier">Vector</span><span class="special">,</span>
8586      <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
8587      <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
8588        <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_2</span><span class="special">&gt;</span>
8589      <span class="special">&gt;::</span><span class="identifier">type</span>
8590    <span class="special">&gt;</span>
8591  <span class="special">{};</span>
8592
8593<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Sum</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Item</span><span class="special">&gt;</span>
8594   <span class="keyword">struct</span> <span class="identifier">sum_items</span> <span class="special">:</span>
8595     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span>
8596       <span class="identifier">Sum</span><span class="special">,</span>
8597       <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;::</span><span class="identifier">type</span>
8598     <span class="special">&gt;</span>
8599 <span class="special">{};</span>
8600<span class="keyword">using</span> <span class="identifier">exp_parser8</span> <span class="special">=</span>
8601 <span class="identifier">build_parser</span><span class="special">&lt;</span>
8602   <span class="identifier">sequence</span><span class="special">&lt;</span>
8603     <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* parse the first &lt;number&gt; */</span>
8604     <span class="identifier">transform</span><span class="special">&lt;</span>
8605       <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;,</span> <span class="comment">/* parse the "+ &lt;number&gt;" elements */</span>
8606       <span class="comment">/* lambda expression summarising the "+ &lt;number&gt;" elements using fold */</span>
8607       <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
8608         <span class="comment">/* The folding expression we have just created */</span>
8609         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
8610           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span> <span class="comment">/* the argument of the lambda expression, the result */</span>
8611                           <span class="comment">/* of the repeated&lt;...&gt; parser */</span>
8612           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
8613           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
8614         <span class="special">&gt;</span>
8615       <span class="special">&gt;::</span><span class="identifier">type</span>
8616     <span class="special">&gt;</span>
8617   <span class="special">&gt;</span>
8618 <span class="special">&gt;;</span>
8619
8620<span class="keyword">using</span> <span class="identifier">exp_parser9</span> <span class="special">=</span>
8621 <span class="identifier">build_parser</span><span class="special">&lt;</span>
8622   <span class="identifier">transform</span><span class="special">&lt;</span>
8623     <span class="comment">/* What we had so far */</span>
8624     <span class="identifier">sequence</span><span class="special">&lt;</span>
8625       <span class="identifier">int_token</span><span class="special">,</span>
8626       <span class="identifier">transform</span><span class="special">&lt;</span>
8627         <span class="identifier">repeated</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;&gt;,</span>
8628         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span>
8629           <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">fold</span><span class="special">&lt;</span>
8630             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">,</span>
8631             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
8632             <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
8633           <span class="special">&gt;</span>
8634         <span class="special">&gt;::</span><span class="identifier">type</span>
8635       <span class="special">&gt;</span>
8636     <span class="special">&gt;,</span>
8637     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">sum_vector</span><span class="special">&gt;</span> <span class="comment">/* summarise the vector of numbers */</span>
8638   <span class="special">&gt;</span>
8639 <span class="special">&gt;;</span>
8640<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">foldl</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8641
8642<span class="keyword">using</span> <span class="identifier">exp_parser10</span> <span class="special">=</span>
8643 <span class="identifier">build_parser</span><span class="special">&lt;</span>
8644   <span class="identifier">transform</span><span class="special">&lt;</span>
8645     <span class="identifier">sequence</span><span class="special">&lt;</span>
8646       <span class="identifier">int_token</span><span class="special">,</span>
8647       <span class="identifier">foldl</span><span class="special">&lt;</span>
8648         <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
8649         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;,</span>
8650         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
8651       <span class="special">&gt;</span>
8652     <span class="special">&gt;,</span>
8653     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote1</span><span class="special">&lt;</span><span class="identifier">sum_vector</span><span class="special">&gt;&gt;</span>
8654 <span class="special">&gt;;</span>
8655<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">foldl_start_with_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8656
8657<span class="keyword">using</span> <span class="identifier">exp_parser11</span> <span class="special">=</span>
8658 <span class="identifier">build_parser</span><span class="special">&lt;</span>
8659   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
8660     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span> <span class="comment">/* apply this parser repeatedly */</span>
8661     <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* use this parser to get the initial value */</span>
8662     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span> <span class="comment">/* use this function to add a new value to the summary */</span>
8663   <span class="special">&gt;</span>
8664 <span class="special">&gt;;</span>
8665<span class="keyword">using</span> <span class="identifier">minus_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'-'</span><span class="special">&gt;&gt;;</span>
8666
8667<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">one_of</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8668
8669<span class="keyword">using</span> <span class="identifier">exp_parser12</span> <span class="special">=</span>
8670 <span class="identifier">build_parser</span><span class="special">&lt;</span>
8671   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
8672     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
8673     <span class="identifier">int_token</span><span class="special">,</span>
8674     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">sum_items</span><span class="special">&gt;</span>
8675   <span class="special">&gt;</span>
8676 <span class="special">&gt;;</span>
8677<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">minus</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8678
8679<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">char</span> <span class="identifier">Op</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">;</span>
8680
8681<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'+'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
8682
8683<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'-'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">minus</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
8684
8685<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">S</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Item</span><span class="special">&gt;</span>
8686 <span class="keyword">struct</span> <span class="identifier">binary_op</span> <span class="special">:</span>
8687   <span class="identifier">eval_binary_op</span><span class="special">&lt;</span>
8688     <span class="identifier">S</span><span class="special">,</span>
8689     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">::</span><span class="identifier">value</span><span class="special">,</span>
8690     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;::</span><span class="identifier">type</span>
8691   <span class="special">&gt;</span>
8692   <span class="special">{};</span>
8693
8694<span class="keyword">using</span> <span class="identifier">exp_parser13</span> <span class="special">=</span>
8695 <span class="identifier">build_parser</span><span class="special">&lt;</span>
8696   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
8697     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
8698     <span class="identifier">int_token</span><span class="special">,</span>
8699     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
8700   <span class="special">&gt;</span>
8701 <span class="special">&gt;;</span>
8702<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">times</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8703
8704<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'*'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">times</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
8705
8706<span class="keyword">using</span> <span class="identifier">times_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'*'</span><span class="special">&gt;&gt;;</span>
8707
8708<span class="keyword">using</span> <span class="identifier">exp_parser14</span> <span class="special">=</span>
8709 <span class="identifier">build_parser</span><span class="special">&lt;</span>
8710   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
8711     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">,</span> <span class="identifier">times_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
8712     <span class="identifier">int_token</span><span class="special">,</span>
8713     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
8714   <span class="special">&gt;</span>
8715 <span class="special">&gt;;</span>
8716<span class="keyword">using</span> <span class="identifier">mult_exp1</span> <span class="special">=</span> <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span><span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;&gt;;</span>
8717
8718<span class="keyword">using</span> <span class="identifier">exp_parser15</span> <span class="special">=</span>
8719 <span class="identifier">build_parser</span><span class="special">&lt;</span>
8720   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
8721     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp1</span><span class="special">&gt;,</span>
8722     <span class="identifier">mult_exp1</span><span class="special">,</span>
8723     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
8724   <span class="special">&gt;</span>
8725 <span class="special">&gt;;</span>
8726<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">divides</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8727
8728<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">L</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="char">'/'</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">divides</span><span class="special">&lt;</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="special">{};</span>
8729
8730<span class="keyword">using</span> <span class="identifier">divides_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'/'</span><span class="special">&gt;&gt;;</span>
8731
8732<span class="keyword">using</span> <span class="identifier">mult_exp2</span> <span class="special">=</span>
8733 <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
8734   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">&gt;,</span> <span class="identifier">int_token</span><span class="special">&gt;,</span>
8735   <span class="identifier">int_token</span><span class="special">,</span>
8736   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
8737 <span class="special">&gt;;</span>
8738
8739<span class="keyword">using</span> <span class="identifier">exp_parser16</span> <span class="special">=</span>
8740 <span class="identifier">build_parser</span><span class="special">&lt;</span>
8741   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
8742     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp2</span><span class="special">&gt;,</span>
8743     <span class="identifier">mult_exp2</span><span class="special">,</span>
8744     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
8745   <span class="special">&gt;</span>
8746 <span class="special">&gt;;</span>
8747<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">S</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Item</span><span class="special">&gt;</span>
8748 <span class="keyword">struct</span> <span class="identifier">reverse_binary_op</span> <span class="special">:</span>
8749   <span class="identifier">eval_binary_op</span><span class="special">&lt;</span>
8750     <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">,</span>
8751     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">at_c</span><span class="special">&lt;</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">::</span><span class="identifier">value</span><span class="special">,</span>
8752     <span class="identifier">S</span>
8753   <span class="special">&gt;</span>
8754   <span class="special">{};</span>
8755
8756<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">foldr_start_with_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8757
8758<span class="keyword">using</span> <span class="identifier">mult_exp3</span> <span class="special">=</span>
8759 <span class="identifier">foldr_start_with_parser</span><span class="special">&lt;</span>
8760   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">&gt;&gt;,</span> <span class="comment">/* The parser applied repeatedly */</span>
8761   <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* The parser parsing the last number */</span>
8762   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">reverse_binary_op</span><span class="special">&gt;</span> <span class="comment">/* The function called for every result */</span>
8763                                         <span class="comment">/* of applying the above parser */</span>
8764 <span class="special">&gt;;</span>
8765
8766<span class="keyword">using</span> <span class="identifier">exp_parser17</span> <span class="special">=</span>
8767 <span class="identifier">build_parser</span><span class="special">&lt;</span>
8768   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
8769     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp3</span><span class="special">&gt;,</span>
8770     <span class="identifier">mult_exp3</span><span class="special">,</span>
8771     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
8772   <span class="special">&gt;</span>
8773 <span class="special">&gt;;</span>
8774<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="identifier">negate</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8775
8776<span class="keyword">using</span> <span class="identifier">unary_exp1</span> <span class="special">=</span>
8777 <span class="identifier">foldr_start_with_parser</span><span class="special">&lt;</span>
8778   <span class="identifier">minus_token</span><span class="special">,</span>
8779   <span class="identifier">int_token</span><span class="special">,</span>
8780   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">negate</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">&gt;&gt;::</span><span class="identifier">type</span>
8781 <span class="special">&gt;;</span>
8782
8783<span class="keyword">using</span> <span class="identifier">mult_exp4</span> <span class="special">=</span>
8784 <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
8785   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">&gt;,</span> <span class="identifier">unary_exp1</span><span class="special">&gt;,</span>
8786   <span class="identifier">unary_exp1</span><span class="special">,</span>
8787   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
8788 <span class="special">&gt;;</span>
8789
8790<span class="keyword">using</span> <span class="identifier">exp_parser18</span> <span class="special">=</span>
8791 <span class="identifier">build_parser</span><span class="special">&lt;</span>
8792   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
8793     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp4</span><span class="special">&gt;,</span>
8794     <span class="identifier">mult_exp4</span><span class="special">,</span>
8795     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
8796   <span class="special">&gt;</span>
8797 <span class="special">&gt;;</span>
8798<span class="keyword">using</span> <span class="identifier">lparen_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">'('</span><span class="special">&gt;&gt;;</span>
8799
8800<span class="keyword">using</span> <span class="identifier">rparen_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special">&lt;</span><span class="identifier">lit_c</span><span class="special">&lt;</span><span class="char">')'</span><span class="special">&gt;&gt;;</span>
8801
8802<span class="keyword">using</span> <span class="identifier">plus_exp1</span> <span class="special">=</span>
8803 <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
8804   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp4</span><span class="special">&gt;,</span>
8805   <span class="identifier">mult_exp4</span><span class="special">,</span>
8806   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
8807 <span class="special">&gt;;</span>
8808
8809<span class="keyword">using</span> <span class="identifier">paren_exp1</span> <span class="special">=</span> <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">lparen_token</span><span class="special">,</span> <span class="identifier">plus_exp1</span><span class="special">,</span> <span class="identifier">rparen_token</span><span class="special">&gt;;</span>
8810
8811<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">middle_of</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8812
8813<span class="keyword">using</span> <span class="identifier">paren_exp2</span> <span class="special">=</span> <span class="identifier">middle_of</span><span class="special">&lt;</span><span class="identifier">lparen_token</span><span class="special">,</span> <span class="identifier">plus_exp1</span><span class="special">,</span> <span class="identifier">rparen_token</span><span class="special">&gt;;</span>
8814
8815<span class="keyword">using</span> <span class="identifier">primary_exp1</span> <span class="special">=</span> <span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">paren_exp2</span><span class="special">&gt;;</span>
8816
8817<span class="keyword">struct</span> <span class="identifier">plus_exp2</span><span class="special">;</span>
8818
8819<span class="keyword">using</span> <span class="identifier">paren_exp3</span> <span class="special">=</span> <span class="identifier">middle_of</span><span class="special">&lt;</span><span class="identifier">lparen_token</span><span class="special">,</span> <span class="identifier">plus_exp2</span><span class="special">,</span> <span class="identifier">rparen_token</span><span class="special">&gt;;</span>
8820
8821<span class="keyword">using</span> <span class="identifier">primary_exp2</span> <span class="special">=</span> <span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">paren_exp2</span><span class="special">&gt;;</span>
8822
8823<span class="keyword">using</span> <span class="identifier">unary_exp2</span> <span class="special">=</span>
8824 <span class="identifier">foldr_start_with_parser</span><span class="special">&lt;</span>
8825   <span class="identifier">minus_token</span><span class="special">,</span>
8826   <span class="identifier">primary_exp2</span><span class="special">,</span>
8827   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">negate</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">&gt;&gt;::</span><span class="identifier">type</span>
8828 <span class="special">&gt;;</span>
8829
8830<span class="keyword">using</span> <span class="identifier">mult_exp5</span> <span class="special">=</span>
8831 <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
8832   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">&gt;,</span> <span class="identifier">unary_exp2</span><span class="special">&gt;,</span>
8833   <span class="identifier">unary_exp2</span><span class="special">,</span>
8834   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
8835 <span class="special">&gt;;</span>
8836
8837<span class="keyword">struct</span> <span class="identifier">plus_exp2</span> <span class="special">:</span>
8838 <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
8839   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp5</span><span class="special">&gt;,</span>
8840   <span class="identifier">mult_exp5</span><span class="special">,</span>
8841   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
8842 <span class="special">&gt;</span> <span class="special">{};</span>
8843
8844<span class="keyword">using</span> <span class="identifier">exp_parser19</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">plus_exp2</span><span class="special">&gt;;</span>
8845<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">define_error</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8846
8847<span class="identifier">BOOST_METAPARSE_DEFINE_ERROR</span><span class="special">(</span><span class="identifier">missing_primary_expression</span><span class="special">,</span> <span class="string">"Missing primary expression"</span><span class="special">);</span>
8848
8849<span class="keyword">struct</span> <span class="identifier">plus_exp3</span><span class="special">;</span>
8850
8851<span class="keyword">using</span> <span class="identifier">paren_exp4</span> <span class="special">=</span> <span class="identifier">middle_of</span><span class="special">&lt;</span><span class="identifier">lparen_token</span><span class="special">,</span> <span class="identifier">plus_exp3</span><span class="special">,</span> <span class="identifier">rparen_token</span><span class="special">&gt;;</span>
8852
8853<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">fail</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8854
8855<span class="keyword">using</span> <span class="identifier">primary_exp3</span> <span class="special">=</span> <span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">paren_exp4</span><span class="special">,</span> <span class="identifier">fail</span><span class="special">&lt;</span><span class="identifier">missing_primary_expression</span><span class="special">&gt;&gt;;</span>
8856
8857<span class="keyword">using</span> <span class="identifier">unary_exp3</span> <span class="special">=</span>
8858 <span class="identifier">foldr_start_with_parser</span><span class="special">&lt;</span>
8859   <span class="identifier">minus_token</span><span class="special">,</span>
8860   <span class="identifier">primary_exp3</span><span class="special">,</span>
8861   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">negate</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">&gt;&gt;::</span><span class="identifier">type</span>
8862 <span class="special">&gt;;</span>
8863
8864<span class="keyword">using</span> <span class="identifier">mult_exp6</span> <span class="special">=</span>
8865 <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
8866   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">&gt;,</span> <span class="identifier">unary_exp3</span><span class="special">&gt;,</span>
8867   <span class="identifier">unary_exp3</span><span class="special">,</span>
8868   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
8869 <span class="special">&gt;;</span>
8870
8871<span class="keyword">struct</span> <span class="identifier">plus_exp3</span> <span class="special">:</span>
8872 <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
8873   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp6</span><span class="special">&gt;,</span>
8874   <span class="identifier">mult_exp6</span><span class="special">,</span>
8875   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
8876 <span class="special">&gt;</span> <span class="special">{};</span>
8877
8878<span class="keyword">using</span> <span class="identifier">exp_parser20</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">plus_exp3</span><span class="special">&gt;;</span>
8879<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">fail_at_first_char_expected</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8880
8881<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">first_of</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8882
8883<span class="keyword">struct</span> <span class="identifier">plus_exp4</span> <span class="special">:</span>
8884 <span class="identifier">first_of</span><span class="special">&lt;</span>
8885   <span class="identifier">foldl_start_with_parser</span><span class="special">&lt;</span>
8886     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp6</span><span class="special">&gt;,</span>
8887     <span class="identifier">mult_exp6</span><span class="special">,</span>
8888     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
8889   <span class="special">&gt;,</span>
8890   <span class="identifier">fail_at_first_char_expected</span><span class="special">&lt;</span>
8891     <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp6</span><span class="special">&gt;</span>
8892   <span class="special">&gt;</span>
8893 <span class="special">&gt;</span> <span class="special">{};</span>
8894
8895<span class="keyword">using</span> <span class="identifier">exp_parser21</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">plus_exp4</span><span class="special">&gt;;</span>
8896<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">metaparse</span><span class="special">/</span><span class="identifier">foldl_reject_incomplete_start_with_parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
8897
8898<span class="keyword">struct</span> <span class="identifier">plus_exp5</span> <span class="special">:</span>
8899 <span class="identifier">foldl_reject_incomplete_start_with_parser</span><span class="special">&lt;</span>
8900   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp6</span><span class="special">&gt;,</span>
8901   <span class="identifier">mult_exp6</span><span class="special">,</span>
8902   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
8903 <span class="special">&gt;</span> <span class="special">{};</span>
8904
8905<span class="keyword">using</span> <span class="identifier">exp_parser22</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">plus_exp5</span><span class="special">&gt;;</span>
8906<span class="keyword">struct</span> <span class="identifier">plus_exp6</span><span class="special">;</span>
8907
8908<span class="keyword">using</span> <span class="identifier">paren_exp5</span> <span class="special">=</span> <span class="identifier">middle_of</span><span class="special">&lt;</span><span class="identifier">lparen_token</span><span class="special">,</span> <span class="identifier">plus_exp6</span><span class="special">,</span> <span class="identifier">rparen_token</span><span class="special">&gt;;</span>
8909
8910<span class="keyword">using</span> <span class="identifier">primary_exp4</span> <span class="special">=</span> <span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">paren_exp5</span><span class="special">,</span> <span class="identifier">fail</span><span class="special">&lt;</span><span class="identifier">missing_primary_expression</span><span class="special">&gt;&gt;;</span>
8911
8912<span class="keyword">using</span> <span class="identifier">unary_exp4</span> <span class="special">=</span>
8913 <span class="identifier">foldr_start_with_parser</span><span class="special">&lt;</span>
8914   <span class="identifier">minus_token</span><span class="special">,</span>
8915   <span class="identifier">primary_exp4</span><span class="special">,</span>
8916   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">lambda</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">negate</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_1</span><span class="special">&gt;&gt;::</span><span class="identifier">type</span>
8917 <span class="special">&gt;;</span>
8918
8919<span class="keyword">using</span> <span class="identifier">mult_exp7</span> <span class="special">=</span>
8920 <span class="identifier">foldl_reject_incomplete_start_with_parser</span><span class="special">&lt;</span>
8921   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">&gt;,</span> <span class="identifier">unary_exp4</span><span class="special">&gt;,</span>
8922   <span class="identifier">unary_exp4</span><span class="special">,</span>
8923   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
8924 <span class="special">&gt;;</span>
8925
8926<span class="keyword">struct</span> <span class="identifier">plus_exp6</span> <span class="special">:</span>
8927 <span class="identifier">foldl_reject_incomplete_start_with_parser</span><span class="special">&lt;</span>
8928   <span class="identifier">sequence</span><span class="special">&lt;</span><span class="identifier">one_of</span><span class="special">&lt;</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">&gt;,</span> <span class="identifier">mult_exp7</span><span class="special">&gt;,</span>
8929   <span class="identifier">mult_exp7</span><span class="special">,</span>
8930   <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">quote2</span><span class="special">&lt;</span><span class="identifier">binary_op</span><span class="special">&gt;</span>
8931 <span class="special">&gt;</span> <span class="special">{};</span>
8932
8933<span class="keyword">using</span> <span class="identifier">exp_parser23</span> <span class="special">=</span> <span class="identifier">build_parser</span><span class="special">&lt;</span><span class="identifier">plus_exp6</span><span class="special">&gt;;</span>
8934</pre>
8935</div>
8936</div>
8937<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
8938<td align="left"></td>
8939<td align="right"><div class="copyright-footer">Copyright © 2015 Abel Sinkovics<p>
8940        Distributed under the Boost Software License, Version 1.0. (See accompanying
8941        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>)
8942      </p>
8943</div></td>
8944</tr></table>
8945<hr>
8946<div class="spirit-nav">
8947<a accesskey="p" href="preface.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../metaparse.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="user_manual.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
8948</div>
8949</body>
8950</html>
8951