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"><</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">></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"><</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">></span> 166<span class="preprocessor">#include</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">print</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></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"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"11 + 2"</span><span class="special">)></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"><</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">></span> 192<span class="preprocessor">#include</span> <span class="special"><</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">></span> 193<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></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"><<</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"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"11 + 2"</span><span class="special">)>()</span> 199 <span class="special"><<</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"><</span><span class="keyword">char</span><span class="special">...</span> <span class="identifier">Cs</span><span class="special">></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"><</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">></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">></span> <span class="special">#</span><span class="identifier">include</span> <span class="special"><</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">></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">></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">></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="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">></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"><</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">></span></code>. 283 Let's try it by running the following command in Metashell: 284 </p> 285<pre class="programlisting"><span class="special">></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"><</span><span class="char">'1'</span><span class="special">,</span> 333 <span class="char">'3'</span><span class="special">></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"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">13</span><span class="special">></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">></span> <span class="special">#</span><span class="identifier">include</span> <span class="special"><</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">></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">></span> <span class="special">#</span><span class="identifier">include</span> <span class="special"><</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">></span> 373<span class="special">></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">></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"><</span><span class="identifier">int_</span><span class="special">>;</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">></span> <span class="identifier">exp_parser1</span><span class="special">::</span><span class="identifier">apply</span><span class="special"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"13"</span><span class="special">)>::</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"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">13</span><span class="special">></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">></span> <span class="identifier">exp_parser1</span><span class="special">::</span><span class="identifier">apply</span><span class="special"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"thirteen"</span><span class="special">)>::</span><span class="identifier">type</span> 421<span class="special"><<</span> <span class="identifier">compilation</span> <span class="identifier">error</span> <span class="special">>></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">></span> <span class="identifier">exp_parser1</span><span class="special">::</span><span class="identifier">apply</span><span class="special"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"11 13"</span><span class="special">)>::</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"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">11</span><span class="special">></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">></span> <span class="special">#</span><span class="identifier">include</span> <span class="special"><</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">></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"><</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">></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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>;</span> 478</pre> 479<p> 480 Let's try this new parser out: 481 </p> 482<pre class="programlisting"><span class="special">></span> <span class="identifier">exp_parser2</span><span class="special">::</span><span class="identifier">apply</span><span class="special"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"13"</span><span class="special">)>::</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"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">13</span><span class="special">></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">></span> <span class="identifier">exp_parser2</span><span class="special">::</span><span class="identifier">apply</span><span class="special"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"11 13"</span><span class="special">)>::</span><span class="identifier">type</span> 489<span class="special"><<</span> <span class="identifier">compilation</span> <span class="identifier">error</span> <span class="special">>></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">></span> <span class="identifier">exp_parser2</span><span class="special">::</span><span class="identifier">apply</span><span class="special"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"11 "</span><span class="special">)>::</span><span class="identifier">type</span> 515<span class="special"><<</span> <span class="identifier">compilation</span> <span class="identifier">error</span> <span class="special">>></span> 516</pre> 517<p> 518 Let's allow whitespaces after the number: 519 </p> 520<pre class="programlisting"><span class="special">></span> <span class="special">#</span><span class="identifier">include</span> <span class="special"><</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">></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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>>;</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"><</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">></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">></span> <span class="identifier">exp_parser3</span><span class="special">::</span><span class="identifier">apply</span><span class="special"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"11 "</span><span class="special">)>::</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"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">11</span><span class="special">></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"><</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">></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">></span> <span class="special">#</span><span class="identifier">include</span> <span class="special"><</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">></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"><</span><span class="char">'+'</span><span class="special">></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"><</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"><</span><span class="char">'+'</span><span class="special">>></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"><</span><span class="identifier">int_</span><span class="special">></span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>></span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">></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">></span> <span class="special">#</span><span class="identifier">include</span> <span class="special"><</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">></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"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>></span> 596</pre> 597<p> 598 Let's create a parser using it: 599 </p> 600<pre class="programlisting"><span class="special">></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"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>>;</span> 601</pre> 602<p> 603 Try parsing a simple expression using it: 604 </p> 605<pre class="programlisting"><span class="special">></span> <span class="identifier">exp_parser4</span><span class="special">::</span><span class="identifier">apply</span><span class="special"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"11 + 2"</span><span class="special">)>::</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"><</span><span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">2</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">v_item</span><span class="special"><</span><span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">char_</span><span class="special"><</span><span class="char">'+'</span><span class="special">></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"><</span><span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">11</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">vector0</span><span class="special"><</span><span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">na</span><span class="special">>,</span> <span class="number">0</span> 608<span class="special">>,</span> <span class="number">0</span><span class="special">>,</span> <span class="number">0</span><span class="special">></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">></span> <span class="special">#</span><span class="identifier">include</span> <span class="special"><</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">></span> 617</pre> 618<p> 619 After including this header, try parsing again: 620 </p> 621<pre class="programlisting"><span class="special">></span> <span class="identifier">exp_parser4</span><span class="special">::</span><span class="identifier">apply</span><span class="special"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"11 + 2"</span><span class="special">)>::</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"><</span><span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">11</span><span class="special">>,</span> <span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">char_</span><span class="special"><</span><span class="char">'+'</span><span class="special">>,</span> <span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">2</span><span class="special">></span> <span class="special">></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"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">11</span><span class="special">></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"><</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">></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"><</span><span class="char">'+'</span><span class="special">></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"><</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"><</span><span class="char">'+'</span><span class="special">>></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"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">2</span><span class="special">></span> <span class="special">></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"><</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">></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"><</span></code><a href="../int_html" target="_top"><code class="computeroutput"><span class="identifier">int_</span></code></a><code class="computeroutput"><span class="special">></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"><</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"><</span><span class="char">'+'</span><span class="special">>></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"><...></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"><...></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">></span> <span class="keyword">using</span> <span class="identifier">int_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>;</span> 687<span class="special">></span> <span class="keyword">using</span> <span class="identifier">plus_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>>;</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"><</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"><</span><span class="char">'+'</span><span class="special">>></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">></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"><</span><span class="identifier">sequence</span><span class="special"><</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">>>;</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">></span> <span class="identifier">exp_parser5</span><span class="special">::</span><span class="identifier">apply</span><span class="special"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"11 + 2"</span><span class="special">)>::</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"><</span><span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">11</span><span class="special">>,</span> <span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">char_</span><span class="special"><</span><span class="char">'+'</span><span class="special">>,</span> <span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">2</span><span class="special">></span> <span class="special">></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"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">13</span><span class="special">></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">></span> <span class="special">#</span><span class="identifier">include</span> <span class="special"><</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">></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"><</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">></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"><...></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">></span> <span class="special">#</span><span class="identifier">include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 747<span class="special">></span> <span class="special">#</span><span class="identifier">include</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</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 748<span class="special">></span> <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">></span> <span class="special">\</span> 749<span class="special">...></span> <span class="keyword">struct</span> <span class="identifier">eval_plus</span> <span class="special">:</span> <span class="special">\</span> 750<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"><</span> <span class="special">\</span> 751<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"><</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">0</span><span class="special">>::</span><span class="identifier">type</span><span class="special">,</span> <span class="special">\</span> 752<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"><</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">2</span><span class="special">>::</span><span class="identifier">type</span> <span class="special">\</span> 753<span class="special">...></span> <span class="special">></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">...></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"><...></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">></span> <span class="identifier">eval_plus</span><span class="special"><</span> <span class="special">\</span> 778<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"><</span> <span class="special">\</span> 779<span class="special">...></span> <span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">11</span><span class="special">>,</span> <span class="special">\</span> 780<span class="special">...></span> <span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">char_</span><span class="special"><</span><span class="char">'+'</span><span class="special">>,</span> <span class="special">\</span> 781<span class="special">...></span> <span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">2</span><span class="special">></span> <span class="special">\</span> 782<span class="special">...></span> <span class="special">>>::</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"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">13</span><span class="special">></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">></span> <span class="special">#</span><span class="identifier">include</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">quote</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 793<span class="special">></span> <span class="keyword">using</span> <span class="identifier">exp_parser6</span> <span class="special">=</span> <span class="special">\</span> 794<span class="special">...></span> <span class="identifier">build_parser</span><span class="special"><</span> <span class="special">\</span> 795<span class="special">...></span> <span class="identifier">transform</span><span class="special"><</span> <span class="special">\</span> 796<span class="special">...></span> <span class="identifier">sequence</span><span class="special"><</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">>,</span> <span class="special">\</span> 797<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">quote1</span><span class="special"><</span><span class="identifier">eval_plus</span><span class="special">></span> <span class="special">\</span> 798<span class="special">...></span> <span class="special">></span> <span class="special">\</span> 799<span class="special">...></span> <span class="special">>;</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"><</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">></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">></span> <span class="identifier">exp_parser6</span><span class="special">::</span><span class="identifier">apply</span><span class="special"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"11 + 2"</span><span class="special">)>::</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"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">13</span><span class="special">></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"><</span><span class="identifier">number</span><span class="special">></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"><</span><span class="identifier">number</span><span class="special">></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">></span> <span class="special">#</span><span class="identifier">include</span> <span class="special"><</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">></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"><</span><span class="identifier">number</span><span class="special">></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">></span> <span class="keyword">using</span> <span class="identifier">exp_parser7</span> <span class="special">=</span> <span class="special">\</span> 919<span class="special">...></span> <span class="identifier">build_parser</span><span class="special"><</span> <span class="special">\</span> 920<span class="special">...></span> <span class="identifier">sequence</span><span class="special"><</span> <span class="special">\</span> 921<span class="special">...></span> <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* The first <number> */</span> <span class="special">\</span> 922<span class="special">...></span> <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>></span> <span class="comment">/* The "+ <number>" elements */</span> <span class="special">\</span> 923<span class="special">...></span> <span class="special">></span> <span class="special">\</span> 924<span class="special">...></span> <span class="special">>;</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"><</span><span class="identifier">number</span><span class="special">></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"><</span><span class="identifier">number</span><span class="special">></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"><</span><span class="identifier">plus_token</span><span class="special">,</span> 946 <span class="identifier">int_token</span><span class="special">></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">></span> <span class="identifier">exp_parser7</span><span class="special">::</span><span class="identifier">apply</span><span class="special"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 + 3 + 4"</span><span class="special">)>::</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"><</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"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">1</span><span class="special">>,</span> 961 962 <span class="comment">// The result of repeated< sequence<plus_token, int_token> ></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"><</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"><</span><span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">char_</span><span class="special"><</span><span class="char">'+'</span><span class="special">>,</span> <span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">2</span><span class="special">></span> <span class="special">>,</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"><</span><span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">char_</span><span class="special"><</span><span class="char">'+'</span><span class="special">>,</span> <span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">3</span><span class="special">></span> <span class="special">>,</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"><</span><span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">char_</span><span class="special"><</span><span class="char">'+'</span><span class="special">>,</span> <span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">4</span><span class="special">></span> <span class="special">></span> 967 <span class="special">></span> 968<span class="special">></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"><</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"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>></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"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">></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"><</span><span class="identifier">number</span><span class="special">></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"><</span><span class="identifier">plus_token</span><span class="special">,</span> 989 <span class="identifier">int_token</span><span class="special">></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"><</span><span class="identifier">number</span><span class="special">></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">></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"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 + 3 + 4"</span><span class="special">)>::</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">></span> <span class="special">#</span><span class="identifier">include</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">.</span><span class="identifier">hpp</span><span class="special">></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">></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">...></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"><</span> <span class="special">\</span> 1087<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"><</span><span class="number">2</span><span class="special">>,</span> <span class="special">\</span> 1088<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"><</span><span class="number">5</span><span class="special">>,</span> <span class="special">\</span> 1089<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"><</span><span class="number">6</span><span class="special">></span> <span class="special">\</span> 1090<span class="special">...></span> <span class="special">>;</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">></span> <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">></span> <span class="special">\</span> 1102<span class="special">...></span> <span class="keyword">struct</span> <span class="identifier">sum_vector</span> <span class="special">:</span> <span class="special">\</span> 1103<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"><</span> <span class="special">\</span> 1104<span class="special">...></span> <span class="identifier">Vector</span><span class="special">,</span> <span class="special">\</span> 1105<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"><</span><span class="number">0</span><span class="special">>,</span> <span class="special">\</span> 1106<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"><</span> <span class="special">\</span> 1107<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"><</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">></span> <span class="special">\</span> 1108<span class="special">...></span> <span class="special">>::</span><span class="identifier">type</span> <span class="special">\</span> 1109<span class="special">...></span> <span class="special">></span> <span class="special">\</span> 1110<span class="special">...></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">></span> <span class="identifier">sum_vector</span><span class="special"><</span><span class="identifier">vector_of_numbers</span><span class="special">>::</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"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">13</span><span class="special">></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"><</span><span class="identifier">number</span><span class="special">></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"><</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"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">1</span><span class="special">>,</span> 1167 1168 <span class="comment">// The result of repeated< sequence<plus_token, int_token> ></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"><</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"><</span><span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">char_</span><span class="special"><</span><span class="char">'+'</span><span class="special">>,</span> <span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">2</span><span class="special">></span> <span class="special">>,</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"><</span><span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">char_</span><span class="special"><</span><span class="char">'+'</span><span class="special">>,</span> <span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">3</span><span class="special">></span> <span class="special">>,</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"><</span><span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">char_</span><span class="special"><</span><span class="char">'+'</span><span class="special">>,</span> <span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">4</span><span class="special">></span> <span class="special">></span> 1173 <span class="special">></span> 1174<span class="special">></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"><...></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"><...></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"><</span><span class="identifier">mpl_</span><span class="special">::</span><span class="keyword">char</span><span class="special"><</span><span class="char">'+'</span><span class="special">>,</span> 1190 <span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">2</span><span class="special">>></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">></span> <span class="keyword">template</span> <span class="special"><</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">></span> <span class="special">\</span> 1195<span class="special">...></span> <span class="keyword">struct</span> <span class="identifier">sum_items</span> <span class="special">:</span> <span class="special">\</span> 1196<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"><</span> <span class="special">\</span> 1197<span class="special">...></span> <span class="identifier">Sum</span><span class="special">,</span> <span class="special">\</span> 1198<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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">>::</span><span class="identifier">type</span> <span class="special">\</span> 1199<span class="special">...></span> <span class="special">></span> <span class="special">\</span> 1200<span class="special">...></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">></span> <span class="identifier">sum_items</span><span class="special"><</span> <span class="special">\</span> 1230<span class="special">...></span> <span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">1</span><span class="special">>,</span> <span class="special">\</span> 1231<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"><</span><span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">char_</span><span class="special"><</span><span class="char">'+'</span><span class="special">>,</span> <span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">2</span><span class="special">>></span> <span class="special">\</span> 1232<span class="special">...></span> <span class="special">>::</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"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">3</span><span class="special">></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"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">1</span><span class="special">></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"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">2</span><span class="special">></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"><</span><span class="identifier">number</span><span class="special">></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">></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"><</span><span class="identifier">temp_result</span><span class="special">,</span> <span class="number">1</span><span class="special">>::</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"><</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"><</span><span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">char_</span><span class="special"><</span><span class="char">'+'</span><span class="special">>,</span> <span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">2</span><span class="special">>>,</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"><</span><span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">char_</span><span class="special"><</span><span class="char">'+'</span><span class="special">>,</span> <span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">3</span><span class="special">>>,</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"><</span><span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">char_</span><span class="special"><</span><span class="char">'+'</span><span class="special">>,</span> <span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">4</span><span class="special">>></span> 1260<span class="special">></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"><</span><span class="identifier">number</span><span class="special">></span></code> 1265 element). Let's try fold out for this: 1266 </p> 1267<pre class="programlisting"><span class="special">></span> <span class="special">\</span> 1268<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"><</span> <span class="special">\</span> 1269<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"><</span><span class="identifier">temp_result</span><span class="special">,</span> <span class="number">1</span><span class="special">>::</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">...></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"><</span><span class="number">0</span><span class="special">>,</span> <span class="comment">/* The value to start the sum from */</span> <span class="special">\</span> 1271<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"><</span><span class="identifier">sum_items</span><span class="special">></span> <span class="comment">/* The function to call in each iteration */</span> <span class="special">\</span> 1272<span class="special">...></span> <span class="special">>::</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"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">9</span><span class="special">></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"><</span><span class="number">0</span><span class="special">></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"><</span><span class="identifier">number</span><span class="special">></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"><...></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"><...></span></code> with the folding expression 1331 we have just created: 1332 </p> 1333<pre class="programlisting"><span class="special">></span> <span class="keyword">using</span> <span class="identifier">exp_parser8</span> <span class="special">=</span> <span class="special">\</span> 1334<span class="special">...></span> <span class="identifier">build_parser</span><span class="special"><</span> <span class="special">\</span> 1335<span class="special">...></span> <span class="identifier">sequence</span><span class="special"><</span> <span class="special">\</span> 1336<span class="special">...></span> <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* parse the first <number> */</span> <span class="special">\</span> 1337<span class="special">...></span> <span class="identifier">transform</span><span class="special"><</span> <span class="special">\</span> 1338<span class="special">...></span> <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>>,</span> <span class="comment">/* parse the "+ <number>" elements */</span> <span class="special">\</span> 1339<span class="special">...></span> <span class="special">\</span> 1340<span class="special">...></span> <span class="comment">/* lambda expression summarising the "+ <number>" elements using fold */</span> <span class="special">\</span> 1341<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"><</span> <span class="special">\</span> 1342<span class="special">...></span> <span class="comment">/* The folding expression we have just created */</span> <span class="special">\</span> 1343<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"><</span> <span class="special">\</span> 1344<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">_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">...></span> <span class="comment">/* of the repeated<...> parser */</span> <span class="special">\</span> 1346<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"><</span><span class="number">0</span><span class="special">>,</span> <span class="special">\</span> 1347<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"><</span><span class="identifier">sum_items</span><span class="special">></span> <span class="special">\</span> 1348<span class="special">...></span> <span class="special">></span> <span class="special">\</span> 1349<span class="special">...></span> <span class="special">>::</span><span class="identifier">type</span> <span class="special">\</span> 1350<span class="special">...></span> <span class="special">></span> <span class="special">\</span> 1351<span class="special">...></span> <span class="special">></span> <span class="special">\</span> 1352<span class="special">...></span> <span class="special">>;</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"><</span><span class="identifier">number</span><span class="special">></span></code> 1361 elements. Let's try it out: 1362 </p> 1363<pre class="programlisting"><span class="special">></span> <span class="identifier">exp_parser8</span><span class="special">::</span><span class="identifier">apply</span><span class="special"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 + 3 + 4"</span><span class="special">)>::</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"><</span><span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">1</span><span class="special">>,</span> <span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">9</span><span class="special">></span> <span class="special">></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">></span> <span class="keyword">using</span> <span class="identifier">exp_parser9</span> <span class="special">=</span> <span class="special">\</span> 1373<span class="special">...></span> <span class="identifier">build_parser</span><span class="special"><</span> <span class="special">\</span> 1374<span class="special">...></span> <span class="identifier">transform</span><span class="special"><</span> <span class="special">\</span> 1375<span class="special">...></span> <span class="comment">/* What we had so far */</span> <span class="special">\</span> 1376<span class="special">...></span> <span class="identifier">sequence</span><span class="special"><</span> <span class="special">\</span> 1377<span class="special">...></span> <span class="identifier">int_token</span><span class="special">,</span> <span class="special">\</span> 1378<span class="special">...></span> <span class="identifier">transform</span><span class="special"><</span> <span class="special">\</span> 1379<span class="special">...></span> <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>>,</span> <span class="special">\</span> 1380<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"><</span> <span class="special">\</span> 1381<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"><</span> <span class="special">\</span> 1382<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">_1</span><span class="special">,</span> <span class="special">\</span> 1383<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"><</span><span class="number">0</span><span class="special">>,</span> <span class="special">\</span> 1384<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"><</span><span class="identifier">sum_items</span><span class="special">></span> <span class="special">\</span> 1385<span class="special">...></span> <span class="special">></span> <span class="special">\</span> 1386<span class="special">...></span> <span class="special">>::</span><span class="identifier">type</span> <span class="special">\</span> 1387<span class="special">...></span> <span class="special">></span> <span class="special">\</span> 1388<span class="special">...></span> <span class="special">>,</span> <span class="special">\</span> 1389<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">quote1</span><span class="special"><</span><span class="identifier">sum_vector</span><span class="special">></span> <span class="comment">/* summarise the vector of numbers */</span> <span class="special">\</span> 1390<span class="special">...></span> <span class="special">></span> <span class="special">\</span> 1391<span class="special">...></span> <span class="special">>;</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">></span> <span class="identifier">exp_parser9</span><span class="special">::</span><span class="identifier">apply</span><span class="special"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 + 3 + 4"</span><span class="special">)>::</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"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">10</span><span class="special">></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"><</span><span class="identifier">number</span><span class="special">></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">></span> <span class="special">#</span><span class="identifier">include</span> <span class="special"><</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">></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"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">></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">></span> <span class="keyword">using</span> <span class="identifier">exp_parser10</span> <span class="special">=</span> <span class="special">\</span> 1486<span class="special">...></span> <span class="identifier">build_parser</span><span class="special"><</span> <span class="special">\</span> 1487<span class="special">...></span> <span class="identifier">transform</span><span class="special"><</span> <span class="special">\</span> 1488<span class="special">...></span> <span class="identifier">sequence</span><span class="special"><</span> <span class="special">\</span> 1489<span class="special">...></span> <span class="identifier">int_token</span><span class="special">,</span> <span class="special">\</span> 1490<span class="special">...></span> <span class="identifier">foldl</span><span class="special"><</span> <span class="special">\</span> 1491<span class="special">...></span> <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>,</span> <span class="special">\</span> 1492<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"><</span><span class="number">0</span><span class="special">>,</span> <span class="special">\</span> 1493<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"><</span><span class="identifier">sum_items</span><span class="special">></span> <span class="special">\</span> 1494<span class="special">...></span> <span class="special">></span> <span class="special">\</span> 1495<span class="special">...></span> <span class="special">>,</span> <span class="special">\</span> 1496<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">quote1</span><span class="special"><</span><span class="identifier">sum_vector</span><span class="special">>></span> <span class="special">\</span> 1497<span class="special">...></span> <span class="special">>;</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"><</span> <span class="identifier">build_parser</span><span class="special"><</span> 1509 <span class="identifier">transform</span><span class="special"><</span> <span class="identifier">transform</span><span class="special"><</span> 1510 <span class="identifier">sequence</span><span class="special"><</span> <span class="identifier">sequence</span><span class="special"><</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"><</span> <span class="identifier">foldl</span><span class="special"><</span> 1515 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>>,</span> <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</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"><</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"><</span><span class="number">0</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"><</span><span class="number">0</span><span class="special">>,</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"><</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">quote2</span><span class="special"><</span><span class="identifier">sum_items</span><span class="special">></span> 1521 <span class="special">></span> 1522 <span class="special">>::</span><span class="identifier">type</span> 1523 <span class="special">></span> <span class="special">></span> 1524 1525 1526 <span class="special">>,</span> <span class="special">>,</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"><</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">quote1</span><span class="special"><</span><span class="identifier">sum_vector</span><span class="special">></span> 1528 <span class="special">></span> <span class="special">></span> 1529<span class="special">></span> <span class="special">></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"><</span><span class="number">0</span><span class="special">></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"><</span><span class="identifier">plus_token</span><span class="special">,</span> 1554 <span class="identifier">int_token</span><span class="special">></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"><</span><span class="identifier">number</span><span class="special">></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"><</span><span class="identifier">number</span><span class="special">></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"><</span><span class="identifier">number</span><span class="special">></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">></span> <span class="special">#</span><span class="identifier">include</span> <span class="special"><</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">></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">></span> <span class="keyword">using</span> <span class="identifier">exp_parser11</span> <span class="special">=</span> <span class="special">\</span> 1602<span class="special">...></span> <span class="identifier">build_parser</span><span class="special"><</span> <span class="special">\</span> 1603<span class="special">...></span> <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> <span class="special">\</span> 1604<span class="special">...></span> <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>,</span> <span class="comment">/* apply this parser repeatedly */</span> <span class="special">\</span> 1605<span class="special">...></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">...></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"><</span><span class="identifier">sum_items</span><span class="special">></span> <span class="comment">/* use this function to add a new value to the summary */</span> <span class="special">\</span> 1607<span class="special">...></span> <span class="special">></span> <span class="special">\</span> 1608<span class="special">...></span> <span class="special">>;</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"><</span><span class="identifier">number</span><span class="special">></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">></span> <span class="identifier">exp_parser11</span><span class="special">::</span><span class="identifier">apply</span><span class="special"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 + 3 + 4"</span><span class="special">)>::</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"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">10</span><span class="special">></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">></span> <span class="keyword">using</span> <span class="identifier">minus_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'-'</span><span class="special">>>;</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">></span> <span class="special">#</span><span class="identifier">include</span> <span class="special"><</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">></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"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">></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">></span> <span class="keyword">using</span> <span class="identifier">exp_parser12</span> <span class="special">=</span> <span class="special">\</span> 1719<span class="special">...></span> <span class="identifier">build_parser</span><span class="special"><</span> <span class="special">\</span> 1720<span class="special">...></span> <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> <span class="special">\</span> 1721<span class="special">...></span> <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">int_token</span><span class="special">>,</span> <span class="special">\</span> 1722<span class="special">...></span> <span class="identifier">int_token</span><span class="special">,</span> <span class="special">\</span> 1723<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"><</span><span class="identifier">sum_items</span><span class="special">></span> <span class="special">\</span> 1724<span class="special">...></span> <span class="special">></span> <span class="special">\</span> 1725<span class="special">...></span> <span class="special">>;</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"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">></span></code> as the separator for the numbers. Let's 1732 try it out: 1733 </p> 1734<pre class="programlisting"><span class="special">></span> <span class="identifier">exp_parser12</span><span class="special">::</span><span class="identifier">apply</span><span class="special"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 - 3"</span><span class="special">)>::</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"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">6</span><span class="special">></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">></span> <span class="special">#</span><span class="identifier">include</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">.</span><span class="identifier">hpp</span><span class="special">></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">></span> <span class="keyword">template</span> <span class="special"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special">;</span> 1775<span class="special">></span> <span class="keyword">template</span> <span class="special"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</span><span class="identifier">type</span> <span class="special">{};</span> 1776<span class="special">></span> <span class="keyword">template</span> <span class="special"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</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">></span> <span class="identifier">eval_binary_op</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"><</span><span class="number">11</span><span class="special">>,</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"><</span><span class="number">2</span><span class="special">>>::</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"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">13</span><span class="special">></span> 1808<span class="special">></span> <span class="identifier">eval_binary_op</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"><</span><span class="number">13</span><span class="special">>,</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"><</span><span class="number">2</span><span class="special">>>::</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"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">11</span><span class="special">></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"><</span><span class="identifier">number</span><span class="special">></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"><</span><span class="identifier">number</span><span class="special">></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">></span> <span class="keyword">template</span> <span class="special"><</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">></span> <span class="special">\</span> 1844<span class="special">...></span> <span class="keyword">struct</span> <span class="identifier">binary_op</span> <span class="special">:</span> <span class="special">\</span> 1845<span class="special">...></span> <span class="identifier">eval_binary_op</span><span class="special"><</span> <span class="special">\</span> 1846<span class="special">...></span> <span class="identifier">S</span><span class="special">,</span> <span class="special">\</span> 1847<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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">>::</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">...></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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">>::</span><span class="identifier">type</span> <span class="special">\</span> 1849<span class="special">...></span> <span class="special">></span> <span class="special">\</span> 1850<span class="special">...></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"><</span><span class="char">'+'</span><span class="special">></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"><</span><span class="char">'+'</span><span class="special">>::</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">>::</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">></span> <span class="identifier">binary_op</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"><</span><span class="number">11</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"><</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"><</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"><</span><span class="number">2</span><span class="special">>>>::</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"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">13</span><span class="special">></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">></span> <span class="keyword">using</span> <span class="identifier">exp_parser13</span> <span class="special">=</span> <span class="special">\</span> 1875<span class="special">...></span> <span class="identifier">build_parser</span><span class="special"><</span> <span class="special">\</span> 1876<span class="special">...></span> <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> <span class="special">\</span> 1877<span class="special">...></span> <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">int_token</span><span class="special">>,</span> <span class="special">\</span> 1878<span class="special">...></span> <span class="identifier">int_token</span><span class="special">,</span> <span class="special">\</span> 1879<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"><</span><span class="identifier">binary_op</span><span class="special">></span> <span class="special">\</span> 1880<span class="special">...></span> <span class="special">></span> <span class="special">\</span> 1881<span class="special">...></span> <span class="special">>;</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">></span> <span class="identifier">exp_parser13</span><span class="special">::</span><span class="identifier">apply</span><span class="special"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 - 3"</span><span class="special">)>::</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"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">0</span><span class="special">></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">></span> <span class="special">#</span><span class="identifier">include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 1943<span class="special">></span> <span class="keyword">template</span> <span class="special"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</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"><</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">></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">></span> <span class="identifier">eval_binary_op</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"><</span><span class="number">3</span><span class="special">>,</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"><</span><span class="number">4</span><span class="special">>>::</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"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">12</span><span class="special">></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">></span> <span class="keyword">using</span> <span class="identifier">times_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'*'</span><span class="special">>>;</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">></span> <span class="keyword">using</span> <span class="identifier">exp_parser14</span> <span class="special">=</span> <span class="special">\</span> 1968<span class="special">...></span> <span class="identifier">build_parser</span><span class="special"><</span> <span class="special">\</span> 1969<span class="special">...></span> <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> <span class="special">\</span> 1970<span class="special">...></span> <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</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">>,</span> <span class="identifier">int_token</span><span class="special">>,</span> <span class="special">\</span> 1971<span class="special">...></span> <span class="identifier">int_token</span><span class="special">,</span> <span class="special">\</span> 1972<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"><</span><span class="identifier">binary_op</span><span class="special">></span> <span class="special">\</span> 1973<span class="special">...></span> <span class="special">></span> <span class="special">\</span> 1974<span class="special">...></span> <span class="special">>;</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">></span> <span class="identifier">exp_parser14</span><span class="special">::</span><span class="identifier">apply</span><span class="special"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"2 * 3"</span><span class="special">)>::</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"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">6</span><span class="special">></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">></span> <span class="identifier">exp_parser14</span><span class="special">::</span><span class="identifier">apply</span><span class="special"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 * 3"</span><span class="special">)>::</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"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">9</span><span class="special">></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">></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"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">int_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">quote2</span><span class="special"><</span><span class="identifier">binary_op</span><span class="special">>>;</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">></span> <span class="keyword">using</span> <span class="identifier">exp_parser15</span> <span class="special">=</span> <span class="special">\</span> 2051<span class="special">...></span> <span class="identifier">build_parser</span><span class="special"><</span> <span class="special">\</span> 2052<span class="special">...></span> <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> <span class="special">\</span> 2053<span class="special">...></span> <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp1</span><span class="special">>,</span> <span class="special">\</span> 2054<span class="special">...></span> <span class="identifier">mult_exp1</span><span class="special">,</span> <span class="special">\</span> 2055<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"><</span><span class="identifier">binary_op</span><span class="special">></span> <span class="special">\</span> 2056<span class="special">...></span> <span class="special">></span> <span class="special">\</span> 2057<span class="special">...></span> <span class="special">>;</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">></span> <span class="identifier">exp_parser15</span><span class="special">::</span><span class="identifier">apply</span><span class="special"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 * 3"</span><span class="special">)>::</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"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">7</span><span class="special">></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">></span> <span class="special">#</span><span class="identifier">include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 2120<span class="special">></span> <span class="keyword">template</span> <span class="special"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</span><span class="identifier">type</span> <span class="special">{};</span> 2121<span class="special">></span> <span class="keyword">using</span> <span class="identifier">divides_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'/'</span><span class="special">>>;</span> 2122<span class="special">></span> <span class="keyword">using</span> <span class="identifier">mult_exp2</span> <span class="special">=</span> <span class="special">\</span> 2123<span class="special">...></span> <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> <span class="special">\</span> 2124<span class="special">...></span> <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">>,</span> <span class="identifier">int_token</span><span class="special">>,</span> <span class="special">\</span> 2125<span class="special">...></span> <span class="identifier">int_token</span><span class="special">,</span> <span class="special">\</span> 2126<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"><</span><span class="identifier">binary_op</span><span class="special">></span> <span class="special">\</span> 2127<span class="special">...></span> <span class="special">>;</span> 2128<span class="special">></span> <span class="keyword">using</span> <span class="identifier">exp_parser16</span> <span class="special">=</span> <span class="special">\</span> 2129<span class="special">...></span> <span class="identifier">build_parser</span><span class="special"><</span> <span class="special">\</span> 2130<span class="special">...></span> <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> <span class="special">\</span> 2131<span class="special">...></span> <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp2</span><span class="special">>,</span> <span class="special">\</span> 2132<span class="special">...></span> <span class="identifier">mult_exp2</span><span class="special">,</span> <span class="special">\</span> 2133<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"><</span><span class="identifier">binary_op</span><span class="special">></span> <span class="special">\</span> 2134<span class="special">...></span> <span class="special">></span> <span class="special">\</span> 2135<span class="special">...></span> <span class="special">>;</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"><</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">></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">></span> <span class="identifier">exp_parser16</span><span class="special">::</span><span class="identifier">apply</span><span class="special"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"8 / 4"</span><span class="special">)>::</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"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">2</span><span class="special">></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">></span> <span class="keyword">template</span> <span class="special"><</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">></span> <span class="special">\</span> 2276<span class="special">...></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">...></span> <span class="identifier">eval_binary_op</span><span class="special"><</span> <span class="special">\</span> 2278<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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">>::</span><span class="identifier">type</span><span class="special">,</span> <span class="special">\</span> 2279<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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">>::</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">...></span> <span class="identifier">S</span> <span class="special">\</span> 2281<span class="special">...></span> <span class="special">></span> <span class="special">\</span> 2282<span class="special">...></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">></span> <span class="special">#</span><span class="identifier">include</span> <span class="special"><</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">></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">></span> <span class="keyword">using</span> <span class="identifier">mult_exp3</span> <span class="special">=</span> <span class="special">\</span> 2319<span class="special">...></span> <span class="identifier">foldr_start_with_parser</span><span class="special"><</span> <span class="special">\</span> 2320<span class="special">...></span> <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">one_of</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">>>,</span> <span class="comment">/* The parser applied repeatedly */</span> <span class="special">\</span> 2321<span class="special">...></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">...></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"><</span><span class="identifier">reverse_binary_op</span><span class="special">></span> <span class="comment">/* The function called for every result */</span> <span class="special">\</span> 2323<span class="special">...></span> <span class="comment">/* of applying the above parser */</span> <span class="special">\</span> 2324<span class="special">...></span> <span class="special">>;</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"><</span><span class="identifier">number</span><span class="special">></span> 2336 <span class="special"><</span><span class="keyword">operator</span><span class="special">></span></code> elements instead of <code class="computeroutput"><span class="special"><</span><span class="keyword">operator</span><span class="special">></span> <span class="special"><</span><span class="identifier">number</span><span class="special">></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">></span> <span class="keyword">using</span> <span class="identifier">exp_parser17</span> <span class="special">=</span> <span class="special">\</span> 2353<span class="special">...></span> <span class="identifier">build_parser</span><span class="special"><</span> <span class="special">\</span> 2354<span class="special">...></span> <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> <span class="special">\</span> 2355<span class="special">...></span> <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp3</span><span class="special">>,</span> <span class="special">\</span> 2356<span class="special">...></span> <span class="identifier">mult_exp3</span><span class="special">,</span> <span class="special">\</span> 2357<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"><</span><span class="identifier">binary_op</span><span class="special">></span> <span class="special">\</span> 2358<span class="special">...></span> <span class="special">></span> <span class="special">\</span> 2359<span class="special">...></span> <span class="special">>;</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">></span> <span class="identifier">exp_parser17</span><span class="special">::</span><span class="identifier">apply</span><span class="special"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"8 / 4 / 2"</span><span class="special">)>::</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"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">4</span><span class="special">></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">></span> <span class="special">#</span><span class="identifier">include</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">negate</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 2452<span class="special">></span> <span class="keyword">using</span> <span class="identifier">unary_exp1</span> <span class="special">=</span> <span class="special">\</span> 2453<span class="special">...></span> <span class="identifier">foldr_start_with_parser</span><span class="special"><</span> <span class="special">\</span> 2454<span class="special">...></span> <span class="identifier">minus_token</span><span class="special">,</span> <span class="special">\</span> 2455<span class="special">...></span> <span class="identifier">int_token</span><span class="special">,</span> <span class="special">\</span> 2456<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"><</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">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">type</span> <span class="special">\</span> 2457<span class="special">...></span> <span class="special">>;</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"><</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">></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">></span> <span class="keyword">using</span> <span class="identifier">mult_exp4</span> <span class="special">=</span> <span class="special">\</span> 2483<span class="special">...></span> <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> <span class="special">\</span> 2484<span class="special">...></span> <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">>,</span> <span class="identifier">unary_exp1</span><span class="special">>,</span> <span class="special">\</span> 2485<span class="special">...></span> <span class="identifier">unary_exp1</span><span class="special">,</span> <span class="special">\</span> 2486<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"><</span><span class="identifier">binary_op</span><span class="special">></span> <span class="special">\</span> 2487<span class="special">...></span> <span class="special">>;</span> 2488<span class="special">></span> <span class="keyword">using</span> <span class="identifier">exp_parser18</span> <span class="special">=</span> <span class="special">\</span> 2489<span class="special">...></span> <span class="identifier">build_parser</span><span class="special"><</span> <span class="special">\</span> 2490<span class="special">...></span> <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> <span class="special">\</span> 2491<span class="special">...></span> <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp4</span><span class="special">>,</span> <span class="special">\</span> 2492<span class="special">...></span> <span class="identifier">mult_exp4</span><span class="special">,</span> <span class="special">\</span> 2493<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"><</span><span class="identifier">binary_op</span><span class="special">></span> <span class="special">\</span> 2494<span class="special">...></span> <span class="special">></span> <span class="special">\</span> 2495<span class="special">...></span> <span class="special">>;</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">></span> <span class="identifier">exp_parser18</span><span class="special">::</span><span class="identifier">apply</span><span class="special"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"---13"</span><span class="special">)>::</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"><</span><span class="keyword">int</span><span class="special">,</span> <span class="special">-</span><span class="number">13</span><span class="special">></span> 2505<span class="special">></span> <span class="identifier">exp_parser18</span><span class="special">::</span><span class="identifier">apply</span><span class="special"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"13"</span><span class="special">)>::</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"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">13</span><span class="special">></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">></span> <span class="keyword">using</span> <span class="identifier">lparen_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'('</span><span class="special">>>;</span> 2531<span class="special">></span> <span class="keyword">using</span> <span class="identifier">rparen_token</span> <span class="special">=</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">')'</span><span class="special">>>;</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">></span> <span class="keyword">using</span> <span class="identifier">plus_exp1</span> <span class="special">=</span> <span class="special">\</span> 2542<span class="special">...></span> <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> <span class="special">\</span> 2543<span class="special">...></span> <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp4</span><span class="special">>,</span> <span class="special">\</span> 2544<span class="special">...></span> <span class="identifier">mult_exp4</span><span class="special">,</span> <span class="special">\</span> 2545<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"><</span><span class="identifier">binary_op</span><span class="special">></span> <span class="special">\</span> 2546<span class="special">...></span> <span class="special">>;</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"><</span><span class="identifier">plus_exp1</span><span class="special">></span></code> 2554 now. Let's write a parser for a paren expression: 2555 </p> 2556<pre class="programlisting"><span class="special">></span> <span class="keyword">using</span> <span class="identifier">paren_exp1</span> <span class="special">=</span> <span class="identifier">sequence</span><span class="special"><</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">>;</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">></span> <span class="special">#</span><span class="identifier">include</span> <span class="special"><</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">></span> 2568<span class="special">></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"><</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">>;</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">></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"><</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">paren_exp2</span><span class="special">>;</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">></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">></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"><</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">>;</span> 2656<span class="special">></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"><</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">paren_exp2</span><span class="special">>;</span> 2657<span class="special">></span> <span class="keyword">using</span> <span class="identifier">unary_exp2</span> <span class="special">=</span> <span class="special">\</span> 2658<span class="special">...></span> <span class="identifier">foldr_start_with_parser</span><span class="special"><</span> <span class="special">\</span> 2659<span class="special">...></span> <span class="identifier">minus_token</span><span class="special">,</span> <span class="special">\</span> 2660<span class="special">...></span> <span class="identifier">primary_exp2</span><span class="special">,</span> <span class="special">\</span> 2661<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"><</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">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">type</span> <span class="special">\</span> 2662<span class="special">...></span> <span class="special">>;</span> 2663<span class="special">></span> <span class="keyword">using</span> <span class="identifier">mult_exp5</span> <span class="special">=</span> <span class="special">\</span> 2664<span class="special">...></span> <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> <span class="special">\</span> 2665<span class="special">...></span> <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">>,</span> <span class="identifier">unary_exp2</span><span class="special">>,</span> <span class="special">\</span> 2666<span class="special">...></span> <span class="identifier">unary_exp2</span><span class="special">,</span> <span class="special">\</span> 2667<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"><</span><span class="identifier">binary_op</span><span class="special">></span> <span class="special">\</span> 2668<span class="special">...></span> <span class="special">>;</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">></span> <span class="keyword">struct</span> <span class="identifier">plus_exp2</span> <span class="special">:</span> <span class="special">\</span> 2679<span class="special">...></span> <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> <span class="special">\</span> 2680<span class="special">...></span> <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp5</span><span class="special">>,</span> <span class="special">\</span> 2681<span class="special">...></span> <span class="identifier">mult_exp5</span><span class="special">,</span> <span class="special">\</span> 2682<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"><</span><span class="identifier">binary_op</span><span class="special">></span> <span class="special">\</span> 2683<span class="special">...></span> <span class="special">></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">></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"><</span><span class="identifier">plus_exp2</span><span class="special">>;</span> 2693</pre> 2694<p> 2695 Let's try this parser out: 2696 </p> 2697<pre class="programlisting"><span class="special">></span> <span class="identifier">exp_parser19</span><span class="special">::</span><span class="identifier">apply</span><span class="special"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"(1 + 2) * 3"</span><span class="special">)>::</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"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">9</span><span class="special">></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">></span> <span class="identifier">exp_parser19</span><span class="special">::</span><span class="identifier">apply</span><span class="special"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"hello"</span><span class="special">)>::</span><span class="identifier">type</span> 2735<span class="special"><<</span> <span class="identifier">compilation</span> <span class="identifier">error</span> <span class="special">>></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"><</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"><</span><span class="char">'('</span><span class="special">></span> 2745<span class="special">></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"><</span><span class="char">'('</span><span class="special">></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"><</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">paren_exp2</span><span class="special">></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">></span> <span class="special">#</span><span class="identifier">include</span> <span class="special"><</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">></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">></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">></span> <span class="keyword">struct</span> <span class="identifier">plus_exp3</span><span class="special">;</span> 2887<span class="special">></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"><</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">>;</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"><</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">paren_exp4</span><span class="special">,</span> <span class="special">...></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">></span> <span class="special">#</span><span class="identifier">include</span> <span class="special"><</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">></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">></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"><</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"><</span><span class="identifier">missing_primary_expression</span><span class="special">>>;</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"><</span><span class="identifier">missing_primary_expression</span><span class="special">></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">></span> <span class="keyword">using</span> <span class="identifier">unary_exp3</span> <span class="special">=</span> <span class="special">\</span> 2918<span class="special">...></span> <span class="identifier">foldr_start_with_parser</span><span class="special"><</span> <span class="special">\</span> 2919<span class="special">...></span> <span class="identifier">minus_token</span><span class="special">,</span> <span class="special">\</span> 2920<span class="special">...></span> <span class="identifier">primary_exp3</span><span class="special">,</span> <span class="special">\</span> 2921<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"><</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">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">type</span> <span class="special">\</span> 2922<span class="special">...></span> <span class="special">>;</span> 2923<span class="special">></span> <span class="keyword">using</span> <span class="identifier">mult_exp6</span> <span class="special">=</span> <span class="special">\</span> 2924<span class="special">...></span> <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> <span class="special">\</span> 2925<span class="special">...></span> <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">>,</span> <span class="identifier">unary_exp3</span><span class="special">>,</span> <span class="special">\</span> 2926<span class="special">...></span> <span class="identifier">unary_exp3</span><span class="special">,</span> <span class="special">\</span> 2927<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"><</span><span class="identifier">binary_op</span><span class="special">></span> <span class="special">\</span> 2928<span class="special">...></span> <span class="special">>;</span> 2929<span class="special">></span> <span class="keyword">struct</span> <span class="identifier">plus_exp3</span> <span class="special">:</span> <span class="special">\</span> 2930<span class="special">...></span> <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> <span class="special">\</span> 2931<span class="special">...></span> <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp6</span><span class="special">>,</span> <span class="special">\</span> 2932<span class="special">...></span> <span class="identifier">mult_exp6</span><span class="special">,</span> <span class="special">\</span> 2933<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"><</span><span class="identifier">binary_op</span><span class="special">></span> <span class="special">\</span> 2934<span class="special">...></span> <span class="special">></span> <span class="special">{};</span> 2935<span class="special">></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"><</span><span class="identifier">plus_exp3</span><span class="special">>;</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">></span> <span class="identifier">exp_parser20</span><span class="special">::</span><span class="identifier">apply</span><span class="special"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"hello"</span><span class="special">)>::</span><span class="identifier">type</span> 2944<span class="special"><<</span> <span class="identifier">compilation</span> <span class="identifier">error</span> <span class="special">>></span> 2945<span class="special">.....</span> <span class="identifier">x__________________PARSING_FAILED__________________x</span><span class="special"><</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">></span> <span class="special">....</span> 2946<span class="special"><<</span> <span class="identifier">compilation</span> <span class="identifier">error</span> <span class="special">>></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">></span> <span class="identifier">exp_parser20</span><span class="special">::</span><span class="identifier">apply</span><span class="special"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"(1+2"</span><span class="special">)>::</span><span class="identifier">type</span> 2972<span class="special"><<</span> <span class="identifier">compilation</span> <span class="identifier">error</span> <span class="special">>></span> 2973<span class="special">.....</span> <span class="identifier">x__________________PARSING_FAILED__________________x</span><span class="special"><</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"><</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"><</span><span class="char">')'</span><span class="special">>>></span> <span class="special">....</span> 2974<span class="special"><<</span> <span class="identifier">compilation</span> <span class="identifier">error</span> <span class="special">>></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">></span> <span class="identifier">exp_parser20</span><span class="special">::</span><span class="identifier">apply</span><span class="special"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"0+(1+2"</span><span class="special">)>::</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"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">0</span><span class="special">></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"><</span><span class="identifier">mult_exp</span><span class="special">></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"><</span><span class="identifier">mult_exp</span><span class="special">></span></code> element. But parsing the <code class="computeroutput"><span class="special"><</span><span class="identifier">mult_exp</span><span class="special">></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"><</span><span class="identifier">mult_exp</span><span class="special">></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"><</span><span class="identifier">mult_exp</span><span class="special">></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"><</span><span class="identifier">parser</span><span class="special">></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">></span> <span class="special">#</span><span class="identifier">include</span> <span class="special"><</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">></span> 3019<span class="special">></span> <span class="special">#</span><span class="identifier">include</span> <span class="special"><</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">></span> 3020<span class="special">></span> <span class="keyword">struct</span> <span class="identifier">plus_exp4</span> <span class="special">:</span> <span class="special">\</span> 3021<span class="special">...></span> <span class="identifier">first_of</span><span class="special"><</span> <span class="special">\</span> 3022<span class="special">...></span> <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> <span class="special">\</span> 3023<span class="special">...></span> <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp6</span><span class="special">>,</span> <span class="special">\</span> 3024<span class="special">...></span> <span class="identifier">mult_exp6</span><span class="special">,</span> <span class="special">\</span> 3025<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"><</span><span class="identifier">binary_op</span><span class="special">></span> <span class="special">\</span> 3026<span class="special">...></span> <span class="special">>,</span> <span class="special">\</span> 3027<span class="special">...></span> <span class="identifier">fail_at_first_char_expected</span><span class="special"><</span> <span class="special">\</span> 3028<span class="special">...></span> <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp6</span><span class="special">></span> <span class="special">\</span> 3029<span class="special">...></span> <span class="special">></span> <span class="special">\</span> 3030<span class="special">...></span> <span class="special">></span> <span class="special">{};</span> 3031<span class="special">></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"><</span><span class="identifier">plus_exp4</span><span class="special">>;</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">></span> <span class="identifier">exp_parser21</span><span class="special">::</span><span class="identifier">apply</span><span class="special"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"0+(1+2"</span><span class="special">)>::</span><span class="identifier">type</span> 3049<span class="special"><<</span> <span class="identifier">compilation</span> <span class="identifier">error</span> <span class="special">>></span> 3050<span class="special">.....</span> <span class="identifier">x__________________PARSING_FAILED__________________x</span><span class="special"><</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"><</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"><</span><span class="char">')'</span><span class="special">>>></span> <span class="special">....</span> 3051<span class="special"><<</span> <span class="identifier">compilation</span> <span class="identifier">error</span> <span class="special">>></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"><</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"><</span><span class="identifier">plus_token</span><span class="special">,</span> 3067 <span class="identifier">minus_token</span><span class="special">>,</span> 3068 <span class="identifier">mult_exp6</span><span class="special">></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">></span> <span class="special">#</span><span class="identifier">include</span> <span class="special"><</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">></span> 3079<span class="special">></span> <span class="keyword">struct</span> <span class="identifier">plus_exp5</span> <span class="special">:</span> <span class="special">\</span> 3080<span class="special">...></span> <span class="identifier">foldl_reject_incomplete_start_with_parser</span><span class="special"><</span> <span class="special">\</span> 3081<span class="special">...></span> <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp6</span><span class="special">>,</span> <span class="special">\</span> 3082<span class="special">...></span> <span class="identifier">mult_exp6</span><span class="special">,</span> <span class="special">\</span> 3083<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"><</span><span class="identifier">binary_op</span><span class="special">></span> <span class="special">\</span> 3084<span class="special">...></span> <span class="special">></span> <span class="special">{};</span> 3085<span class="special">></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"><</span><span class="identifier">plus_exp5</span><span class="special">>;</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"><</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"><</span><span class="identifier">plus_token</span><span class="special">,</span> 3092 <span class="identifier">minus_token</span><span class="special">>,</span> 3093 <span class="identifier">mult_exp6</span><span class="special">></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">></span> <span class="identifier">exp_parser22</span><span class="special">::</span><span class="identifier">apply</span><span class="special"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"0+(1+2"</span><span class="special">)>::</span><span class="identifier">type</span> 3105<span class="special"><<</span> <span class="identifier">compilation</span> <span class="identifier">error</span> <span class="special">>></span> 3106<span class="special">.....</span> <span class="identifier">x__________________PARSING_FAILED__________________x</span><span class="special"><</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"><</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"><</span><span class="char">')'</span><span class="special">>>></span> <span class="special">....</span> 3107<span class="special"><<</span> <span class="identifier">compilation</span> <span class="identifier">error</span> <span class="special">>></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">></span> <span class="keyword">struct</span> <span class="identifier">plus_exp6</span><span class="special">;</span> 3129<span class="special">></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"><</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">>;</span> 3130<span class="special">></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"><</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"><</span><span class="identifier">missing_primary_expression</span><span class="special">>>;</span> 3131<span class="special">></span> <span class="keyword">using</span> <span class="identifier">unary_exp4</span> <span class="special">=</span> <span class="special">\</span> 3132<span class="special">...></span> <span class="identifier">foldr_start_with_parser</span><span class="special"><</span> <span class="special">\</span> 3133<span class="special">...></span> <span class="identifier">minus_token</span><span class="special">,</span> <span class="special">\</span> 3134<span class="special">...></span> <span class="identifier">primary_exp4</span><span class="special">,</span> <span class="special">\</span> 3135<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"><</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">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">type</span> <span class="special">\</span> 3136<span class="special">...></span> <span class="special">>;</span> 3137<span class="special">></span> <span class="keyword">using</span> <span class="identifier">mult_exp7</span> <span class="special">=</span> <span class="special">\</span> 3138<span class="special">...></span> <span class="identifier">foldl_reject_incomplete_start_with_parser</span><span class="special"><</span> <span class="special">\</span> 3139<span class="special">...></span> <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">>,</span> <span class="identifier">unary_exp4</span><span class="special">>,</span> <span class="special">\</span> 3140<span class="special">...></span> <span class="identifier">unary_exp4</span><span class="special">,</span> <span class="special">\</span> 3141<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"><</span><span class="identifier">binary_op</span><span class="special">></span> <span class="special">\</span> 3142<span class="special">...></span> <span class="special">>;</span> 3143<span class="special">></span> <span class="keyword">struct</span> <span class="identifier">plus_exp6</span> <span class="special">:</span> <span class="special">\</span> 3144<span class="special">...></span> <span class="identifier">foldl_reject_incomplete_start_with_parser</span><span class="special"><</span> <span class="special">\</span> 3145<span class="special">...></span> <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp7</span><span class="special">>,</span> <span class="special">\</span> 3146<span class="special">...></span> <span class="identifier">mult_exp7</span><span class="special">,</span> <span class="special">\</span> 3147<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"><</span><span class="identifier">binary_op</span><span class="special">></span> <span class="special">\</span> 3148<span class="special">...></span> <span class="special">></span> <span class="special">{};</span> 3149<span class="special">></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"><</span><span class="identifier">plus_exp6</span><span class="special">>;</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">></span> <span class="identifier">exp_parser23</span><span class="special">::</span><span class="identifier">apply</span><span class="special"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1+(2*"</span><span class="special">)>::</span><span class="identifier">type</span> 3175<span class="special"><<</span> <span class="identifier">compilation</span> <span class="identifier">error</span> <span class="special">>></span> 3176<span class="special">.....</span> <span class="identifier">x__________________PARSING_FAILED__________________x</span><span class="special"><</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">></span> <span class="special">....</span> 3177<span class="special"><<</span> <span class="identifier">compilation</span> <span class="identifier">error</span> <span class="special">>></span> 3178 3179<span class="special">></span> <span class="identifier">exp_parser23</span><span class="special">::</span><span class="identifier">apply</span><span class="special"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1+(2*3"</span><span class="special">)>::</span><span class="identifier">type</span> 3180<span class="special"><<</span> <span class="identifier">compilation</span> <span class="identifier">error</span> <span class="special">>></span> 3181<span class="special">.....</span> <span class="identifier">x__________________PARSING_FAILED__________________x</span><span class="special"><</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"><</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"><</span><span class="char">')'</span><span class="special">>>></span> <span class="special">....</span> 3182<span class="special"><<</span> <span class="identifier">compilation</span> <span class="identifier">error</span> <span class="special">>></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"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</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"><</span><span class="identifier">int_</span><span class="special">>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>>;</span> 3213</pre> 3214<a name="getting_started_2"></a><pre class="programlisting"><span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 3215<span class="preprocessor">#include</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</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 3216<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">></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"><</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"><</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">0</span><span class="special">>::</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"><</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">2</span><span class="special">>::</span><span class="identifier">type</span> <span class="special">></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"><</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"><</span> <span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">11</span><span class="special">>,</span> <span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">char_</span><span class="special"><</span><span class="char">'+'</span><span class="special">>,</span> <span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">2</span><span class="special">></span> <span class="special">>>::</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"><</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">></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"><</span> <span class="identifier">transform</span><span class="special"><</span> <span class="identifier">sequence</span><span class="special"><</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">>,</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"><</span><span class="identifier">eval_plus</span><span class="special">></span> <span class="special">></span> <span class="special">>;</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"><</span> <span class="identifier">sequence</span><span class="special"><</span> <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* The first <number> */</span> <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>></span> <span class="comment">/* The "+ <number>" elements */</span> <span class="special">></span> <span class="special">>;</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"><</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"><</span><span class="number">2</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"><</span><span class="number">5</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"><</span><span class="number">6</span><span class="special">></span> <span class="special">>;</span> 3226</pre> 3227<a name="getting_started_7"></a><pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">></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"><</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"><</span><span class="number">0</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"><</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">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">></span> <span class="special">>::</span><span class="identifier">type</span> <span class="special">></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"><</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">></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"><</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">>::</span><span class="identifier">type</span> <span class="special">></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"><</span> <span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">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">vector</span><span class="special"><</span><span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">char_</span><span class="special"><</span><span class="char">'+'</span><span class="special">>,</span> <span class="identifier">mpl_</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">2</span><span class="special">>></span> <span class="special">>::</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"><</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"><</span><span class="identifier">temp_result</span><span class="special">,</span> <span class="number">1</span><span class="special">>::</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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> <span class="comment">/* The function to call in each iteration */</span> <span class="special">>::</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"><</span> <span class="identifier">sequence</span><span class="special"><</span> <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* parse the first <number> */</span> <span class="identifier">transform</span><span class="special"><</span> <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>>,</span> <span class="comment">/* parse the "+ <number>" elements */</span> <span class="comment">/* lambda expression summarising the "+ <number>" 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"><</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"><</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<...> 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"><</span><span class="number">0</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"><</span><span class="identifier">sum_items</span><span class="special">></span> <span class="special">></span> <span class="special">>::</span><span class="identifier">type</span> <span class="special">></span> <span class="special">></span> <span class="special">>;</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"><</span> <span class="identifier">transform</span><span class="special"><</span> <span class="comment">/* What we had so far */</span> <span class="identifier">sequence</span><span class="special"><</span> <span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">transform</span><span class="special"><</span> <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_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"><</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">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"><</span><span class="number">0</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"><</span><span class="identifier">sum_items</span><span class="special">></span> <span class="special">></span> <span class="special">>::</span><span class="identifier">type</span> <span class="special">></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">quote1</span><span class="special"><</span><span class="identifier">sum_vector</span><span class="special">></span> <span class="comment">/* summarise the vector of numbers */</span> <span class="special">></span> <span class="special">>;</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"><</span> <span class="identifier">transform</span><span class="special"><</span> <span class="identifier">sequence</span><span class="special"><</span> <span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">foldl</span><span class="special"><</span> <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_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">int_</span><span class="special"><</span><span class="number">0</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"><</span><span class="identifier">sum_items</span><span class="special">></span> <span class="special">></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">quote1</span><span class="special"><</span><span class="identifier">sum_vector</span><span class="special">>></span> <span class="special">>;</span> 3240</pre> 3241<a name="getting_started_14"></a><pre class="programlisting"><span class="special">></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"><</span> <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> <span class="comment">/* use this function to add a new value to the summary */</span> <span class="special">></span> <span class="special">>;</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"><</span> <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">int_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">quote2</span><span class="special"><</span><span class="identifier">sum_items</span><span class="special">></span> <span class="special">></span> <span class="special">>;</span> 3246</pre> 3247<a name="getting_started_17"></a><pre class="programlisting"><span class="keyword">template</span> <span class="special"><</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">></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"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</span><span class="identifier">type</span> <span class="special">{};</span> 3249<span class="keyword">template</span> <span class="special"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</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"><</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"><</span><span class="number">11</span><span class="special">>,</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"><</span><span class="number">2</span><span class="special">>>::</span><span class="identifier">type</span> 3252<span class="identifier">eval_binary_op</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"><</span><span class="number">13</span><span class="special">>,</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"><</span><span class="number">2</span><span class="special">>>::</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"><</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">></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"><</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">>::</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">>::</span><span class="identifier">type</span> <span class="special">></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"><</span> <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">int_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">quote2</span><span class="special"><</span><span class="identifier">binary_op</span><span class="special">></span> <span class="special">></span> <span class="special">>;</span> 3257</pre> 3258<a name="getting_started_21"></a><pre class="programlisting"><span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 3259<span class="keyword">template</span> <span class="special"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</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"><</span> <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</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">>,</span> <span class="identifier">int_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">quote2</span><span class="special"><</span><span class="identifier">binary_op</span><span class="special">></span> <span class="special">></span> <span class="special">>;</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"><</span> <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp1</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> <span class="special">></span> <span class="special">>;</span> 3264</pre> 3265<a name="getting_started_24"></a><pre class="programlisting"><span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 3266<span class="keyword">template</span> <span class="special"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'/'</span><span class="special">>>;</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"><</span> <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">>,</span> <span class="identifier">int_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">quote2</span><span class="special"><</span><span class="identifier">binary_op</span><span class="special">></span> <span class="special">>;</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"><</span> <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp2</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> <span class="special">></span> <span class="special">>;</span> 3270</pre> 3271<a name="getting_started_25"></a><pre class="programlisting"><span class="keyword">template</span> <span class="special"><</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">></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"><</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">>::</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">>::</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">></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"><</span> <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">one_of</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">>>,</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"><</span><span class="identifier">reverse_binary_op</span><span class="special">></span> <span class="comment">/* The function called for every result */</span> <span class="comment">/* of applying the above parser */</span> <span class="special">>;</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"><</span> <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp3</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> <span class="special">></span> <span class="special">>;</span> 3276</pre> 3277<a name="getting_started_28"></a><pre class="programlisting"><span class="preprocessor">#include</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">negate</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></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"><</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"><</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">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">type</span> <span class="special">>;</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"><</span> <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">>,</span> <span class="identifier">unary_exp1</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> <span class="special">>;</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"><</span> <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp4</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> <span class="special">></span> <span class="special">>;</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"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"---13"</span><span class="special">)>::</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"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"13"</span><span class="special">)>::</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'('</span><span class="special">>>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">')'</span><span class="special">>>;</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"><</span> <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp4</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> <span class="special">>;</span> 3290</pre> 3291<a name="getting_started_33"></a><pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</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">></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"><</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">>;</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"><</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">>;</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"><</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">paren_exp2</span><span class="special">>;</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"><</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"><</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">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">type</span> <span class="special">>;</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"><</span> <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">>,</span> <span class="identifier">unary_exp2</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> <span class="special">>;</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"><</span> <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp5</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> <span class="special">></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"><</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">>;</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"><</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"><</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">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">type</span> <span class="special">>;</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"><</span> <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">>,</span> <span class="identifier">unary_exp3</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> <span class="special">>;</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"><</span> <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp6</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> <span class="special">></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"><</span><span class="identifier">plus_exp3</span><span class="special">>;</span> 3308</pre> 3309<a name="getting_started_38"></a><pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</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">></span> 3310<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp6</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> <span class="special">>,</span> <span class="identifier">fail_at_first_char_expected</span><span class="special"><</span> <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp6</span><span class="special">></span> <span class="special">></span> <span class="special">></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"><</span><span class="identifier">plus_exp4</span><span class="special">>;</span> 3313</pre> 3314<a name="getting_started_39"></a><pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp6</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> <span class="special">></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"><</span><span class="identifier">plus_exp5</span><span class="special">>;</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"><</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">>;</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"><</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"><</span><span class="identifier">missing_primary_expression</span><span class="special">>>;</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"><</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"><</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">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">type</span> <span class="special">>;</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"><</span> <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">>,</span> <span class="identifier">unary_exp4</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> <span class="special">>;</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"><</span> <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp7</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> <span class="special">></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"><</span><span class="identifier">plus_exp6</span><span class="special">>;</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"><</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">></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"><</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">></span> 3341<span class="preprocessor">#include</span> <span class="special"><</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">></span> 3342 3343<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</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"><</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">></span> 3353<span class="preprocessor">#include</span> <span class="special"><</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">></span> 3354 3355<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</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"><</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">></span> 3365<span class="preprocessor">#include</span> <span class="special"><</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">></span> 3366 3367<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</span> 3372<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>;</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"><</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">></span> 3380<span class="preprocessor">#include</span> <span class="special"><</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">></span> 3381 3382<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</span> 3387<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>;</span> 3390<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>>;</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"><</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">></span> 3398<span class="preprocessor">#include</span> <span class="special"><</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">></span> 3399 3400<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</span> 3405<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>;</span> 3408<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>>;</span> 3411<span class="preprocessor">#include</span> <span class="special"><</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">></span> 3412 3413<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>>;</span> 3416 3417<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</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">></span> 3423<span class="preprocessor">#include</span> <span class="special"><</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">></span> 3424 3425<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</span> 3430<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>;</span> 3433<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>>;</span> 3436<span class="preprocessor">#include</span> <span class="special"><</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">></span> 3437 3438<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>>;</span> 3441 3442<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>>;</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"><</span><span class="identifier">sequence</span><span class="special"><</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">>>;</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"><</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">></span> 3454<span class="preprocessor">#include</span> <span class="special"><</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">></span> 3455 3456<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</span> 3461<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>;</span> 3464<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>>;</span> 3467<span class="preprocessor">#include</span> <span class="special"><</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">></span> 3468 3469<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>>;</span> 3472 3473<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>>;</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"><</span><span class="identifier">sequence</span><span class="special"><</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">>>;</span> 3480<span class="preprocessor">#include</span> <span class="special"><</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">></span> 3481 3482<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 3483 3484<span class="preprocessor">#include</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</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 3485 3486<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">></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"><</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"><</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">0</span><span class="special">>::</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"><</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">2</span><span class="special">>::</span><span class="identifier">type</span> 3491 <span class="special">></span> <span class="special">{};</span> 3492 3493<span class="preprocessor">#include</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">quote</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></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"><</span> 3497 <span class="identifier">transform</span><span class="special"><</span> 3498 <span class="identifier">sequence</span><span class="special"><</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">>,</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"><</span><span class="identifier">eval_plus</span><span class="special">></span> 3500 <span class="special">></span> 3501 <span class="special">>;</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"><</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">></span> 3507<span class="preprocessor">#include</span> <span class="special"><</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">></span> 3508 3509<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</span> 3514<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>;</span> 3517<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>>;</span> 3520<span class="preprocessor">#include</span> <span class="special"><</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">></span> 3521 3522<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>>;</span> 3525 3526<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>>;</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"><</span><span class="identifier">sequence</span><span class="special"><</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">>>;</span> 3533<span class="preprocessor">#include</span> <span class="special"><</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">></span> 3534 3535<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 3536 3537<span class="preprocessor">#include</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</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 3538 3539<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">></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"><</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"><</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">0</span><span class="special">>::</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"><</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">2</span><span class="special">>::</span><span class="identifier">type</span> 3544 <span class="special">></span> <span class="special">{};</span> 3545 3546<span class="preprocessor">#include</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">quote</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></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"><</span> 3550 <span class="identifier">transform</span><span class="special"><</span> 3551 <span class="identifier">sequence</span><span class="special"><</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">>,</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"><</span><span class="identifier">eval_plus</span><span class="special">></span> 3553 <span class="special">></span> 3554 <span class="special">>;</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"><</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">></span> 3560<span class="preprocessor">#include</span> <span class="special"><</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">></span> 3561 3562<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</span> 3567<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>;</span> 3570<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>>;</span> 3573<span class="preprocessor">#include</span> <span class="special"><</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">></span> 3574 3575<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>>;</span> 3578 3579<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>>;</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"><</span><span class="identifier">sequence</span><span class="special"><</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">>>;</span> 3586<span class="preprocessor">#include</span> <span class="special"><</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">></span> 3587 3588<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 3589 3590<span class="preprocessor">#include</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</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 3591 3592<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">></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"><</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"><</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">0</span><span class="special">>::</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"><</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">2</span><span class="special">>::</span><span class="identifier">type</span> 3597 <span class="special">></span> <span class="special">{};</span> 3598 3599<span class="preprocessor">#include</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">quote</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></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"><</span> 3603 <span class="identifier">transform</span><span class="special"><</span> 3604 <span class="identifier">sequence</span><span class="special"><</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">>,</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"><</span><span class="identifier">eval_plus</span><span class="special">></span> 3606 <span class="special">></span> 3607 <span class="special">>;</span> 3608<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 3612 <span class="identifier">sequence</span><span class="special"><</span> 3613 <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* The first <number> */</span> 3614 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>></span> <span class="comment">/* The "+ <number>" elements */</span> 3615 <span class="special">></span> 3616 <span class="special">>;</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"><</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">></span> 3622<span class="preprocessor">#include</span> <span class="special"><</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">></span> 3623 3624<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</span> 3629<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>;</span> 3632<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>>;</span> 3635<span class="preprocessor">#include</span> <span class="special"><</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">></span> 3636 3637<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>>;</span> 3640 3641<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>>;</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"><</span><span class="identifier">sequence</span><span class="special"><</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">>>;</span> 3648<span class="preprocessor">#include</span> <span class="special"><</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">></span> 3649 3650<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 3651 3652<span class="preprocessor">#include</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</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 3653 3654<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">></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"><</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"><</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">0</span><span class="special">>::</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"><</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">2</span><span class="special">>::</span><span class="identifier">type</span> 3659 <span class="special">></span> <span class="special">{};</span> 3660 3661<span class="preprocessor">#include</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">quote</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></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"><</span> 3665 <span class="identifier">transform</span><span class="special"><</span> 3666 <span class="identifier">sequence</span><span class="special"><</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">>,</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"><</span><span class="identifier">eval_plus</span><span class="special">></span> 3668 <span class="special">></span> 3669 <span class="special">>;</span> 3670<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 3674 <span class="identifier">sequence</span><span class="special"><</span> 3675 <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* The first <number> */</span> 3676 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>></span> <span class="comment">/* The "+ <number>" elements */</span> 3677 <span class="special">></span> 3678 <span class="special">>;</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"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 + 3 + 4"</span><span class="special">)>::</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"><</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">></span> 3685<span class="preprocessor">#include</span> <span class="special"><</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">></span> 3686 3687<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</span> 3692<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>;</span> 3695<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>>;</span> 3698<span class="preprocessor">#include</span> <span class="special"><</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">></span> 3699 3700<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>>;</span> 3703 3704<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>>;</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"><</span><span class="identifier">sequence</span><span class="special"><</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">>>;</span> 3711<span class="preprocessor">#include</span> <span class="special"><</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">></span> 3712 3713<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 3714 3715<span class="preprocessor">#include</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</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 3716 3717<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">></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"><</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"><</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">0</span><span class="special">>::</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"><</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">2</span><span class="special">>::</span><span class="identifier">type</span> 3722 <span class="special">></span> <span class="special">{};</span> 3723 3724<span class="preprocessor">#include</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">quote</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></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"><</span> 3728 <span class="identifier">transform</span><span class="special"><</span> 3729 <span class="identifier">sequence</span><span class="special"><</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">>,</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"><</span><span class="identifier">eval_plus</span><span class="special">></span> 3731 <span class="special">></span> 3732 <span class="special">>;</span> 3733<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 3737 <span class="identifier">sequence</span><span class="special"><</span> 3738 <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* The first <number> */</span> 3739 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>></span> <span class="comment">/* The "+ <number>" elements */</span> 3740 <span class="special">></span> 3741 <span class="special">>;</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"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 + 3 + 4"</span><span class="special">)>::</span><span class="identifier">type</span><span class="special">;</span> 3743<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></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"><</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"><</span><span class="number">2</span><span class="special">>,</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"><</span><span class="number">5</span><span class="special">>,</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"><</span><span class="number">6</span><span class="special">></span> 3750 <span class="special">>;</span> 3751 3752<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">></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"><</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"><</span><span class="number">0</span><span class="special">>,</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"><</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"><</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">></span> 3759 <span class="special">>::</span><span class="identifier">type</span> 3760 <span class="special">></span> 3761 <span class="special">{};</span> 3762 3763<span class="keyword">template</span> <span class="special"><</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">></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"><</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">>::</span><span class="identifier">type</span> 3768 <span class="special">></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"><</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">></span> 3775<span class="preprocessor">#include</span> <span class="special"><</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">></span> 3776 3777<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</span> 3782<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>;</span> 3785<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>>;</span> 3788<span class="preprocessor">#include</span> <span class="special"><</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">></span> 3789 3790<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>>;</span> 3793 3794<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>>;</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"><</span><span class="identifier">sequence</span><span class="special"><</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">>>;</span> 3801<span class="preprocessor">#include</span> <span class="special"><</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">></span> 3802 3803<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 3804 3805<span class="preprocessor">#include</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</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 3806 3807<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">></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"><</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"><</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">0</span><span class="special">>::</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"><</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">2</span><span class="special">>::</span><span class="identifier">type</span> 3812 <span class="special">></span> <span class="special">{};</span> 3813 3814<span class="preprocessor">#include</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">quote</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></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"><</span> 3818 <span class="identifier">transform</span><span class="special"><</span> 3819 <span class="identifier">sequence</span><span class="special"><</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">>,</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"><</span><span class="identifier">eval_plus</span><span class="special">></span> 3821 <span class="special">></span> 3822 <span class="special">>;</span> 3823<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 3827 <span class="identifier">sequence</span><span class="special"><</span> 3828 <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* The first <number> */</span> 3829 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>></span> <span class="comment">/* The "+ <number>" elements */</span> 3830 <span class="special">></span> 3831 <span class="special">>;</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"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 + 3 + 4"</span><span class="special">)>::</span><span class="identifier">type</span><span class="special">;</span> 3833<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></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"><</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"><</span><span class="number">2</span><span class="special">>,</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"><</span><span class="number">5</span><span class="special">>,</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"><</span><span class="number">6</span><span class="special">></span> 3840 <span class="special">>;</span> 3841 3842<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">></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"><</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"><</span><span class="number">0</span><span class="special">>,</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"><</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"><</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">></span> 3849 <span class="special">>::</span><span class="identifier">type</span> 3850 <span class="special">></span> 3851 <span class="special">{};</span> 3852 3853<span class="keyword">template</span> <span class="special"><</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">></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"><</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">>::</span><span class="identifier">type</span> 3858 <span class="special">></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"><</span> 3862 <span class="identifier">sequence</span><span class="special"><</span> 3863 <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* parse the first <number> */</span> 3864 <span class="identifier">transform</span><span class="special"><</span> 3865 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>>,</span> <span class="comment">/* parse the "+ <number>" elements */</span> 3866 <span class="comment">/* lambda expression summarising the "+ <number>" 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"><</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"><</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<...> 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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 3874 <span class="special">></span> 3875 <span class="special">>::</span><span class="identifier">type</span> 3876 <span class="special">></span> 3877 <span class="special">></span> 3878 <span class="special">>;</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"><</span> 3882 <span class="identifier">transform</span><span class="special"><</span> 3883 <span class="comment">/* What we had so far */</span> 3884 <span class="identifier">sequence</span><span class="special"><</span> 3885 <span class="identifier">int_token</span><span class="special">,</span> 3886 <span class="identifier">transform</span><span class="special"><</span> 3887 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>>,</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"><</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"><</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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 3893 <span class="special">></span> 3894 <span class="special">>::</span><span class="identifier">type</span> 3895 <span class="special">></span> 3896 <span class="special">>,</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"><</span><span class="identifier">sum_vector</span><span class="special">></span> <span class="comment">/* summarise the vector of numbers */</span> 3898 <span class="special">></span> 3899 <span class="special">>;</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"><</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">></span> 3905<span class="preprocessor">#include</span> <span class="special"><</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">></span> 3906 3907<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</span> 3912<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>;</span> 3915<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>>;</span> 3918<span class="preprocessor">#include</span> <span class="special"><</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">></span> 3919 3920<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>>;</span> 3923 3924<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>>;</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"><</span><span class="identifier">sequence</span><span class="special"><</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">>>;</span> 3931<span class="preprocessor">#include</span> <span class="special"><</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">></span> 3932 3933<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 3934 3935<span class="preprocessor">#include</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</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 3936 3937<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">></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"><</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"><</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">0</span><span class="special">>::</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"><</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">2</span><span class="special">>::</span><span class="identifier">type</span> 3942 <span class="special">></span> <span class="special">{};</span> 3943 3944<span class="preprocessor">#include</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">quote</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></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"><</span> 3948 <span class="identifier">transform</span><span class="special"><</span> 3949 <span class="identifier">sequence</span><span class="special"><</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">>,</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"><</span><span class="identifier">eval_plus</span><span class="special">></span> 3951 <span class="special">></span> 3952 <span class="special">>;</span> 3953<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 3957 <span class="identifier">sequence</span><span class="special"><</span> 3958 <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* The first <number> */</span> 3959 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>></span> <span class="comment">/* The "+ <number>" elements */</span> 3960 <span class="special">></span> 3961 <span class="special">>;</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"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 + 3 + 4"</span><span class="special">)>::</span><span class="identifier">type</span><span class="special">;</span> 3963<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></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"><</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"><</span><span class="number">2</span><span class="special">>,</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"><</span><span class="number">5</span><span class="special">>,</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"><</span><span class="number">6</span><span class="special">></span> 3970 <span class="special">>;</span> 3971 3972<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">></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"><</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"><</span><span class="number">0</span><span class="special">>,</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"><</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"><</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">></span> 3979 <span class="special">>::</span><span class="identifier">type</span> 3980 <span class="special">></span> 3981 <span class="special">{};</span> 3982 3983<span class="keyword">template</span> <span class="special"><</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">></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"><</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">>::</span><span class="identifier">type</span> 3988 <span class="special">></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"><</span> 3992 <span class="identifier">sequence</span><span class="special"><</span> 3993 <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* parse the first <number> */</span> 3994 <span class="identifier">transform</span><span class="special"><</span> 3995 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>>,</span> <span class="comment">/* parse the "+ <number>" elements */</span> 3996 <span class="comment">/* lambda expression summarising the "+ <number>" 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"><</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"><</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<...> 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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 4004 <span class="special">></span> 4005 <span class="special">>::</span><span class="identifier">type</span> 4006 <span class="special">></span> 4007 <span class="special">></span> 4008 <span class="special">>;</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"><</span> 4012 <span class="identifier">transform</span><span class="special"><</span> 4013 <span class="comment">/* What we had so far */</span> 4014 <span class="identifier">sequence</span><span class="special"><</span> 4015 <span class="identifier">int_token</span><span class="special">,</span> 4016 <span class="identifier">transform</span><span class="special"><</span> 4017 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>>,</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"><</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"><</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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 4023 <span class="special">></span> 4024 <span class="special">>::</span><span class="identifier">type</span> 4025 <span class="special">></span> 4026 <span class="special">>,</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"><</span><span class="identifier">sum_vector</span><span class="special">></span> <span class="comment">/* summarise the vector of numbers */</span> 4028 <span class="special">></span> 4029 <span class="special">>;</span> 4030<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 4034 <span class="identifier">transform</span><span class="special"><</span> 4035 <span class="identifier">sequence</span><span class="special"><</span> 4036 <span class="identifier">int_token</span><span class="special">,</span> 4037 <span class="identifier">foldl</span><span class="special"><</span> 4038 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 4041 <span class="special">></span> 4042 <span class="special">>,</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"><</span><span class="identifier">sum_vector</span><span class="special">>></span> 4044 <span class="special">>;</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"><</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">></span> 4050<span class="preprocessor">#include</span> <span class="special"><</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">></span> 4051 4052<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</span> 4057<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>;</span> 4060<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>>;</span> 4063<span class="preprocessor">#include</span> <span class="special"><</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">></span> 4064 4065<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>>;</span> 4068 4069<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>>;</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"><</span><span class="identifier">sequence</span><span class="special"><</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">>>;</span> 4076<span class="preprocessor">#include</span> <span class="special"><</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">></span> 4077 4078<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 4079 4080<span class="preprocessor">#include</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</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 4081 4082<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">></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"><</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"><</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">0</span><span class="special">>::</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"><</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">2</span><span class="special">>::</span><span class="identifier">type</span> 4087 <span class="special">></span> <span class="special">{};</span> 4088 4089<span class="preprocessor">#include</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">quote</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></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"><</span> 4093 <span class="identifier">transform</span><span class="special"><</span> 4094 <span class="identifier">sequence</span><span class="special"><</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">>,</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"><</span><span class="identifier">eval_plus</span><span class="special">></span> 4096 <span class="special">></span> 4097 <span class="special">>;</span> 4098<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 4102 <span class="identifier">sequence</span><span class="special"><</span> 4103 <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* The first <number> */</span> 4104 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>></span> <span class="comment">/* The "+ <number>" elements */</span> 4105 <span class="special">></span> 4106 <span class="special">>;</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"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 + 3 + 4"</span><span class="special">)>::</span><span class="identifier">type</span><span class="special">;</span> 4108<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></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"><</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"><</span><span class="number">2</span><span class="special">>,</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"><</span><span class="number">5</span><span class="special">>,</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"><</span><span class="number">6</span><span class="special">></span> 4115 <span class="special">>;</span> 4116 4117<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">></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"><</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"><</span><span class="number">0</span><span class="special">>,</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"><</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"><</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">></span> 4124 <span class="special">>::</span><span class="identifier">type</span> 4125 <span class="special">></span> 4126 <span class="special">{};</span> 4127 4128<span class="keyword">template</span> <span class="special"><</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">></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"><</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">>::</span><span class="identifier">type</span> 4133 <span class="special">></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"><</span> 4137 <span class="identifier">sequence</span><span class="special"><</span> 4138 <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* parse the first <number> */</span> 4139 <span class="identifier">transform</span><span class="special"><</span> 4140 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>>,</span> <span class="comment">/* parse the "+ <number>" elements */</span> 4141 <span class="comment">/* lambda expression summarising the "+ <number>" 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"><</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"><</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<...> 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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 4149 <span class="special">></span> 4150 <span class="special">>::</span><span class="identifier">type</span> 4151 <span class="special">></span> 4152 <span class="special">></span> 4153 <span class="special">>;</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"><</span> 4157 <span class="identifier">transform</span><span class="special"><</span> 4158 <span class="comment">/* What we had so far */</span> 4159 <span class="identifier">sequence</span><span class="special"><</span> 4160 <span class="identifier">int_token</span><span class="special">,</span> 4161 <span class="identifier">transform</span><span class="special"><</span> 4162 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>>,</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"><</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"><</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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 4168 <span class="special">></span> 4169 <span class="special">>::</span><span class="identifier">type</span> 4170 <span class="special">></span> 4171 <span class="special">>,</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"><</span><span class="identifier">sum_vector</span><span class="special">></span> <span class="comment">/* summarise the vector of numbers */</span> 4173 <span class="special">></span> 4174 <span class="special">>;</span> 4175<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 4179 <span class="identifier">transform</span><span class="special"><</span> 4180 <span class="identifier">sequence</span><span class="special"><</span> 4181 <span class="identifier">int_token</span><span class="special">,</span> 4182 <span class="identifier">foldl</span><span class="special"><</span> 4183 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 4186 <span class="special">></span> 4187 <span class="special">>,</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"><</span><span class="identifier">sum_vector</span><span class="special">>></span> 4189 <span class="special">>;</span> 4190<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 4194 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 4195 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> <span class="comment">/* use this function to add a new value to the summary */</span> 4198 <span class="special">></span> 4199 <span class="special">>;</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"><</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">></span> 4205<span class="preprocessor">#include</span> <span class="special"><</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">></span> 4206 4207<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</span> 4212<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>;</span> 4215<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>>;</span> 4218<span class="preprocessor">#include</span> <span class="special"><</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">></span> 4219 4220<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>>;</span> 4223 4224<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>>;</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"><</span><span class="identifier">sequence</span><span class="special"><</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">>>;</span> 4231<span class="preprocessor">#include</span> <span class="special"><</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">></span> 4232 4233<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 4234 4235<span class="preprocessor">#include</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</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 4236 4237<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">></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"><</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"><</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">0</span><span class="special">>::</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"><</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">2</span><span class="special">>::</span><span class="identifier">type</span> 4242 <span class="special">></span> <span class="special">{};</span> 4243 4244<span class="preprocessor">#include</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">quote</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></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"><</span> 4248 <span class="identifier">transform</span><span class="special"><</span> 4249 <span class="identifier">sequence</span><span class="special"><</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">>,</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"><</span><span class="identifier">eval_plus</span><span class="special">></span> 4251 <span class="special">></span> 4252 <span class="special">>;</span> 4253<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 4257 <span class="identifier">sequence</span><span class="special"><</span> 4258 <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* The first <number> */</span> 4259 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>></span> <span class="comment">/* The "+ <number>" elements */</span> 4260 <span class="special">></span> 4261 <span class="special">>;</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"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 + 3 + 4"</span><span class="special">)>::</span><span class="identifier">type</span><span class="special">;</span> 4263<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></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"><</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"><</span><span class="number">2</span><span class="special">>,</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"><</span><span class="number">5</span><span class="special">>,</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"><</span><span class="number">6</span><span class="special">></span> 4270 <span class="special">>;</span> 4271 4272<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">></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"><</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"><</span><span class="number">0</span><span class="special">>,</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"><</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"><</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">></span> 4279 <span class="special">>::</span><span class="identifier">type</span> 4280 <span class="special">></span> 4281 <span class="special">{};</span> 4282 4283<span class="keyword">template</span> <span class="special"><</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">></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"><</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">>::</span><span class="identifier">type</span> 4288 <span class="special">></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"><</span> 4292 <span class="identifier">sequence</span><span class="special"><</span> 4293 <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* parse the first <number> */</span> 4294 <span class="identifier">transform</span><span class="special"><</span> 4295 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>>,</span> <span class="comment">/* parse the "+ <number>" elements */</span> 4296 <span class="comment">/* lambda expression summarising the "+ <number>" 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"><</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"><</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<...> 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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 4304 <span class="special">></span> 4305 <span class="special">>::</span><span class="identifier">type</span> 4306 <span class="special">></span> 4307 <span class="special">></span> 4308 <span class="special">>;</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"><</span> 4312 <span class="identifier">transform</span><span class="special"><</span> 4313 <span class="comment">/* What we had so far */</span> 4314 <span class="identifier">sequence</span><span class="special"><</span> 4315 <span class="identifier">int_token</span><span class="special">,</span> 4316 <span class="identifier">transform</span><span class="special"><</span> 4317 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>>,</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"><</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"><</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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 4323 <span class="special">></span> 4324 <span class="special">>::</span><span class="identifier">type</span> 4325 <span class="special">></span> 4326 <span class="special">>,</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"><</span><span class="identifier">sum_vector</span><span class="special">></span> <span class="comment">/* summarise the vector of numbers */</span> 4328 <span class="special">></span> 4329 <span class="special">>;</span> 4330<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 4334 <span class="identifier">transform</span><span class="special"><</span> 4335 <span class="identifier">sequence</span><span class="special"><</span> 4336 <span class="identifier">int_token</span><span class="special">,</span> 4337 <span class="identifier">foldl</span><span class="special"><</span> 4338 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 4341 <span class="special">></span> 4342 <span class="special">>,</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"><</span><span class="identifier">sum_vector</span><span class="special">>></span> 4344 <span class="special">>;</span> 4345<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 4349 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 4350 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> <span class="comment">/* use this function to add a new value to the summary */</span> 4353 <span class="special">></span> 4354 <span class="special">>;</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"><</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">></span> 4360<span class="preprocessor">#include</span> <span class="special"><</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">></span> 4361 4362<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</span> 4367<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>;</span> 4370<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>>;</span> 4373<span class="preprocessor">#include</span> <span class="special"><</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">></span> 4374 4375<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>>;</span> 4378 4379<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>>;</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"><</span><span class="identifier">sequence</span><span class="special"><</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">>>;</span> 4386<span class="preprocessor">#include</span> <span class="special"><</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">></span> 4387 4388<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 4389 4390<span class="preprocessor">#include</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</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 4391 4392<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">></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"><</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"><</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">0</span><span class="special">>::</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"><</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">2</span><span class="special">>::</span><span class="identifier">type</span> 4397 <span class="special">></span> <span class="special">{};</span> 4398 4399<span class="preprocessor">#include</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">quote</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></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"><</span> 4403 <span class="identifier">transform</span><span class="special"><</span> 4404 <span class="identifier">sequence</span><span class="special"><</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">>,</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"><</span><span class="identifier">eval_plus</span><span class="special">></span> 4406 <span class="special">></span> 4407 <span class="special">>;</span> 4408<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 4412 <span class="identifier">sequence</span><span class="special"><</span> 4413 <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* The first <number> */</span> 4414 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>></span> <span class="comment">/* The "+ <number>" elements */</span> 4415 <span class="special">></span> 4416 <span class="special">>;</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"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 + 3 + 4"</span><span class="special">)>::</span><span class="identifier">type</span><span class="special">;</span> 4418<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></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"><</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"><</span><span class="number">2</span><span class="special">>,</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"><</span><span class="number">5</span><span class="special">>,</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"><</span><span class="number">6</span><span class="special">></span> 4425 <span class="special">>;</span> 4426 4427<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">></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"><</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"><</span><span class="number">0</span><span class="special">>,</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"><</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"><</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">></span> 4434 <span class="special">>::</span><span class="identifier">type</span> 4435 <span class="special">></span> 4436 <span class="special">{};</span> 4437 4438<span class="keyword">template</span> <span class="special"><</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">></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"><</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">>::</span><span class="identifier">type</span> 4443 <span class="special">></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"><</span> 4447 <span class="identifier">sequence</span><span class="special"><</span> 4448 <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* parse the first <number> */</span> 4449 <span class="identifier">transform</span><span class="special"><</span> 4450 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>>,</span> <span class="comment">/* parse the "+ <number>" elements */</span> 4451 <span class="comment">/* lambda expression summarising the "+ <number>" 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"><</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"><</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<...> 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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 4459 <span class="special">></span> 4460 <span class="special">>::</span><span class="identifier">type</span> 4461 <span class="special">></span> 4462 <span class="special">></span> 4463 <span class="special">>;</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"><</span> 4467 <span class="identifier">transform</span><span class="special"><</span> 4468 <span class="comment">/* What we had so far */</span> 4469 <span class="identifier">sequence</span><span class="special"><</span> 4470 <span class="identifier">int_token</span><span class="special">,</span> 4471 <span class="identifier">transform</span><span class="special"><</span> 4472 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>>,</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"><</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"><</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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 4478 <span class="special">></span> 4479 <span class="special">>::</span><span class="identifier">type</span> 4480 <span class="special">></span> 4481 <span class="special">>,</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"><</span><span class="identifier">sum_vector</span><span class="special">></span> <span class="comment">/* summarise the vector of numbers */</span> 4483 <span class="special">></span> 4484 <span class="special">>;</span> 4485<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 4489 <span class="identifier">transform</span><span class="special"><</span> 4490 <span class="identifier">sequence</span><span class="special"><</span> 4491 <span class="identifier">int_token</span><span class="special">,</span> 4492 <span class="identifier">foldl</span><span class="special"><</span> 4493 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 4496 <span class="special">></span> 4497 <span class="special">>,</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"><</span><span class="identifier">sum_vector</span><span class="special">>></span> 4499 <span class="special">>;</span> 4500<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 4504 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 4505 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> <span class="comment">/* use this function to add a new value to the summary */</span> 4508 <span class="special">></span> 4509 <span class="special">>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'-'</span><span class="special">>>;</span> 4511 4512<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 4516 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 4517 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 4520 <span class="special">></span> 4521 <span class="special">>;</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"><</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">></span> 4527<span class="preprocessor">#include</span> <span class="special"><</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">></span> 4528 4529<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</span> 4534<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>;</span> 4537<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>>;</span> 4540<span class="preprocessor">#include</span> <span class="special"><</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">></span> 4541 4542<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>>;</span> 4545 4546<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>>;</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"><</span><span class="identifier">sequence</span><span class="special"><</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">>>;</span> 4553<span class="preprocessor">#include</span> <span class="special"><</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">></span> 4554 4555<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 4556 4557<span class="preprocessor">#include</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</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 4558 4559<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">></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"><</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"><</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">0</span><span class="special">>::</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"><</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">2</span><span class="special">>::</span><span class="identifier">type</span> 4564 <span class="special">></span> <span class="special">{};</span> 4565 4566<span class="preprocessor">#include</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">quote</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></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"><</span> 4570 <span class="identifier">transform</span><span class="special"><</span> 4571 <span class="identifier">sequence</span><span class="special"><</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">>,</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"><</span><span class="identifier">eval_plus</span><span class="special">></span> 4573 <span class="special">></span> 4574 <span class="special">>;</span> 4575<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 4579 <span class="identifier">sequence</span><span class="special"><</span> 4580 <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* The first <number> */</span> 4581 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>></span> <span class="comment">/* The "+ <number>" elements */</span> 4582 <span class="special">></span> 4583 <span class="special">>;</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"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 + 3 + 4"</span><span class="special">)>::</span><span class="identifier">type</span><span class="special">;</span> 4585<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></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"><</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"><</span><span class="number">2</span><span class="special">>,</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"><</span><span class="number">5</span><span class="special">>,</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"><</span><span class="number">6</span><span class="special">></span> 4592 <span class="special">>;</span> 4593 4594<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">></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"><</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"><</span><span class="number">0</span><span class="special">>,</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"><</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"><</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">></span> 4601 <span class="special">>::</span><span class="identifier">type</span> 4602 <span class="special">></span> 4603 <span class="special">{};</span> 4604 4605<span class="keyword">template</span> <span class="special"><</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">></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"><</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">>::</span><span class="identifier">type</span> 4610 <span class="special">></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"><</span> 4614 <span class="identifier">sequence</span><span class="special"><</span> 4615 <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* parse the first <number> */</span> 4616 <span class="identifier">transform</span><span class="special"><</span> 4617 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>>,</span> <span class="comment">/* parse the "+ <number>" elements */</span> 4618 <span class="comment">/* lambda expression summarising the "+ <number>" 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"><</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"><</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<...> 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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 4626 <span class="special">></span> 4627 <span class="special">>::</span><span class="identifier">type</span> 4628 <span class="special">></span> 4629 <span class="special">></span> 4630 <span class="special">>;</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"><</span> 4634 <span class="identifier">transform</span><span class="special"><</span> 4635 <span class="comment">/* What we had so far */</span> 4636 <span class="identifier">sequence</span><span class="special"><</span> 4637 <span class="identifier">int_token</span><span class="special">,</span> 4638 <span class="identifier">transform</span><span class="special"><</span> 4639 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>>,</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"><</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"><</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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 4645 <span class="special">></span> 4646 <span class="special">>::</span><span class="identifier">type</span> 4647 <span class="special">></span> 4648 <span class="special">>,</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"><</span><span class="identifier">sum_vector</span><span class="special">></span> <span class="comment">/* summarise the vector of numbers */</span> 4650 <span class="special">></span> 4651 <span class="special">>;</span> 4652<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 4656 <span class="identifier">transform</span><span class="special"><</span> 4657 <span class="identifier">sequence</span><span class="special"><</span> 4658 <span class="identifier">int_token</span><span class="special">,</span> 4659 <span class="identifier">foldl</span><span class="special"><</span> 4660 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 4663 <span class="special">></span> 4664 <span class="special">>,</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"><</span><span class="identifier">sum_vector</span><span class="special">>></span> 4666 <span class="special">>;</span> 4667<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 4671 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 4672 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> <span class="comment">/* use this function to add a new value to the summary */</span> 4675 <span class="special">></span> 4676 <span class="special">>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'-'</span><span class="special">>>;</span> 4678 4679<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 4683 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 4684 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 4687 <span class="special">></span> 4688 <span class="special">>;</span> 4689<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 4690 4691<span class="keyword">template</span> <span class="special"><</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">></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"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</span><span class="identifier">type</span> <span class="special">{};</span> 4694 4695<span class="keyword">template</span> <span class="special"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</span><span class="identifier">type</span> <span class="special">{};</span> 4696 4697<span class="keyword">template</span> <span class="special"><</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">></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"><</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">>::</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">>::</span><span class="identifier">type</span> 4703 <span class="special">></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"><</span> 4708 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 4709 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 4712 <span class="special">></span> 4713 <span class="special">>;</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"><</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">></span> 4719<span class="preprocessor">#include</span> <span class="special"><</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">></span> 4720 4721<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</span> 4726<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>;</span> 4729<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>>;</span> 4732<span class="preprocessor">#include</span> <span class="special"><</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">></span> 4733 4734<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>>;</span> 4737 4738<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>>;</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"><</span><span class="identifier">sequence</span><span class="special"><</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">>>;</span> 4745<span class="preprocessor">#include</span> <span class="special"><</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">></span> 4746 4747<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 4748 4749<span class="preprocessor">#include</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</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 4750 4751<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">></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"><</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"><</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">0</span><span class="special">>::</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"><</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">2</span><span class="special">>::</span><span class="identifier">type</span> 4756 <span class="special">></span> <span class="special">{};</span> 4757 4758<span class="preprocessor">#include</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">quote</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></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"><</span> 4762 <span class="identifier">transform</span><span class="special"><</span> 4763 <span class="identifier">sequence</span><span class="special"><</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">>,</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"><</span><span class="identifier">eval_plus</span><span class="special">></span> 4765 <span class="special">></span> 4766 <span class="special">>;</span> 4767<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 4771 <span class="identifier">sequence</span><span class="special"><</span> 4772 <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* The first <number> */</span> 4773 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>></span> <span class="comment">/* The "+ <number>" elements */</span> 4774 <span class="special">></span> 4775 <span class="special">>;</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"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 + 3 + 4"</span><span class="special">)>::</span><span class="identifier">type</span><span class="special">;</span> 4777<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></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"><</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"><</span><span class="number">2</span><span class="special">>,</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"><</span><span class="number">5</span><span class="special">>,</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"><</span><span class="number">6</span><span class="special">></span> 4784 <span class="special">>;</span> 4785 4786<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">></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"><</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"><</span><span class="number">0</span><span class="special">>,</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"><</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"><</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">></span> 4793 <span class="special">>::</span><span class="identifier">type</span> 4794 <span class="special">></span> 4795 <span class="special">{};</span> 4796 4797<span class="keyword">template</span> <span class="special"><</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">></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"><</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">>::</span><span class="identifier">type</span> 4802 <span class="special">></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"><</span> 4806 <span class="identifier">sequence</span><span class="special"><</span> 4807 <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* parse the first <number> */</span> 4808 <span class="identifier">transform</span><span class="special"><</span> 4809 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>>,</span> <span class="comment">/* parse the "+ <number>" elements */</span> 4810 <span class="comment">/* lambda expression summarising the "+ <number>" 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"><</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"><</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<...> 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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 4818 <span class="special">></span> 4819 <span class="special">>::</span><span class="identifier">type</span> 4820 <span class="special">></span> 4821 <span class="special">></span> 4822 <span class="special">>;</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"><</span> 4826 <span class="identifier">transform</span><span class="special"><</span> 4827 <span class="comment">/* What we had so far */</span> 4828 <span class="identifier">sequence</span><span class="special"><</span> 4829 <span class="identifier">int_token</span><span class="special">,</span> 4830 <span class="identifier">transform</span><span class="special"><</span> 4831 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>>,</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"><</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"><</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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 4837 <span class="special">></span> 4838 <span class="special">>::</span><span class="identifier">type</span> 4839 <span class="special">></span> 4840 <span class="special">>,</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"><</span><span class="identifier">sum_vector</span><span class="special">></span> <span class="comment">/* summarise the vector of numbers */</span> 4842 <span class="special">></span> 4843 <span class="special">>;</span> 4844<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 4848 <span class="identifier">transform</span><span class="special"><</span> 4849 <span class="identifier">sequence</span><span class="special"><</span> 4850 <span class="identifier">int_token</span><span class="special">,</span> 4851 <span class="identifier">foldl</span><span class="special"><</span> 4852 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 4855 <span class="special">></span> 4856 <span class="special">>,</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"><</span><span class="identifier">sum_vector</span><span class="special">>></span> 4858 <span class="special">>;</span> 4859<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 4863 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 4864 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> <span class="comment">/* use this function to add a new value to the summary */</span> 4867 <span class="special">></span> 4868 <span class="special">>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'-'</span><span class="special">>>;</span> 4870 4871<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 4875 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 4876 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 4879 <span class="special">></span> 4880 <span class="special">>;</span> 4881<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 4882 4883<span class="keyword">template</span> <span class="special"><</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">></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"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</span><span class="identifier">type</span> <span class="special">{};</span> 4886 4887<span class="keyword">template</span> <span class="special"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</span><span class="identifier">type</span> <span class="special">{};</span> 4888 4889<span class="keyword">template</span> <span class="special"><</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">></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"><</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">>::</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">>::</span><span class="identifier">type</span> 4895 <span class="special">></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"><</span> 4900 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 4901 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 4904 <span class="special">></span> 4905 <span class="special">>;</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"><</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">></span> 4911<span class="preprocessor">#include</span> <span class="special"><</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">></span> 4912 4913<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</span> 4918<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>;</span> 4921<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>>;</span> 4924<span class="preprocessor">#include</span> <span class="special"><</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">></span> 4925 4926<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>>;</span> 4929 4930<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>>;</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"><</span><span class="identifier">sequence</span><span class="special"><</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">>>;</span> 4937<span class="preprocessor">#include</span> <span class="special"><</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">></span> 4938 4939<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 4940 4941<span class="preprocessor">#include</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</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 4942 4943<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">></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"><</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"><</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">0</span><span class="special">>::</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"><</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">2</span><span class="special">>::</span><span class="identifier">type</span> 4948 <span class="special">></span> <span class="special">{};</span> 4949 4950<span class="preprocessor">#include</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">quote</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></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"><</span> 4954 <span class="identifier">transform</span><span class="special"><</span> 4955 <span class="identifier">sequence</span><span class="special"><</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">>,</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"><</span><span class="identifier">eval_plus</span><span class="special">></span> 4957 <span class="special">></span> 4958 <span class="special">>;</span> 4959<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 4963 <span class="identifier">sequence</span><span class="special"><</span> 4964 <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* The first <number> */</span> 4965 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>></span> <span class="comment">/* The "+ <number>" elements */</span> 4966 <span class="special">></span> 4967 <span class="special">>;</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"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 + 3 + 4"</span><span class="special">)>::</span><span class="identifier">type</span><span class="special">;</span> 4969<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></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"><</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"><</span><span class="number">2</span><span class="special">>,</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"><</span><span class="number">5</span><span class="special">>,</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"><</span><span class="number">6</span><span class="special">></span> 4976 <span class="special">>;</span> 4977 4978<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">></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"><</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"><</span><span class="number">0</span><span class="special">>,</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"><</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"><</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">></span> 4985 <span class="special">>::</span><span class="identifier">type</span> 4986 <span class="special">></span> 4987 <span class="special">{};</span> 4988 4989<span class="keyword">template</span> <span class="special"><</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">></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"><</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">>::</span><span class="identifier">type</span> 4994 <span class="special">></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"><</span> 4998 <span class="identifier">sequence</span><span class="special"><</span> 4999 <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* parse the first <number> */</span> 5000 <span class="identifier">transform</span><span class="special"><</span> 5001 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>>,</span> <span class="comment">/* parse the "+ <number>" elements */</span> 5002 <span class="comment">/* lambda expression summarising the "+ <number>" 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"><</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"><</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<...> 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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 5010 <span class="special">></span> 5011 <span class="special">>::</span><span class="identifier">type</span> 5012 <span class="special">></span> 5013 <span class="special">></span> 5014 <span class="special">>;</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"><</span> 5018 <span class="identifier">transform</span><span class="special"><</span> 5019 <span class="comment">/* What we had so far */</span> 5020 <span class="identifier">sequence</span><span class="special"><</span> 5021 <span class="identifier">int_token</span><span class="special">,</span> 5022 <span class="identifier">transform</span><span class="special"><</span> 5023 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>>,</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"><</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"><</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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 5029 <span class="special">></span> 5030 <span class="special">>::</span><span class="identifier">type</span> 5031 <span class="special">></span> 5032 <span class="special">>,</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"><</span><span class="identifier">sum_vector</span><span class="special">></span> <span class="comment">/* summarise the vector of numbers */</span> 5034 <span class="special">></span> 5035 <span class="special">>;</span> 5036<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 5040 <span class="identifier">transform</span><span class="special"><</span> 5041 <span class="identifier">sequence</span><span class="special"><</span> 5042 <span class="identifier">int_token</span><span class="special">,</span> 5043 <span class="identifier">foldl</span><span class="special"><</span> 5044 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 5047 <span class="special">></span> 5048 <span class="special">>,</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"><</span><span class="identifier">sum_vector</span><span class="special">>></span> 5050 <span class="special">>;</span> 5051<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 5055 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 5056 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> <span class="comment">/* use this function to add a new value to the summary */</span> 5059 <span class="special">></span> 5060 <span class="special">>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'-'</span><span class="special">>>;</span> 5062 5063<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 5067 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 5068 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 5071 <span class="special">></span> 5072 <span class="special">>;</span> 5073<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 5074 5075<span class="keyword">template</span> <span class="special"><</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">></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"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</span><span class="identifier">type</span> <span class="special">{};</span> 5078 5079<span class="keyword">template</span> <span class="special"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</span><span class="identifier">type</span> <span class="special">{};</span> 5080 5081<span class="keyword">template</span> <span class="special"><</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">></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"><</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">>::</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">>::</span><span class="identifier">type</span> 5087 <span class="special">></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"><</span> 5092 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 5093 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 5096 <span class="special">></span> 5097 <span class="special">>;</span> 5098<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 5099 5100<span class="keyword">template</span> <span class="special"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'*'</span><span class="special">>>;</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"><</span> 5106 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 5107 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</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">>,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 5110 <span class="special">></span> 5111 <span class="special">>;</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"><</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">></span> 5117<span class="preprocessor">#include</span> <span class="special"><</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">></span> 5118 5119<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</span> 5124<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>;</span> 5127<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>>;</span> 5130<span class="preprocessor">#include</span> <span class="special"><</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">></span> 5131 5132<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>>;</span> 5135 5136<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>>;</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"><</span><span class="identifier">sequence</span><span class="special"><</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">>>;</span> 5143<span class="preprocessor">#include</span> <span class="special"><</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">></span> 5144 5145<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 5146 5147<span class="preprocessor">#include</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</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 5148 5149<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">></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"><</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"><</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">0</span><span class="special">>::</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"><</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">2</span><span class="special">>::</span><span class="identifier">type</span> 5154 <span class="special">></span> <span class="special">{};</span> 5155 5156<span class="preprocessor">#include</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">quote</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></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"><</span> 5160 <span class="identifier">transform</span><span class="special"><</span> 5161 <span class="identifier">sequence</span><span class="special"><</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">>,</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"><</span><span class="identifier">eval_plus</span><span class="special">></span> 5163 <span class="special">></span> 5164 <span class="special">>;</span> 5165<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 5169 <span class="identifier">sequence</span><span class="special"><</span> 5170 <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* The first <number> */</span> 5171 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>></span> <span class="comment">/* The "+ <number>" elements */</span> 5172 <span class="special">></span> 5173 <span class="special">>;</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"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 + 3 + 4"</span><span class="special">)>::</span><span class="identifier">type</span><span class="special">;</span> 5175<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></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"><</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"><</span><span class="number">2</span><span class="special">>,</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"><</span><span class="number">5</span><span class="special">>,</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"><</span><span class="number">6</span><span class="special">></span> 5182 <span class="special">>;</span> 5183 5184<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">></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"><</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"><</span><span class="number">0</span><span class="special">>,</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"><</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"><</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">></span> 5191 <span class="special">>::</span><span class="identifier">type</span> 5192 <span class="special">></span> 5193 <span class="special">{};</span> 5194 5195<span class="keyword">template</span> <span class="special"><</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">></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"><</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">>::</span><span class="identifier">type</span> 5200 <span class="special">></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"><</span> 5204 <span class="identifier">sequence</span><span class="special"><</span> 5205 <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* parse the first <number> */</span> 5206 <span class="identifier">transform</span><span class="special"><</span> 5207 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>>,</span> <span class="comment">/* parse the "+ <number>" elements */</span> 5208 <span class="comment">/* lambda expression summarising the "+ <number>" 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"><</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"><</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<...> 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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 5216 <span class="special">></span> 5217 <span class="special">>::</span><span class="identifier">type</span> 5218 <span class="special">></span> 5219 <span class="special">></span> 5220 <span class="special">>;</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"><</span> 5224 <span class="identifier">transform</span><span class="special"><</span> 5225 <span class="comment">/* What we had so far */</span> 5226 <span class="identifier">sequence</span><span class="special"><</span> 5227 <span class="identifier">int_token</span><span class="special">,</span> 5228 <span class="identifier">transform</span><span class="special"><</span> 5229 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>>,</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"><</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"><</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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 5235 <span class="special">></span> 5236 <span class="special">>::</span><span class="identifier">type</span> 5237 <span class="special">></span> 5238 <span class="special">>,</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"><</span><span class="identifier">sum_vector</span><span class="special">></span> <span class="comment">/* summarise the vector of numbers */</span> 5240 <span class="special">></span> 5241 <span class="special">>;</span> 5242<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 5246 <span class="identifier">transform</span><span class="special"><</span> 5247 <span class="identifier">sequence</span><span class="special"><</span> 5248 <span class="identifier">int_token</span><span class="special">,</span> 5249 <span class="identifier">foldl</span><span class="special"><</span> 5250 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 5253 <span class="special">></span> 5254 <span class="special">>,</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"><</span><span class="identifier">sum_vector</span><span class="special">>></span> 5256 <span class="special">>;</span> 5257<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 5261 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 5262 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> <span class="comment">/* use this function to add a new value to the summary */</span> 5265 <span class="special">></span> 5266 <span class="special">>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'-'</span><span class="special">>>;</span> 5268 5269<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 5273 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 5274 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 5277 <span class="special">></span> 5278 <span class="special">>;</span> 5279<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 5280 5281<span class="keyword">template</span> <span class="special"><</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">></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"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</span><span class="identifier">type</span> <span class="special">{};</span> 5284 5285<span class="keyword">template</span> <span class="special"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</span><span class="identifier">type</span> <span class="special">{};</span> 5286 5287<span class="keyword">template</span> <span class="special"><</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">></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"><</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">>::</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">>::</span><span class="identifier">type</span> 5293 <span class="special">></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"><</span> 5298 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 5299 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 5302 <span class="special">></span> 5303 <span class="special">>;</span> 5304<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 5305 5306<span class="keyword">template</span> <span class="special"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'*'</span><span class="special">>>;</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"><</span> 5312 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 5313 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</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">>,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 5316 <span class="special">></span> 5317 <span class="special">>;</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"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">int_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">quote2</span><span class="special"><</span><span class="identifier">binary_op</span><span class="special">>>;</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"><</span> 5322 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 5323 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp1</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 5326 <span class="special">></span> 5327 <span class="special">>;</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"><</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">></span> 5333<span class="preprocessor">#include</span> <span class="special"><</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">></span> 5334 5335<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</span> 5340<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>;</span> 5343<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>>;</span> 5346<span class="preprocessor">#include</span> <span class="special"><</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">></span> 5347 5348<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>>;</span> 5351 5352<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>>;</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"><</span><span class="identifier">sequence</span><span class="special"><</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">>>;</span> 5359<span class="preprocessor">#include</span> <span class="special"><</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">></span> 5360 5361<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 5362 5363<span class="preprocessor">#include</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</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 5364 5365<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">></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"><</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"><</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">0</span><span class="special">>::</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"><</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">2</span><span class="special">>::</span><span class="identifier">type</span> 5370 <span class="special">></span> <span class="special">{};</span> 5371 5372<span class="preprocessor">#include</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">quote</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></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"><</span> 5376 <span class="identifier">transform</span><span class="special"><</span> 5377 <span class="identifier">sequence</span><span class="special"><</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">>,</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"><</span><span class="identifier">eval_plus</span><span class="special">></span> 5379 <span class="special">></span> 5380 <span class="special">>;</span> 5381<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 5385 <span class="identifier">sequence</span><span class="special"><</span> 5386 <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* The first <number> */</span> 5387 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>></span> <span class="comment">/* The "+ <number>" elements */</span> 5388 <span class="special">></span> 5389 <span class="special">>;</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"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 + 3 + 4"</span><span class="special">)>::</span><span class="identifier">type</span><span class="special">;</span> 5391<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></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"><</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"><</span><span class="number">2</span><span class="special">>,</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"><</span><span class="number">5</span><span class="special">>,</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"><</span><span class="number">6</span><span class="special">></span> 5398 <span class="special">>;</span> 5399 5400<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">></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"><</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"><</span><span class="number">0</span><span class="special">>,</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"><</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"><</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">></span> 5407 <span class="special">>::</span><span class="identifier">type</span> 5408 <span class="special">></span> 5409 <span class="special">{};</span> 5410 5411<span class="keyword">template</span> <span class="special"><</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">></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"><</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">>::</span><span class="identifier">type</span> 5416 <span class="special">></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"><</span> 5420 <span class="identifier">sequence</span><span class="special"><</span> 5421 <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* parse the first <number> */</span> 5422 <span class="identifier">transform</span><span class="special"><</span> 5423 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>>,</span> <span class="comment">/* parse the "+ <number>" elements */</span> 5424 <span class="comment">/* lambda expression summarising the "+ <number>" 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"><</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"><</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<...> 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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 5432 <span class="special">></span> 5433 <span class="special">>::</span><span class="identifier">type</span> 5434 <span class="special">></span> 5435 <span class="special">></span> 5436 <span class="special">>;</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"><</span> 5440 <span class="identifier">transform</span><span class="special"><</span> 5441 <span class="comment">/* What we had so far */</span> 5442 <span class="identifier">sequence</span><span class="special"><</span> 5443 <span class="identifier">int_token</span><span class="special">,</span> 5444 <span class="identifier">transform</span><span class="special"><</span> 5445 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>>,</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"><</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"><</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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 5451 <span class="special">></span> 5452 <span class="special">>::</span><span class="identifier">type</span> 5453 <span class="special">></span> 5454 <span class="special">>,</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"><</span><span class="identifier">sum_vector</span><span class="special">></span> <span class="comment">/* summarise the vector of numbers */</span> 5456 <span class="special">></span> 5457 <span class="special">>;</span> 5458<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 5462 <span class="identifier">transform</span><span class="special"><</span> 5463 <span class="identifier">sequence</span><span class="special"><</span> 5464 <span class="identifier">int_token</span><span class="special">,</span> 5465 <span class="identifier">foldl</span><span class="special"><</span> 5466 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 5469 <span class="special">></span> 5470 <span class="special">>,</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"><</span><span class="identifier">sum_vector</span><span class="special">>></span> 5472 <span class="special">>;</span> 5473<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 5477 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 5478 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> <span class="comment">/* use this function to add a new value to the summary */</span> 5481 <span class="special">></span> 5482 <span class="special">>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'-'</span><span class="special">>>;</span> 5484 5485<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 5489 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 5490 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 5493 <span class="special">></span> 5494 <span class="special">>;</span> 5495<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 5496 5497<span class="keyword">template</span> <span class="special"><</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">></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"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</span><span class="identifier">type</span> <span class="special">{};</span> 5500 5501<span class="keyword">template</span> <span class="special"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</span><span class="identifier">type</span> <span class="special">{};</span> 5502 5503<span class="keyword">template</span> <span class="special"><</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">></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"><</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">>::</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">>::</span><span class="identifier">type</span> 5509 <span class="special">></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"><</span> 5514 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 5515 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 5518 <span class="special">></span> 5519 <span class="special">>;</span> 5520<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 5521 5522<span class="keyword">template</span> <span class="special"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'*'</span><span class="special">>>;</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"><</span> 5528 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 5529 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</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">>,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 5532 <span class="special">></span> 5533 <span class="special">>;</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"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">int_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">quote2</span><span class="special"><</span><span class="identifier">binary_op</span><span class="special">>>;</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"><</span> 5538 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 5539 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp1</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 5542 <span class="special">></span> 5543 <span class="special">>;</span> 5544<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 5545 5546<span class="keyword">template</span> <span class="special"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'/'</span><span class="special">>>;</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"><</span> 5552 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">>,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 5555 <span class="special">>;</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"><</span> 5559 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 5560 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp2</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 5563 <span class="special">></span> 5564 <span class="special">>;</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"><</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">></span> 5570<span class="preprocessor">#include</span> <span class="special"><</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">></span> 5571 5572<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</span> 5577<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>;</span> 5580<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>>;</span> 5583<span class="preprocessor">#include</span> <span class="special"><</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">></span> 5584 5585<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>>;</span> 5588 5589<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>>;</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"><</span><span class="identifier">sequence</span><span class="special"><</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">>>;</span> 5596<span class="preprocessor">#include</span> <span class="special"><</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">></span> 5597 5598<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 5599 5600<span class="preprocessor">#include</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</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 5601 5602<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">></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"><</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"><</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">0</span><span class="special">>::</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"><</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">2</span><span class="special">>::</span><span class="identifier">type</span> 5607 <span class="special">></span> <span class="special">{};</span> 5608 5609<span class="preprocessor">#include</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">quote</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></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"><</span> 5613 <span class="identifier">transform</span><span class="special"><</span> 5614 <span class="identifier">sequence</span><span class="special"><</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">>,</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"><</span><span class="identifier">eval_plus</span><span class="special">></span> 5616 <span class="special">></span> 5617 <span class="special">>;</span> 5618<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 5622 <span class="identifier">sequence</span><span class="special"><</span> 5623 <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* The first <number> */</span> 5624 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>></span> <span class="comment">/* The "+ <number>" elements */</span> 5625 <span class="special">></span> 5626 <span class="special">>;</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"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 + 3 + 4"</span><span class="special">)>::</span><span class="identifier">type</span><span class="special">;</span> 5628<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></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"><</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"><</span><span class="number">2</span><span class="special">>,</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"><</span><span class="number">5</span><span class="special">>,</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"><</span><span class="number">6</span><span class="special">></span> 5635 <span class="special">>;</span> 5636 5637<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">></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"><</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"><</span><span class="number">0</span><span class="special">>,</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"><</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"><</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">></span> 5644 <span class="special">>::</span><span class="identifier">type</span> 5645 <span class="special">></span> 5646 <span class="special">{};</span> 5647 5648<span class="keyword">template</span> <span class="special"><</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">></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"><</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">>::</span><span class="identifier">type</span> 5653 <span class="special">></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"><</span> 5657 <span class="identifier">sequence</span><span class="special"><</span> 5658 <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* parse the first <number> */</span> 5659 <span class="identifier">transform</span><span class="special"><</span> 5660 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>>,</span> <span class="comment">/* parse the "+ <number>" elements */</span> 5661 <span class="comment">/* lambda expression summarising the "+ <number>" 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"><</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"><</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<...> 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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 5669 <span class="special">></span> 5670 <span class="special">>::</span><span class="identifier">type</span> 5671 <span class="special">></span> 5672 <span class="special">></span> 5673 <span class="special">>;</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"><</span> 5677 <span class="identifier">transform</span><span class="special"><</span> 5678 <span class="comment">/* What we had so far */</span> 5679 <span class="identifier">sequence</span><span class="special"><</span> 5680 <span class="identifier">int_token</span><span class="special">,</span> 5681 <span class="identifier">transform</span><span class="special"><</span> 5682 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>>,</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"><</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"><</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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 5688 <span class="special">></span> 5689 <span class="special">>::</span><span class="identifier">type</span> 5690 <span class="special">></span> 5691 <span class="special">>,</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"><</span><span class="identifier">sum_vector</span><span class="special">></span> <span class="comment">/* summarise the vector of numbers */</span> 5693 <span class="special">></span> 5694 <span class="special">>;</span> 5695<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 5699 <span class="identifier">transform</span><span class="special"><</span> 5700 <span class="identifier">sequence</span><span class="special"><</span> 5701 <span class="identifier">int_token</span><span class="special">,</span> 5702 <span class="identifier">foldl</span><span class="special"><</span> 5703 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 5706 <span class="special">></span> 5707 <span class="special">>,</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"><</span><span class="identifier">sum_vector</span><span class="special">>></span> 5709 <span class="special">>;</span> 5710<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 5714 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 5715 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> <span class="comment">/* use this function to add a new value to the summary */</span> 5718 <span class="special">></span> 5719 <span class="special">>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'-'</span><span class="special">>>;</span> 5721 5722<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 5726 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 5727 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 5730 <span class="special">></span> 5731 <span class="special">>;</span> 5732<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 5733 5734<span class="keyword">template</span> <span class="special"><</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">></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"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</span><span class="identifier">type</span> <span class="special">{};</span> 5737 5738<span class="keyword">template</span> <span class="special"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</span><span class="identifier">type</span> <span class="special">{};</span> 5739 5740<span class="keyword">template</span> <span class="special"><</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">></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"><</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">>::</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">>::</span><span class="identifier">type</span> 5746 <span class="special">></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"><</span> 5751 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 5752 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 5755 <span class="special">></span> 5756 <span class="special">>;</span> 5757<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 5758 5759<span class="keyword">template</span> <span class="special"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'*'</span><span class="special">>>;</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"><</span> 5765 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 5766 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</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">>,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 5769 <span class="special">></span> 5770 <span class="special">>;</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"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">int_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">quote2</span><span class="special"><</span><span class="identifier">binary_op</span><span class="special">>>;</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"><</span> 5775 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 5776 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp1</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 5779 <span class="special">></span> 5780 <span class="special">>;</span> 5781<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 5782 5783<span class="keyword">template</span> <span class="special"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'/'</span><span class="special">>>;</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"><</span> 5789 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">>,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 5792 <span class="special">>;</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"><</span> 5796 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 5797 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp2</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 5800 <span class="special">></span> 5801 <span class="special">>;</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"><</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">></span> 5807<span class="preprocessor">#include</span> <span class="special"><</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">></span> 5808 5809<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</span> 5814<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>;</span> 5817<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>>;</span> 5820<span class="preprocessor">#include</span> <span class="special"><</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">></span> 5821 5822<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>>;</span> 5825 5826<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>>;</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"><</span><span class="identifier">sequence</span><span class="special"><</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">>>;</span> 5833<span class="preprocessor">#include</span> <span class="special"><</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">></span> 5834 5835<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 5836 5837<span class="preprocessor">#include</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</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 5838 5839<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">></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"><</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"><</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">0</span><span class="special">>::</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"><</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">2</span><span class="special">>::</span><span class="identifier">type</span> 5844 <span class="special">></span> <span class="special">{};</span> 5845 5846<span class="preprocessor">#include</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">quote</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></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"><</span> 5850 <span class="identifier">transform</span><span class="special"><</span> 5851 <span class="identifier">sequence</span><span class="special"><</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">>,</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"><</span><span class="identifier">eval_plus</span><span class="special">></span> 5853 <span class="special">></span> 5854 <span class="special">>;</span> 5855<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 5859 <span class="identifier">sequence</span><span class="special"><</span> 5860 <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* The first <number> */</span> 5861 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>></span> <span class="comment">/* The "+ <number>" elements */</span> 5862 <span class="special">></span> 5863 <span class="special">>;</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"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 + 3 + 4"</span><span class="special">)>::</span><span class="identifier">type</span><span class="special">;</span> 5865<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></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"><</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"><</span><span class="number">2</span><span class="special">>,</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"><</span><span class="number">5</span><span class="special">>,</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"><</span><span class="number">6</span><span class="special">></span> 5872 <span class="special">>;</span> 5873 5874<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">></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"><</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"><</span><span class="number">0</span><span class="special">>,</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"><</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"><</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">></span> 5881 <span class="special">>::</span><span class="identifier">type</span> 5882 <span class="special">></span> 5883 <span class="special">{};</span> 5884 5885<span class="keyword">template</span> <span class="special"><</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">></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"><</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">>::</span><span class="identifier">type</span> 5890 <span class="special">></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"><</span> 5894 <span class="identifier">sequence</span><span class="special"><</span> 5895 <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* parse the first <number> */</span> 5896 <span class="identifier">transform</span><span class="special"><</span> 5897 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>>,</span> <span class="comment">/* parse the "+ <number>" elements */</span> 5898 <span class="comment">/* lambda expression summarising the "+ <number>" 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"><</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"><</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<...> 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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 5906 <span class="special">></span> 5907 <span class="special">>::</span><span class="identifier">type</span> 5908 <span class="special">></span> 5909 <span class="special">></span> 5910 <span class="special">>;</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"><</span> 5914 <span class="identifier">transform</span><span class="special"><</span> 5915 <span class="comment">/* What we had so far */</span> 5916 <span class="identifier">sequence</span><span class="special"><</span> 5917 <span class="identifier">int_token</span><span class="special">,</span> 5918 <span class="identifier">transform</span><span class="special"><</span> 5919 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>>,</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"><</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"><</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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 5925 <span class="special">></span> 5926 <span class="special">>::</span><span class="identifier">type</span> 5927 <span class="special">></span> 5928 <span class="special">>,</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"><</span><span class="identifier">sum_vector</span><span class="special">></span> <span class="comment">/* summarise the vector of numbers */</span> 5930 <span class="special">></span> 5931 <span class="special">>;</span> 5932<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 5936 <span class="identifier">transform</span><span class="special"><</span> 5937 <span class="identifier">sequence</span><span class="special"><</span> 5938 <span class="identifier">int_token</span><span class="special">,</span> 5939 <span class="identifier">foldl</span><span class="special"><</span> 5940 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 5943 <span class="special">></span> 5944 <span class="special">>,</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"><</span><span class="identifier">sum_vector</span><span class="special">>></span> 5946 <span class="special">>;</span> 5947<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 5951 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 5952 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> <span class="comment">/* use this function to add a new value to the summary */</span> 5955 <span class="special">></span> 5956 <span class="special">>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'-'</span><span class="special">>>;</span> 5958 5959<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 5963 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 5964 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 5967 <span class="special">></span> 5968 <span class="special">>;</span> 5969<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 5970 5971<span class="keyword">template</span> <span class="special"><</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">></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"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</span><span class="identifier">type</span> <span class="special">{};</span> 5974 5975<span class="keyword">template</span> <span class="special"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</span><span class="identifier">type</span> <span class="special">{};</span> 5976 5977<span class="keyword">template</span> <span class="special"><</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">></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"><</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">>::</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">>::</span><span class="identifier">type</span> 5983 <span class="special">></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"><</span> 5988 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 5989 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 5992 <span class="special">></span> 5993 <span class="special">>;</span> 5994<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 5995 5996<span class="keyword">template</span> <span class="special"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'*'</span><span class="special">>>;</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"><</span> 6002 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 6003 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</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">>,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 6006 <span class="special">></span> 6007 <span class="special">>;</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"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">int_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">quote2</span><span class="special"><</span><span class="identifier">binary_op</span><span class="special">>>;</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"><</span> 6012 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 6013 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp1</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 6016 <span class="special">></span> 6017 <span class="special">>;</span> 6018<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 6019 6020<span class="keyword">template</span> <span class="special"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'/'</span><span class="special">>>;</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"><</span> 6026 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">>,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 6029 <span class="special">>;</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"><</span> 6033 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 6034 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp2</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 6037 <span class="special">></span> 6038 <span class="special">>;</span> 6039<span class="keyword">template</span> <span class="special"><</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">></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"><</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">>::</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">>::</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">></span> 6046 <span class="special">{};</span> 6047 6048<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 6052 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">one_of</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">>>,</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"><</span><span class="identifier">reverse_binary_op</span><span class="special">></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">>;</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"><</span> 6060 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 6061 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp3</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 6064 <span class="special">></span> 6065 <span class="special">>;</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"><</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">></span> 6071<span class="preprocessor">#include</span> <span class="special"><</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">></span> 6072 6073<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</span> 6078<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>;</span> 6081<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>>;</span> 6084<span class="preprocessor">#include</span> <span class="special"><</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">></span> 6085 6086<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>>;</span> 6089 6090<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>>;</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"><</span><span class="identifier">sequence</span><span class="special"><</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">>>;</span> 6097<span class="preprocessor">#include</span> <span class="special"><</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">></span> 6098 6099<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 6100 6101<span class="preprocessor">#include</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</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 6102 6103<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">></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"><</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"><</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">0</span><span class="special">>::</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"><</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">2</span><span class="special">>::</span><span class="identifier">type</span> 6108 <span class="special">></span> <span class="special">{};</span> 6109 6110<span class="preprocessor">#include</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">quote</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></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"><</span> 6114 <span class="identifier">transform</span><span class="special"><</span> 6115 <span class="identifier">sequence</span><span class="special"><</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">>,</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"><</span><span class="identifier">eval_plus</span><span class="special">></span> 6117 <span class="special">></span> 6118 <span class="special">>;</span> 6119<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 6123 <span class="identifier">sequence</span><span class="special"><</span> 6124 <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* The first <number> */</span> 6125 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>></span> <span class="comment">/* The "+ <number>" elements */</span> 6126 <span class="special">></span> 6127 <span class="special">>;</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"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 + 3 + 4"</span><span class="special">)>::</span><span class="identifier">type</span><span class="special">;</span> 6129<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></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"><</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"><</span><span class="number">2</span><span class="special">>,</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"><</span><span class="number">5</span><span class="special">>,</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"><</span><span class="number">6</span><span class="special">></span> 6136 <span class="special">>;</span> 6137 6138<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">></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"><</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"><</span><span class="number">0</span><span class="special">>,</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"><</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"><</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">></span> 6145 <span class="special">>::</span><span class="identifier">type</span> 6146 <span class="special">></span> 6147 <span class="special">{};</span> 6148 6149<span class="keyword">template</span> <span class="special"><</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">></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"><</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">>::</span><span class="identifier">type</span> 6154 <span class="special">></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"><</span> 6158 <span class="identifier">sequence</span><span class="special"><</span> 6159 <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* parse the first <number> */</span> 6160 <span class="identifier">transform</span><span class="special"><</span> 6161 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>>,</span> <span class="comment">/* parse the "+ <number>" elements */</span> 6162 <span class="comment">/* lambda expression summarising the "+ <number>" 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"><</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"><</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<...> 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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 6170 <span class="special">></span> 6171 <span class="special">>::</span><span class="identifier">type</span> 6172 <span class="special">></span> 6173 <span class="special">></span> 6174 <span class="special">>;</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"><</span> 6178 <span class="identifier">transform</span><span class="special"><</span> 6179 <span class="comment">/* What we had so far */</span> 6180 <span class="identifier">sequence</span><span class="special"><</span> 6181 <span class="identifier">int_token</span><span class="special">,</span> 6182 <span class="identifier">transform</span><span class="special"><</span> 6183 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>>,</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"><</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"><</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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 6189 <span class="special">></span> 6190 <span class="special">>::</span><span class="identifier">type</span> 6191 <span class="special">></span> 6192 <span class="special">>,</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"><</span><span class="identifier">sum_vector</span><span class="special">></span> <span class="comment">/* summarise the vector of numbers */</span> 6194 <span class="special">></span> 6195 <span class="special">>;</span> 6196<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 6200 <span class="identifier">transform</span><span class="special"><</span> 6201 <span class="identifier">sequence</span><span class="special"><</span> 6202 <span class="identifier">int_token</span><span class="special">,</span> 6203 <span class="identifier">foldl</span><span class="special"><</span> 6204 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 6207 <span class="special">></span> 6208 <span class="special">>,</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"><</span><span class="identifier">sum_vector</span><span class="special">>></span> 6210 <span class="special">>;</span> 6211<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 6215 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 6216 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> <span class="comment">/* use this function to add a new value to the summary */</span> 6219 <span class="special">></span> 6220 <span class="special">>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'-'</span><span class="special">>>;</span> 6222 6223<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 6227 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 6228 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 6231 <span class="special">></span> 6232 <span class="special">>;</span> 6233<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 6234 6235<span class="keyword">template</span> <span class="special"><</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">></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"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</span><span class="identifier">type</span> <span class="special">{};</span> 6238 6239<span class="keyword">template</span> <span class="special"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</span><span class="identifier">type</span> <span class="special">{};</span> 6240 6241<span class="keyword">template</span> <span class="special"><</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">></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"><</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">>::</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">>::</span><span class="identifier">type</span> 6247 <span class="special">></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"><</span> 6252 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 6253 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 6256 <span class="special">></span> 6257 <span class="special">>;</span> 6258<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 6259 6260<span class="keyword">template</span> <span class="special"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'*'</span><span class="special">>>;</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"><</span> 6266 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 6267 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</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">>,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 6270 <span class="special">></span> 6271 <span class="special">>;</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"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">int_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">quote2</span><span class="special"><</span><span class="identifier">binary_op</span><span class="special">>>;</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"><</span> 6276 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 6277 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp1</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 6280 <span class="special">></span> 6281 <span class="special">>;</span> 6282<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 6283 6284<span class="keyword">template</span> <span class="special"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'/'</span><span class="special">>>;</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"><</span> 6290 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">>,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 6293 <span class="special">>;</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"><</span> 6297 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 6298 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp2</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 6301 <span class="special">></span> 6302 <span class="special">>;</span> 6303<span class="keyword">template</span> <span class="special"><</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">></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"><</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">>::</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">>::</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">></span> 6310 <span class="special">{};</span> 6311 6312<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 6316 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">one_of</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">>>,</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"><</span><span class="identifier">reverse_binary_op</span><span class="special">></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">>;</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"><</span> 6324 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 6325 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp3</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 6328 <span class="special">></span> 6329 <span class="special">>;</span> 6330<span class="preprocessor">#include</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">negate</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></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"><</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"><</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">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">type</span> 6337 <span class="special">>;</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"><</span> 6341 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">>,</span> <span class="identifier">unary_exp1</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 6344 <span class="special">>;</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"><</span> 6348 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 6349 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp4</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 6352 <span class="special">></span> 6353 <span class="special">>;</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"><</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">></span> 6359<span class="preprocessor">#include</span> <span class="special"><</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">></span> 6360 6361<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</span> 6366<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>;</span> 6369<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>>;</span> 6372<span class="preprocessor">#include</span> <span class="special"><</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">></span> 6373 6374<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>>;</span> 6377 6378<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>>;</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"><</span><span class="identifier">sequence</span><span class="special"><</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">>>;</span> 6385<span class="preprocessor">#include</span> <span class="special"><</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">></span> 6386 6387<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 6388 6389<span class="preprocessor">#include</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</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 6390 6391<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">></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"><</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"><</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">0</span><span class="special">>::</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"><</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">2</span><span class="special">>::</span><span class="identifier">type</span> 6396 <span class="special">></span> <span class="special">{};</span> 6397 6398<span class="preprocessor">#include</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">quote</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></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"><</span> 6402 <span class="identifier">transform</span><span class="special"><</span> 6403 <span class="identifier">sequence</span><span class="special"><</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">>,</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"><</span><span class="identifier">eval_plus</span><span class="special">></span> 6405 <span class="special">></span> 6406 <span class="special">>;</span> 6407<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 6411 <span class="identifier">sequence</span><span class="special"><</span> 6412 <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* The first <number> */</span> 6413 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>></span> <span class="comment">/* The "+ <number>" elements */</span> 6414 <span class="special">></span> 6415 <span class="special">>;</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"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 + 3 + 4"</span><span class="special">)>::</span><span class="identifier">type</span><span class="special">;</span> 6417<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></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"><</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"><</span><span class="number">2</span><span class="special">>,</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"><</span><span class="number">5</span><span class="special">>,</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"><</span><span class="number">6</span><span class="special">></span> 6424 <span class="special">>;</span> 6425 6426<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">></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"><</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"><</span><span class="number">0</span><span class="special">>,</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"><</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"><</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">></span> 6433 <span class="special">>::</span><span class="identifier">type</span> 6434 <span class="special">></span> 6435 <span class="special">{};</span> 6436 6437<span class="keyword">template</span> <span class="special"><</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">></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"><</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">>::</span><span class="identifier">type</span> 6442 <span class="special">></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"><</span> 6446 <span class="identifier">sequence</span><span class="special"><</span> 6447 <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* parse the first <number> */</span> 6448 <span class="identifier">transform</span><span class="special"><</span> 6449 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>>,</span> <span class="comment">/* parse the "+ <number>" elements */</span> 6450 <span class="comment">/* lambda expression summarising the "+ <number>" 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"><</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"><</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<...> 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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 6458 <span class="special">></span> 6459 <span class="special">>::</span><span class="identifier">type</span> 6460 <span class="special">></span> 6461 <span class="special">></span> 6462 <span class="special">>;</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"><</span> 6466 <span class="identifier">transform</span><span class="special"><</span> 6467 <span class="comment">/* What we had so far */</span> 6468 <span class="identifier">sequence</span><span class="special"><</span> 6469 <span class="identifier">int_token</span><span class="special">,</span> 6470 <span class="identifier">transform</span><span class="special"><</span> 6471 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>>,</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"><</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"><</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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 6477 <span class="special">></span> 6478 <span class="special">>::</span><span class="identifier">type</span> 6479 <span class="special">></span> 6480 <span class="special">>,</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"><</span><span class="identifier">sum_vector</span><span class="special">></span> <span class="comment">/* summarise the vector of numbers */</span> 6482 <span class="special">></span> 6483 <span class="special">>;</span> 6484<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 6488 <span class="identifier">transform</span><span class="special"><</span> 6489 <span class="identifier">sequence</span><span class="special"><</span> 6490 <span class="identifier">int_token</span><span class="special">,</span> 6491 <span class="identifier">foldl</span><span class="special"><</span> 6492 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 6495 <span class="special">></span> 6496 <span class="special">>,</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"><</span><span class="identifier">sum_vector</span><span class="special">>></span> 6498 <span class="special">>;</span> 6499<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 6503 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 6504 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> <span class="comment">/* use this function to add a new value to the summary */</span> 6507 <span class="special">></span> 6508 <span class="special">>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'-'</span><span class="special">>>;</span> 6510 6511<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 6515 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 6516 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 6519 <span class="special">></span> 6520 <span class="special">>;</span> 6521<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 6522 6523<span class="keyword">template</span> <span class="special"><</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">></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"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</span><span class="identifier">type</span> <span class="special">{};</span> 6526 6527<span class="keyword">template</span> <span class="special"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</span><span class="identifier">type</span> <span class="special">{};</span> 6528 6529<span class="keyword">template</span> <span class="special"><</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">></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"><</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">>::</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">>::</span><span class="identifier">type</span> 6535 <span class="special">></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"><</span> 6540 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 6541 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 6544 <span class="special">></span> 6545 <span class="special">>;</span> 6546<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 6547 6548<span class="keyword">template</span> <span class="special"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'*'</span><span class="special">>>;</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"><</span> 6554 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 6555 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</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">>,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 6558 <span class="special">></span> 6559 <span class="special">>;</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"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">int_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">quote2</span><span class="special"><</span><span class="identifier">binary_op</span><span class="special">>>;</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"><</span> 6564 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 6565 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp1</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 6568 <span class="special">></span> 6569 <span class="special">>;</span> 6570<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 6571 6572<span class="keyword">template</span> <span class="special"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'/'</span><span class="special">>>;</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"><</span> 6578 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">>,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 6581 <span class="special">>;</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"><</span> 6585 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 6586 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp2</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 6589 <span class="special">></span> 6590 <span class="special">>;</span> 6591<span class="keyword">template</span> <span class="special"><</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">></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"><</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">>::</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">>::</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">></span> 6598 <span class="special">{};</span> 6599 6600<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 6604 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">one_of</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">>>,</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"><</span><span class="identifier">reverse_binary_op</span><span class="special">></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">>;</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"><</span> 6612 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 6613 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp3</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 6616 <span class="special">></span> 6617 <span class="special">>;</span> 6618<span class="preprocessor">#include</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">negate</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></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"><</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"><</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">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">type</span> 6625 <span class="special">>;</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"><</span> 6629 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">>,</span> <span class="identifier">unary_exp1</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 6632 <span class="special">>;</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"><</span> 6636 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 6637 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp4</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 6640 <span class="special">></span> 6641 <span class="special">>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'('</span><span class="special">>>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">')'</span><span class="special">>>;</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"><</span> 6648 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp4</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 6651 <span class="special">>;</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"><</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">>;</span> 6654 6655<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</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">>;</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"><</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">paren_exp2</span><span class="special">>;</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"><</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">>;</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"><</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">paren_exp2</span><span class="special">>;</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"><</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"><</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">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">type</span> 6672 <span class="special">>;</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"><</span> 6676 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">>,</span> <span class="identifier">unary_exp2</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 6679 <span class="special">>;</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"><</span> 6683 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp5</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 6686 <span class="special">></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"><</span><span class="identifier">plus_exp2</span><span class="special">>;</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"><</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">></span> 6694<span class="preprocessor">#include</span> <span class="special"><</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">></span> 6695 6696<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</span> 6701<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>;</span> 6704<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>>;</span> 6707<span class="preprocessor">#include</span> <span class="special"><</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">></span> 6708 6709<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>>;</span> 6712 6713<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>>;</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"><</span><span class="identifier">sequence</span><span class="special"><</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">>>;</span> 6720<span class="preprocessor">#include</span> <span class="special"><</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">></span> 6721 6722<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 6723 6724<span class="preprocessor">#include</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</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 6725 6726<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">></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"><</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"><</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">0</span><span class="special">>::</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"><</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">2</span><span class="special">>::</span><span class="identifier">type</span> 6731 <span class="special">></span> <span class="special">{};</span> 6732 6733<span class="preprocessor">#include</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">quote</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></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"><</span> 6737 <span class="identifier">transform</span><span class="special"><</span> 6738 <span class="identifier">sequence</span><span class="special"><</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">>,</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"><</span><span class="identifier">eval_plus</span><span class="special">></span> 6740 <span class="special">></span> 6741 <span class="special">>;</span> 6742<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 6746 <span class="identifier">sequence</span><span class="special"><</span> 6747 <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* The first <number> */</span> 6748 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>></span> <span class="comment">/* The "+ <number>" elements */</span> 6749 <span class="special">></span> 6750 <span class="special">>;</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"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 + 3 + 4"</span><span class="special">)>::</span><span class="identifier">type</span><span class="special">;</span> 6752<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></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"><</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"><</span><span class="number">2</span><span class="special">>,</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"><</span><span class="number">5</span><span class="special">>,</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"><</span><span class="number">6</span><span class="special">></span> 6759 <span class="special">>;</span> 6760 6761<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">></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"><</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"><</span><span class="number">0</span><span class="special">>,</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"><</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"><</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">></span> 6768 <span class="special">>::</span><span class="identifier">type</span> 6769 <span class="special">></span> 6770 <span class="special">{};</span> 6771 6772<span class="keyword">template</span> <span class="special"><</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">></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"><</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">>::</span><span class="identifier">type</span> 6777 <span class="special">></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"><</span> 6781 <span class="identifier">sequence</span><span class="special"><</span> 6782 <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* parse the first <number> */</span> 6783 <span class="identifier">transform</span><span class="special"><</span> 6784 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>>,</span> <span class="comment">/* parse the "+ <number>" elements */</span> 6785 <span class="comment">/* lambda expression summarising the "+ <number>" 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"><</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"><</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<...> 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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 6793 <span class="special">></span> 6794 <span class="special">>::</span><span class="identifier">type</span> 6795 <span class="special">></span> 6796 <span class="special">></span> 6797 <span class="special">>;</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"><</span> 6801 <span class="identifier">transform</span><span class="special"><</span> 6802 <span class="comment">/* What we had so far */</span> 6803 <span class="identifier">sequence</span><span class="special"><</span> 6804 <span class="identifier">int_token</span><span class="special">,</span> 6805 <span class="identifier">transform</span><span class="special"><</span> 6806 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>>,</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"><</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"><</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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 6812 <span class="special">></span> 6813 <span class="special">>::</span><span class="identifier">type</span> 6814 <span class="special">></span> 6815 <span class="special">>,</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"><</span><span class="identifier">sum_vector</span><span class="special">></span> <span class="comment">/* summarise the vector of numbers */</span> 6817 <span class="special">></span> 6818 <span class="special">>;</span> 6819<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 6823 <span class="identifier">transform</span><span class="special"><</span> 6824 <span class="identifier">sequence</span><span class="special"><</span> 6825 <span class="identifier">int_token</span><span class="special">,</span> 6826 <span class="identifier">foldl</span><span class="special"><</span> 6827 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 6830 <span class="special">></span> 6831 <span class="special">>,</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"><</span><span class="identifier">sum_vector</span><span class="special">>></span> 6833 <span class="special">>;</span> 6834<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 6838 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 6839 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> <span class="comment">/* use this function to add a new value to the summary */</span> 6842 <span class="special">></span> 6843 <span class="special">>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'-'</span><span class="special">>>;</span> 6845 6846<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 6850 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 6851 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 6854 <span class="special">></span> 6855 <span class="special">>;</span> 6856<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 6857 6858<span class="keyword">template</span> <span class="special"><</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">></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"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</span><span class="identifier">type</span> <span class="special">{};</span> 6861 6862<span class="keyword">template</span> <span class="special"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</span><span class="identifier">type</span> <span class="special">{};</span> 6863 6864<span class="keyword">template</span> <span class="special"><</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">></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"><</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">>::</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">>::</span><span class="identifier">type</span> 6870 <span class="special">></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"><</span> 6875 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 6876 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 6879 <span class="special">></span> 6880 <span class="special">>;</span> 6881<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 6882 6883<span class="keyword">template</span> <span class="special"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'*'</span><span class="special">>>;</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"><</span> 6889 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 6890 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</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">>,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 6893 <span class="special">></span> 6894 <span class="special">>;</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"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">int_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">quote2</span><span class="special"><</span><span class="identifier">binary_op</span><span class="special">>>;</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"><</span> 6899 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 6900 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp1</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 6903 <span class="special">></span> 6904 <span class="special">>;</span> 6905<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 6906 6907<span class="keyword">template</span> <span class="special"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'/'</span><span class="special">>>;</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"><</span> 6913 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">>,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 6916 <span class="special">>;</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"><</span> 6920 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 6921 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp2</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 6924 <span class="special">></span> 6925 <span class="special">>;</span> 6926<span class="keyword">template</span> <span class="special"><</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">></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"><</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">>::</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">>::</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">></span> 6933 <span class="special">{};</span> 6934 6935<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 6939 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">one_of</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">>>,</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"><</span><span class="identifier">reverse_binary_op</span><span class="special">></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">>;</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"><</span> 6947 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 6948 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp3</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 6951 <span class="special">></span> 6952 <span class="special">>;</span> 6953<span class="preprocessor">#include</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">negate</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></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"><</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"><</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">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">type</span> 6960 <span class="special">>;</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"><</span> 6964 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">>,</span> <span class="identifier">unary_exp1</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 6967 <span class="special">>;</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"><</span> 6971 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 6972 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp4</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 6975 <span class="special">></span> 6976 <span class="special">>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'('</span><span class="special">>>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">')'</span><span class="special">>>;</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"><</span> 6983 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp4</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 6986 <span class="special">>;</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"><</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">>;</span> 6989 6990<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</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">>;</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"><</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">paren_exp2</span><span class="special">>;</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"><</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">>;</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"><</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">paren_exp2</span><span class="special">>;</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"><</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"><</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">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">type</span> 7007 <span class="special">>;</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"><</span> 7011 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">>,</span> <span class="identifier">unary_exp2</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 7014 <span class="special">>;</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"><</span> 7018 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp5</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 7021 <span class="special">></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"><</span><span class="identifier">plus_exp2</span><span class="special">>;</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"><</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">></span> 7029<span class="preprocessor">#include</span> <span class="special"><</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">></span> 7030 7031<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</span> 7036<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>;</span> 7039<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>>;</span> 7042<span class="preprocessor">#include</span> <span class="special"><</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">></span> 7043 7044<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>>;</span> 7047 7048<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>>;</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"><</span><span class="identifier">sequence</span><span class="special"><</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">>>;</span> 7055<span class="preprocessor">#include</span> <span class="special"><</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">></span> 7056 7057<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 7058 7059<span class="preprocessor">#include</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</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 7060 7061<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">></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"><</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"><</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">0</span><span class="special">>::</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"><</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">2</span><span class="special">>::</span><span class="identifier">type</span> 7066 <span class="special">></span> <span class="special">{};</span> 7067 7068<span class="preprocessor">#include</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">quote</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></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"><</span> 7072 <span class="identifier">transform</span><span class="special"><</span> 7073 <span class="identifier">sequence</span><span class="special"><</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">>,</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"><</span><span class="identifier">eval_plus</span><span class="special">></span> 7075 <span class="special">></span> 7076 <span class="special">>;</span> 7077<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 7081 <span class="identifier">sequence</span><span class="special"><</span> 7082 <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* The first <number> */</span> 7083 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>></span> <span class="comment">/* The "+ <number>" elements */</span> 7084 <span class="special">></span> 7085 <span class="special">>;</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"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 + 3 + 4"</span><span class="special">)>::</span><span class="identifier">type</span><span class="special">;</span> 7087<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></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"><</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"><</span><span class="number">2</span><span class="special">>,</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"><</span><span class="number">5</span><span class="special">>,</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"><</span><span class="number">6</span><span class="special">></span> 7094 <span class="special">>;</span> 7095 7096<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">></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"><</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"><</span><span class="number">0</span><span class="special">>,</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"><</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"><</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">></span> 7103 <span class="special">>::</span><span class="identifier">type</span> 7104 <span class="special">></span> 7105 <span class="special">{};</span> 7106 7107<span class="keyword">template</span> <span class="special"><</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">></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"><</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">>::</span><span class="identifier">type</span> 7112 <span class="special">></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"><</span> 7116 <span class="identifier">sequence</span><span class="special"><</span> 7117 <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* parse the first <number> */</span> 7118 <span class="identifier">transform</span><span class="special"><</span> 7119 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>>,</span> <span class="comment">/* parse the "+ <number>" elements */</span> 7120 <span class="comment">/* lambda expression summarising the "+ <number>" 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"><</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"><</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<...> 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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 7128 <span class="special">></span> 7129 <span class="special">>::</span><span class="identifier">type</span> 7130 <span class="special">></span> 7131 <span class="special">></span> 7132 <span class="special">>;</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"><</span> 7136 <span class="identifier">transform</span><span class="special"><</span> 7137 <span class="comment">/* What we had so far */</span> 7138 <span class="identifier">sequence</span><span class="special"><</span> 7139 <span class="identifier">int_token</span><span class="special">,</span> 7140 <span class="identifier">transform</span><span class="special"><</span> 7141 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>>,</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"><</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"><</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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 7147 <span class="special">></span> 7148 <span class="special">>::</span><span class="identifier">type</span> 7149 <span class="special">></span> 7150 <span class="special">>,</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"><</span><span class="identifier">sum_vector</span><span class="special">></span> <span class="comment">/* summarise the vector of numbers */</span> 7152 <span class="special">></span> 7153 <span class="special">>;</span> 7154<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 7158 <span class="identifier">transform</span><span class="special"><</span> 7159 <span class="identifier">sequence</span><span class="special"><</span> 7160 <span class="identifier">int_token</span><span class="special">,</span> 7161 <span class="identifier">foldl</span><span class="special"><</span> 7162 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 7165 <span class="special">></span> 7166 <span class="special">>,</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"><</span><span class="identifier">sum_vector</span><span class="special">>></span> 7168 <span class="special">>;</span> 7169<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 7173 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 7174 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> <span class="comment">/* use this function to add a new value to the summary */</span> 7177 <span class="special">></span> 7178 <span class="special">>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'-'</span><span class="special">>>;</span> 7180 7181<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 7185 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 7186 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 7189 <span class="special">></span> 7190 <span class="special">>;</span> 7191<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 7192 7193<span class="keyword">template</span> <span class="special"><</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">></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"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</span><span class="identifier">type</span> <span class="special">{};</span> 7196 7197<span class="keyword">template</span> <span class="special"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</span><span class="identifier">type</span> <span class="special">{};</span> 7198 7199<span class="keyword">template</span> <span class="special"><</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">></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"><</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">>::</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">>::</span><span class="identifier">type</span> 7205 <span class="special">></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"><</span> 7210 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 7211 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 7214 <span class="special">></span> 7215 <span class="special">>;</span> 7216<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 7217 7218<span class="keyword">template</span> <span class="special"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'*'</span><span class="special">>>;</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"><</span> 7224 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 7225 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</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">>,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 7228 <span class="special">></span> 7229 <span class="special">>;</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"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">int_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">quote2</span><span class="special"><</span><span class="identifier">binary_op</span><span class="special">>>;</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"><</span> 7234 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 7235 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp1</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 7238 <span class="special">></span> 7239 <span class="special">>;</span> 7240<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 7241 7242<span class="keyword">template</span> <span class="special"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'/'</span><span class="special">>>;</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"><</span> 7248 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">>,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 7251 <span class="special">>;</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"><</span> 7255 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 7256 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp2</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 7259 <span class="special">></span> 7260 <span class="special">>;</span> 7261<span class="keyword">template</span> <span class="special"><</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">></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"><</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">>::</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">>::</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">></span> 7268 <span class="special">{};</span> 7269 7270<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 7274 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">one_of</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">>>,</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"><</span><span class="identifier">reverse_binary_op</span><span class="special">></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">>;</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"><</span> 7282 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 7283 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp3</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 7286 <span class="special">></span> 7287 <span class="special">>;</span> 7288<span class="preprocessor">#include</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">negate</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></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"><</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"><</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">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">type</span> 7295 <span class="special">>;</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"><</span> 7299 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">>,</span> <span class="identifier">unary_exp1</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 7302 <span class="special">>;</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"><</span> 7306 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 7307 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp4</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 7310 <span class="special">></span> 7311 <span class="special">>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'('</span><span class="special">>>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">')'</span><span class="special">>>;</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"><</span> 7318 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp4</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 7321 <span class="special">>;</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"><</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">>;</span> 7324 7325<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</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">>;</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"><</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">paren_exp2</span><span class="special">>;</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"><</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">>;</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"><</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">paren_exp2</span><span class="special">>;</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"><</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"><</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">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">type</span> 7342 <span class="special">>;</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"><</span> 7346 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">>,</span> <span class="identifier">unary_exp2</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 7349 <span class="special">>;</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"><</span> 7353 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp5</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 7356 <span class="special">></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"><</span><span class="identifier">plus_exp2</span><span class="special">>;</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"><</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">></span> 7364<span class="preprocessor">#include</span> <span class="special"><</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">></span> 7365 7366<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</span> 7371<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>;</span> 7374<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>>;</span> 7377<span class="preprocessor">#include</span> <span class="special"><</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">></span> 7378 7379<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>>;</span> 7382 7383<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>>;</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"><</span><span class="identifier">sequence</span><span class="special"><</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">>>;</span> 7390<span class="preprocessor">#include</span> <span class="special"><</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">></span> 7391 7392<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 7393 7394<span class="preprocessor">#include</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</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 7395 7396<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">></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"><</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"><</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">0</span><span class="special">>::</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"><</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">2</span><span class="special">>::</span><span class="identifier">type</span> 7401 <span class="special">></span> <span class="special">{};</span> 7402 7403<span class="preprocessor">#include</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">quote</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></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"><</span> 7407 <span class="identifier">transform</span><span class="special"><</span> 7408 <span class="identifier">sequence</span><span class="special"><</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">>,</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"><</span><span class="identifier">eval_plus</span><span class="special">></span> 7410 <span class="special">></span> 7411 <span class="special">>;</span> 7412<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 7416 <span class="identifier">sequence</span><span class="special"><</span> 7417 <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* The first <number> */</span> 7418 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>></span> <span class="comment">/* The "+ <number>" elements */</span> 7419 <span class="special">></span> 7420 <span class="special">>;</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"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 + 3 + 4"</span><span class="special">)>::</span><span class="identifier">type</span><span class="special">;</span> 7422<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></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"><</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"><</span><span class="number">2</span><span class="special">>,</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"><</span><span class="number">5</span><span class="special">>,</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"><</span><span class="number">6</span><span class="special">></span> 7429 <span class="special">>;</span> 7430 7431<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">></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"><</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"><</span><span class="number">0</span><span class="special">>,</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"><</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"><</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">></span> 7438 <span class="special">>::</span><span class="identifier">type</span> 7439 <span class="special">></span> 7440 <span class="special">{};</span> 7441 7442<span class="keyword">template</span> <span class="special"><</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">></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"><</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">>::</span><span class="identifier">type</span> 7447 <span class="special">></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"><</span> 7451 <span class="identifier">sequence</span><span class="special"><</span> 7452 <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* parse the first <number> */</span> 7453 <span class="identifier">transform</span><span class="special"><</span> 7454 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>>,</span> <span class="comment">/* parse the "+ <number>" elements */</span> 7455 <span class="comment">/* lambda expression summarising the "+ <number>" 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"><</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"><</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<...> 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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 7463 <span class="special">></span> 7464 <span class="special">>::</span><span class="identifier">type</span> 7465 <span class="special">></span> 7466 <span class="special">></span> 7467 <span class="special">>;</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"><</span> 7471 <span class="identifier">transform</span><span class="special"><</span> 7472 <span class="comment">/* What we had so far */</span> 7473 <span class="identifier">sequence</span><span class="special"><</span> 7474 <span class="identifier">int_token</span><span class="special">,</span> 7475 <span class="identifier">transform</span><span class="special"><</span> 7476 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>>,</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"><</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"><</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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 7482 <span class="special">></span> 7483 <span class="special">>::</span><span class="identifier">type</span> 7484 <span class="special">></span> 7485 <span class="special">>,</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"><</span><span class="identifier">sum_vector</span><span class="special">></span> <span class="comment">/* summarise the vector of numbers */</span> 7487 <span class="special">></span> 7488 <span class="special">>;</span> 7489<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 7493 <span class="identifier">transform</span><span class="special"><</span> 7494 <span class="identifier">sequence</span><span class="special"><</span> 7495 <span class="identifier">int_token</span><span class="special">,</span> 7496 <span class="identifier">foldl</span><span class="special"><</span> 7497 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 7500 <span class="special">></span> 7501 <span class="special">>,</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"><</span><span class="identifier">sum_vector</span><span class="special">>></span> 7503 <span class="special">>;</span> 7504<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 7508 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 7509 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> <span class="comment">/* use this function to add a new value to the summary */</span> 7512 <span class="special">></span> 7513 <span class="special">>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'-'</span><span class="special">>>;</span> 7515 7516<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 7520 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 7521 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 7524 <span class="special">></span> 7525 <span class="special">>;</span> 7526<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 7527 7528<span class="keyword">template</span> <span class="special"><</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">></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"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</span><span class="identifier">type</span> <span class="special">{};</span> 7531 7532<span class="keyword">template</span> <span class="special"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</span><span class="identifier">type</span> <span class="special">{};</span> 7533 7534<span class="keyword">template</span> <span class="special"><</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">></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"><</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">>::</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">>::</span><span class="identifier">type</span> 7540 <span class="special">></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"><</span> 7545 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 7546 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 7549 <span class="special">></span> 7550 <span class="special">>;</span> 7551<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 7552 7553<span class="keyword">template</span> <span class="special"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'*'</span><span class="special">>>;</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"><</span> 7559 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 7560 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</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">>,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 7563 <span class="special">></span> 7564 <span class="special">>;</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"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">int_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">quote2</span><span class="special"><</span><span class="identifier">binary_op</span><span class="special">>>;</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"><</span> 7569 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 7570 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp1</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 7573 <span class="special">></span> 7574 <span class="special">>;</span> 7575<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 7576 7577<span class="keyword">template</span> <span class="special"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'/'</span><span class="special">>>;</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"><</span> 7583 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">>,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 7586 <span class="special">>;</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"><</span> 7590 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 7591 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp2</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 7594 <span class="special">></span> 7595 <span class="special">>;</span> 7596<span class="keyword">template</span> <span class="special"><</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">></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"><</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">>::</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">>::</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">></span> 7603 <span class="special">{};</span> 7604 7605<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 7609 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">one_of</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">>>,</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"><</span><span class="identifier">reverse_binary_op</span><span class="special">></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">>;</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"><</span> 7617 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 7618 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp3</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 7621 <span class="special">></span> 7622 <span class="special">>;</span> 7623<span class="preprocessor">#include</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">negate</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></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"><</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"><</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">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">type</span> 7630 <span class="special">>;</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"><</span> 7634 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">>,</span> <span class="identifier">unary_exp1</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 7637 <span class="special">>;</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"><</span> 7641 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 7642 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp4</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 7645 <span class="special">></span> 7646 <span class="special">>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'('</span><span class="special">>>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">')'</span><span class="special">>>;</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"><</span> 7653 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp4</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 7656 <span class="special">>;</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"><</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">>;</span> 7659 7660<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</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">>;</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"><</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">paren_exp2</span><span class="special">>;</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"><</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">>;</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"><</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">paren_exp2</span><span class="special">>;</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"><</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"><</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">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">type</span> 7677 <span class="special">>;</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"><</span> 7681 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">>,</span> <span class="identifier">unary_exp2</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 7684 <span class="special">>;</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"><</span> 7688 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp5</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 7691 <span class="special">></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"><</span><span class="identifier">plus_exp2</span><span class="special">>;</span> 7694<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</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">>;</span> 7701 7702<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</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"><</span><span class="identifier">missing_primary_expression</span><span class="special">>>;</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"><</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"><</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">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">type</span> 7711 <span class="special">>;</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"><</span> 7715 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">>,</span> <span class="identifier">unary_exp3</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 7718 <span class="special">>;</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"><</span> 7722 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp6</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 7725 <span class="special">></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"><</span><span class="identifier">plus_exp3</span><span class="special">>;</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"><</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">></span> 7733<span class="preprocessor">#include</span> <span class="special"><</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">></span> 7734 7735<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</span> 7740<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>;</span> 7743<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>>;</span> 7746<span class="preprocessor">#include</span> <span class="special"><</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">></span> 7747 7748<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>>;</span> 7751 7752<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>>;</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"><</span><span class="identifier">sequence</span><span class="special"><</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">>>;</span> 7759<span class="preprocessor">#include</span> <span class="special"><</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">></span> 7760 7761<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 7762 7763<span class="preprocessor">#include</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</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 7764 7765<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">></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"><</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"><</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">0</span><span class="special">>::</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"><</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">2</span><span class="special">>::</span><span class="identifier">type</span> 7770 <span class="special">></span> <span class="special">{};</span> 7771 7772<span class="preprocessor">#include</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">quote</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></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"><</span> 7776 <span class="identifier">transform</span><span class="special"><</span> 7777 <span class="identifier">sequence</span><span class="special"><</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">>,</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"><</span><span class="identifier">eval_plus</span><span class="special">></span> 7779 <span class="special">></span> 7780 <span class="special">>;</span> 7781<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 7785 <span class="identifier">sequence</span><span class="special"><</span> 7786 <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* The first <number> */</span> 7787 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>></span> <span class="comment">/* The "+ <number>" elements */</span> 7788 <span class="special">></span> 7789 <span class="special">>;</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"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 + 3 + 4"</span><span class="special">)>::</span><span class="identifier">type</span><span class="special">;</span> 7791<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></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"><</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"><</span><span class="number">2</span><span class="special">>,</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"><</span><span class="number">5</span><span class="special">>,</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"><</span><span class="number">6</span><span class="special">></span> 7798 <span class="special">>;</span> 7799 7800<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">></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"><</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"><</span><span class="number">0</span><span class="special">>,</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"><</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"><</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">></span> 7807 <span class="special">>::</span><span class="identifier">type</span> 7808 <span class="special">></span> 7809 <span class="special">{};</span> 7810 7811<span class="keyword">template</span> <span class="special"><</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">></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"><</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">>::</span><span class="identifier">type</span> 7816 <span class="special">></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"><</span> 7820 <span class="identifier">sequence</span><span class="special"><</span> 7821 <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* parse the first <number> */</span> 7822 <span class="identifier">transform</span><span class="special"><</span> 7823 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>>,</span> <span class="comment">/* parse the "+ <number>" elements */</span> 7824 <span class="comment">/* lambda expression summarising the "+ <number>" 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"><</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"><</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<...> 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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 7832 <span class="special">></span> 7833 <span class="special">>::</span><span class="identifier">type</span> 7834 <span class="special">></span> 7835 <span class="special">></span> 7836 <span class="special">>;</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"><</span> 7840 <span class="identifier">transform</span><span class="special"><</span> 7841 <span class="comment">/* What we had so far */</span> 7842 <span class="identifier">sequence</span><span class="special"><</span> 7843 <span class="identifier">int_token</span><span class="special">,</span> 7844 <span class="identifier">transform</span><span class="special"><</span> 7845 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>>,</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"><</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"><</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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 7851 <span class="special">></span> 7852 <span class="special">>::</span><span class="identifier">type</span> 7853 <span class="special">></span> 7854 <span class="special">>,</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"><</span><span class="identifier">sum_vector</span><span class="special">></span> <span class="comment">/* summarise the vector of numbers */</span> 7856 <span class="special">></span> 7857 <span class="special">>;</span> 7858<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 7862 <span class="identifier">transform</span><span class="special"><</span> 7863 <span class="identifier">sequence</span><span class="special"><</span> 7864 <span class="identifier">int_token</span><span class="special">,</span> 7865 <span class="identifier">foldl</span><span class="special"><</span> 7866 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 7869 <span class="special">></span> 7870 <span class="special">>,</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"><</span><span class="identifier">sum_vector</span><span class="special">>></span> 7872 <span class="special">>;</span> 7873<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 7877 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 7878 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> <span class="comment">/* use this function to add a new value to the summary */</span> 7881 <span class="special">></span> 7882 <span class="special">>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'-'</span><span class="special">>>;</span> 7884 7885<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 7889 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 7890 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 7893 <span class="special">></span> 7894 <span class="special">>;</span> 7895<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 7896 7897<span class="keyword">template</span> <span class="special"><</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">></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"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</span><span class="identifier">type</span> <span class="special">{};</span> 7900 7901<span class="keyword">template</span> <span class="special"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</span><span class="identifier">type</span> <span class="special">{};</span> 7902 7903<span class="keyword">template</span> <span class="special"><</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">></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"><</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">>::</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">>::</span><span class="identifier">type</span> 7909 <span class="special">></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"><</span> 7914 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 7915 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 7918 <span class="special">></span> 7919 <span class="special">>;</span> 7920<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 7921 7922<span class="keyword">template</span> <span class="special"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'*'</span><span class="special">>>;</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"><</span> 7928 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 7929 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</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">>,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 7932 <span class="special">></span> 7933 <span class="special">>;</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"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">int_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">quote2</span><span class="special"><</span><span class="identifier">binary_op</span><span class="special">>>;</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"><</span> 7938 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 7939 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp1</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 7942 <span class="special">></span> 7943 <span class="special">>;</span> 7944<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 7945 7946<span class="keyword">template</span> <span class="special"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'/'</span><span class="special">>>;</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"><</span> 7952 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">>,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 7955 <span class="special">>;</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"><</span> 7959 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 7960 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp2</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 7963 <span class="special">></span> 7964 <span class="special">>;</span> 7965<span class="keyword">template</span> <span class="special"><</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">></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"><</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">>::</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">>::</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">></span> 7972 <span class="special">{};</span> 7973 7974<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 7978 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">one_of</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">>>,</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"><</span><span class="identifier">reverse_binary_op</span><span class="special">></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">>;</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"><</span> 7986 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 7987 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp3</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 7990 <span class="special">></span> 7991 <span class="special">>;</span> 7992<span class="preprocessor">#include</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">negate</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></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"><</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"><</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">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">type</span> 7999 <span class="special">>;</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"><</span> 8003 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">>,</span> <span class="identifier">unary_exp1</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 8006 <span class="special">>;</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"><</span> 8010 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 8011 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp4</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 8014 <span class="special">></span> 8015 <span class="special">>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'('</span><span class="special">>>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">')'</span><span class="special">>>;</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"><</span> 8022 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp4</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 8025 <span class="special">>;</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"><</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">>;</span> 8028 8029<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</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">>;</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"><</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">paren_exp2</span><span class="special">>;</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"><</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">>;</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"><</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">paren_exp2</span><span class="special">>;</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"><</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"><</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">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">type</span> 8046 <span class="special">>;</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"><</span> 8050 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">>,</span> <span class="identifier">unary_exp2</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 8053 <span class="special">>;</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"><</span> 8057 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp5</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 8060 <span class="special">></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"><</span><span class="identifier">plus_exp2</span><span class="special">>;</span> 8063<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</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">>;</span> 8070 8071<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</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"><</span><span class="identifier">missing_primary_expression</span><span class="special">>>;</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"><</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"><</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">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">type</span> 8080 <span class="special">>;</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"><</span> 8084 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">>,</span> <span class="identifier">unary_exp3</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 8087 <span class="special">>;</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"><</span> 8091 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp6</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 8094 <span class="special">></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"><</span><span class="identifier">plus_exp3</span><span class="special">>;</span> 8097<span class="preprocessor">#include</span> <span class="special"><</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">></span> 8098 8099<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 8103 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 8104 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp6</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 8107 <span class="special">>,</span> 8108 <span class="identifier">fail_at_first_char_expected</span><span class="special"><</span> 8109 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp6</span><span class="special">></span> 8110 <span class="special">></span> 8111 <span class="special">></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"><</span><span class="identifier">plus_exp4</span><span class="special">>;</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"><</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">></span> 8119<span class="preprocessor">#include</span> <span class="special"><</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">></span> 8120 8121<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</span> 8126<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>;</span> 8129<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>>;</span> 8132<span class="preprocessor">#include</span> <span class="special"><</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">></span> 8133 8134<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>>;</span> 8137 8138<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>>;</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"><</span><span class="identifier">sequence</span><span class="special"><</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">>>;</span> 8145<span class="preprocessor">#include</span> <span class="special"><</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">></span> 8146 8147<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 8148 8149<span class="preprocessor">#include</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</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 8150 8151<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">></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"><</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"><</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">0</span><span class="special">>::</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"><</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">2</span><span class="special">>::</span><span class="identifier">type</span> 8156 <span class="special">></span> <span class="special">{};</span> 8157 8158<span class="preprocessor">#include</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">quote</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></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"><</span> 8162 <span class="identifier">transform</span><span class="special"><</span> 8163 <span class="identifier">sequence</span><span class="special"><</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">>,</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"><</span><span class="identifier">eval_plus</span><span class="special">></span> 8165 <span class="special">></span> 8166 <span class="special">>;</span> 8167<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 8171 <span class="identifier">sequence</span><span class="special"><</span> 8172 <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* The first <number> */</span> 8173 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>></span> <span class="comment">/* The "+ <number>" elements */</span> 8174 <span class="special">></span> 8175 <span class="special">>;</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"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 + 3 + 4"</span><span class="special">)>::</span><span class="identifier">type</span><span class="special">;</span> 8177<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></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"><</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"><</span><span class="number">2</span><span class="special">>,</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"><</span><span class="number">5</span><span class="special">>,</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"><</span><span class="number">6</span><span class="special">></span> 8184 <span class="special">>;</span> 8185 8186<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">></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"><</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"><</span><span class="number">0</span><span class="special">>,</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"><</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"><</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">></span> 8193 <span class="special">>::</span><span class="identifier">type</span> 8194 <span class="special">></span> 8195 <span class="special">{};</span> 8196 8197<span class="keyword">template</span> <span class="special"><</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">></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"><</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">>::</span><span class="identifier">type</span> 8202 <span class="special">></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"><</span> 8206 <span class="identifier">sequence</span><span class="special"><</span> 8207 <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* parse the first <number> */</span> 8208 <span class="identifier">transform</span><span class="special"><</span> 8209 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>>,</span> <span class="comment">/* parse the "+ <number>" elements */</span> 8210 <span class="comment">/* lambda expression summarising the "+ <number>" 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"><</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"><</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<...> 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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 8218 <span class="special">></span> 8219 <span class="special">>::</span><span class="identifier">type</span> 8220 <span class="special">></span> 8221 <span class="special">></span> 8222 <span class="special">>;</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"><</span> 8226 <span class="identifier">transform</span><span class="special"><</span> 8227 <span class="comment">/* What we had so far */</span> 8228 <span class="identifier">sequence</span><span class="special"><</span> 8229 <span class="identifier">int_token</span><span class="special">,</span> 8230 <span class="identifier">transform</span><span class="special"><</span> 8231 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>>,</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"><</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"><</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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 8237 <span class="special">></span> 8238 <span class="special">>::</span><span class="identifier">type</span> 8239 <span class="special">></span> 8240 <span class="special">>,</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"><</span><span class="identifier">sum_vector</span><span class="special">></span> <span class="comment">/* summarise the vector of numbers */</span> 8242 <span class="special">></span> 8243 <span class="special">>;</span> 8244<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 8248 <span class="identifier">transform</span><span class="special"><</span> 8249 <span class="identifier">sequence</span><span class="special"><</span> 8250 <span class="identifier">int_token</span><span class="special">,</span> 8251 <span class="identifier">foldl</span><span class="special"><</span> 8252 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 8255 <span class="special">></span> 8256 <span class="special">>,</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"><</span><span class="identifier">sum_vector</span><span class="special">>></span> 8258 <span class="special">>;</span> 8259<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 8263 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 8264 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> <span class="comment">/* use this function to add a new value to the summary */</span> 8267 <span class="special">></span> 8268 <span class="special">>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'-'</span><span class="special">>>;</span> 8270 8271<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 8275 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 8276 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 8279 <span class="special">></span> 8280 <span class="special">>;</span> 8281<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 8282 8283<span class="keyword">template</span> <span class="special"><</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">></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"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</span><span class="identifier">type</span> <span class="special">{};</span> 8286 8287<span class="keyword">template</span> <span class="special"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</span><span class="identifier">type</span> <span class="special">{};</span> 8288 8289<span class="keyword">template</span> <span class="special"><</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">></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"><</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">>::</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">>::</span><span class="identifier">type</span> 8295 <span class="special">></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"><</span> 8300 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 8301 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 8304 <span class="special">></span> 8305 <span class="special">>;</span> 8306<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 8307 8308<span class="keyword">template</span> <span class="special"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'*'</span><span class="special">>>;</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"><</span> 8314 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 8315 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</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">>,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 8318 <span class="special">></span> 8319 <span class="special">>;</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"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">int_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">quote2</span><span class="special"><</span><span class="identifier">binary_op</span><span class="special">>>;</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"><</span> 8324 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 8325 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp1</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 8328 <span class="special">></span> 8329 <span class="special">>;</span> 8330<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 8331 8332<span class="keyword">template</span> <span class="special"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'/'</span><span class="special">>>;</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"><</span> 8338 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">>,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 8341 <span class="special">>;</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"><</span> 8345 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 8346 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp2</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 8349 <span class="special">></span> 8350 <span class="special">>;</span> 8351<span class="keyword">template</span> <span class="special"><</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">></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"><</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">>::</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">>::</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">></span> 8358 <span class="special">{};</span> 8359 8360<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 8364 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">one_of</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">>>,</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"><</span><span class="identifier">reverse_binary_op</span><span class="special">></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">>;</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"><</span> 8372 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 8373 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp3</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 8376 <span class="special">></span> 8377 <span class="special">>;</span> 8378<span class="preprocessor">#include</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">negate</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></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"><</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"><</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">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">type</span> 8385 <span class="special">>;</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"><</span> 8389 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">>,</span> <span class="identifier">unary_exp1</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 8392 <span class="special">>;</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"><</span> 8396 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 8397 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp4</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 8400 <span class="special">></span> 8401 <span class="special">>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'('</span><span class="special">>>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">')'</span><span class="special">>>;</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"><</span> 8408 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp4</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 8411 <span class="special">>;</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"><</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">>;</span> 8414 8415<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</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">>;</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"><</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">paren_exp2</span><span class="special">>;</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"><</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">>;</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"><</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">paren_exp2</span><span class="special">>;</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"><</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"><</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">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">type</span> 8432 <span class="special">>;</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"><</span> 8436 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">>,</span> <span class="identifier">unary_exp2</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 8439 <span class="special">>;</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"><</span> 8443 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp5</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 8446 <span class="special">></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"><</span><span class="identifier">plus_exp2</span><span class="special">>;</span> 8449<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</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">>;</span> 8456 8457<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</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"><</span><span class="identifier">missing_primary_expression</span><span class="special">>>;</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"><</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"><</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">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">type</span> 8466 <span class="special">>;</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"><</span> 8470 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">>,</span> <span class="identifier">unary_exp3</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 8473 <span class="special">>;</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"><</span> 8477 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp6</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 8480 <span class="special">></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"><</span><span class="identifier">plus_exp3</span><span class="special">>;</span> 8483<span class="preprocessor">#include</span> <span class="special"><</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">></span> 8484 8485<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 8489 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 8490 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp6</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 8493 <span class="special">>,</span> 8494 <span class="identifier">fail_at_first_char_expected</span><span class="special"><</span> 8495 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp6</span><span class="special">></span> 8496 <span class="special">></span> 8497 <span class="special">></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"><</span><span class="identifier">plus_exp4</span><span class="special">>;</span> 8500<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 8504 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp6</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 8507 <span class="special">></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"><</span><span class="identifier">plus_exp5</span><span class="special">>;</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"><</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">></span> 8515<span class="preprocessor">#include</span> <span class="special"><</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">></span> 8516 8517<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</span> 8522<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>;</span> 8525<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">entire_input</span><span class="special"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>>;</span> 8528<span class="preprocessor">#include</span> <span class="special"><</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">></span> 8529 8530<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>>,</span> <span class="identifier">token</span><span class="special"><</span><span class="identifier">int_</span><span class="special">>>>;</span> 8533 8534<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span><span class="identifier">int_</span><span class="special">>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'+'</span><span class="special">>>;</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"><</span><span class="identifier">sequence</span><span class="special"><</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">>>;</span> 8541<span class="preprocessor">#include</span> <span class="special"><</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">></span> 8542 8543<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 8544 8545<span class="preprocessor">#include</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</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 8546 8547<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">></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"><</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"><</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">0</span><span class="special">>::</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"><</span><span class="identifier">Vector</span><span class="special">,</span> <span class="number">2</span><span class="special">>::</span><span class="identifier">type</span> 8552 <span class="special">></span> <span class="special">{};</span> 8553 8554<span class="preprocessor">#include</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">quote</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></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"><</span> 8558 <span class="identifier">transform</span><span class="special"><</span> 8559 <span class="identifier">sequence</span><span class="special"><</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">>,</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"><</span><span class="identifier">eval_plus</span><span class="special">></span> 8561 <span class="special">></span> 8562 <span class="special">>;</span> 8563<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 8567 <span class="identifier">sequence</span><span class="special"><</span> 8568 <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* The first <number> */</span> 8569 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>></span> <span class="comment">/* The "+ <number>" elements */</span> 8570 <span class="special">></span> 8571 <span class="special">>;</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"><</span><span class="identifier">BOOST_METAPARSE_STRING</span><span class="special">(</span><span class="string">"1 + 2 + 3 + 4"</span><span class="special">)>::</span><span class="identifier">type</span><span class="special">;</span> 8573<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></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"><</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"><</span><span class="number">2</span><span class="special">>,</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"><</span><span class="number">5</span><span class="special">>,</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"><</span><span class="number">6</span><span class="special">></span> 8580 <span class="special">>;</span> 8581 8582<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Vector</span><span class="special">></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"><</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"><</span><span class="number">0</span><span class="special">>,</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"><</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"><</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">></span> 8589 <span class="special">>::</span><span class="identifier">type</span> 8590 <span class="special">></span> 8591 <span class="special">{};</span> 8592 8593<span class="keyword">template</span> <span class="special"><</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">></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"><</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">>::</span><span class="identifier">type</span> 8598 <span class="special">></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"><</span> 8602 <span class="identifier">sequence</span><span class="special"><</span> 8603 <span class="identifier">int_token</span><span class="special">,</span> <span class="comment">/* parse the first <number> */</span> 8604 <span class="identifier">transform</span><span class="special"><</span> 8605 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>>,</span> <span class="comment">/* parse the "+ <number>" elements */</span> 8606 <span class="comment">/* lambda expression summarising the "+ <number>" 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"><</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"><</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<...> 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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 8614 <span class="special">></span> 8615 <span class="special">>::</span><span class="identifier">type</span> 8616 <span class="special">></span> 8617 <span class="special">></span> 8618 <span class="special">>;</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"><</span> 8622 <span class="identifier">transform</span><span class="special"><</span> 8623 <span class="comment">/* What we had so far */</span> 8624 <span class="identifier">sequence</span><span class="special"><</span> 8625 <span class="identifier">int_token</span><span class="special">,</span> 8626 <span class="identifier">transform</span><span class="special"><</span> 8627 <span class="identifier">repeated</span><span class="special"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>>,</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"><</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"><</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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 8633 <span class="special">></span> 8634 <span class="special">>::</span><span class="identifier">type</span> 8635 <span class="special">></span> 8636 <span class="special">>,</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"><</span><span class="identifier">sum_vector</span><span class="special">></span> <span class="comment">/* summarise the vector of numbers */</span> 8638 <span class="special">></span> 8639 <span class="special">>;</span> 8640<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 8644 <span class="identifier">transform</span><span class="special"><</span> 8645 <span class="identifier">sequence</span><span class="special"><</span> 8646 <span class="identifier">int_token</span><span class="special">,</span> 8647 <span class="identifier">foldl</span><span class="special"><</span> 8648 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="number">0</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 8651 <span class="special">></span> 8652 <span class="special">>,</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"><</span><span class="identifier">sum_vector</span><span class="special">>></span> 8654 <span class="special">>;</span> 8655<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 8659 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 8660 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> <span class="comment">/* use this function to add a new value to the summary */</span> 8663 <span class="special">></span> 8664 <span class="special">>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'-'</span><span class="special">>>;</span> 8666 8667<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 8671 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 8672 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">sum_items</span><span class="special">></span> 8675 <span class="special">></span> 8676 <span class="special">>;</span> 8677<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 8678 8679<span class="keyword">template</span> <span class="special"><</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">></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"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</span><span class="identifier">type</span> <span class="special">{};</span> 8682 8683<span class="keyword">template</span> <span class="special"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</span><span class="identifier">type</span> <span class="special">{};</span> 8684 8685<span class="keyword">template</span> <span class="special"><</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">></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"><</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">>::</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">>::</span><span class="identifier">type</span> 8691 <span class="special">></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"><</span> 8696 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 8697 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 8700 <span class="special">></span> 8701 <span class="special">>;</span> 8702<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 8703 8704<span class="keyword">template</span> <span class="special"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'*'</span><span class="special">>>;</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"><</span> 8710 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 8711 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</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">>,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 8714 <span class="special">></span> 8715 <span class="special">>;</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"><</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">int_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">quote2</span><span class="special"><</span><span class="identifier">binary_op</span><span class="special">>>;</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"><</span> 8720 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 8721 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp1</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 8724 <span class="special">></span> 8725 <span class="special">>;</span> 8726<span class="preprocessor">#include</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">.</span><span class="identifier">hpp</span><span class="special">></span> 8727 8728<span class="keyword">template</span> <span class="special"><</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">></span> <span class="keyword">struct</span> <span class="identifier">eval_binary_op</span><span class="special"><</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">></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"><</span><span class="identifier">L</span><span class="special">,</span> <span class="identifier">R</span><span class="special">>::</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'/'</span><span class="special">>>;</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"><</span> 8734 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">>,</span> <span class="identifier">int_token</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 8737 <span class="special">>;</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"><</span> 8741 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 8742 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp2</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 8745 <span class="special">></span> 8746 <span class="special">>;</span> 8747<span class="keyword">template</span> <span class="special"><</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">></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"><</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">0</span><span class="special">>::</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"><</span><span class="identifier">Item</span><span class="special">,</span> <span class="number">1</span><span class="special">>::</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">></span> 8754 <span class="special">{};</span> 8755 8756<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 8760 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">one_of</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">>>,</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"><</span><span class="identifier">reverse_binary_op</span><span class="special">></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">>;</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"><</span> 8768 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 8769 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp3</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 8772 <span class="special">></span> 8773 <span class="special">>;</span> 8774<span class="preprocessor">#include</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">negate</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></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"><</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"><</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">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">type</span> 8781 <span class="special">>;</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"><</span> 8785 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">>,</span> <span class="identifier">unary_exp1</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 8788 <span class="special">>;</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"><</span> 8792 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 8793 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp4</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 8796 <span class="special">></span> 8797 <span class="special">>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">'('</span><span class="special">>>;</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"><</span><span class="identifier">lit_c</span><span class="special"><</span><span class="char">')'</span><span class="special">>>;</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"><</span> 8804 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp4</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 8807 <span class="special">>;</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"><</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">>;</span> 8810 8811<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</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">>;</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"><</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">paren_exp2</span><span class="special">>;</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"><</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">>;</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"><</span><span class="identifier">int_token</span><span class="special">,</span> <span class="identifier">paren_exp2</span><span class="special">>;</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"><</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"><</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">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">type</span> 8828 <span class="special">>;</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"><</span> 8832 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">>,</span> <span class="identifier">unary_exp2</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 8835 <span class="special">>;</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"><</span> 8839 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp5</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 8842 <span class="special">></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"><</span><span class="identifier">plus_exp2</span><span class="special">>;</span> 8845<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</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">>;</span> 8852 8853<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</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"><</span><span class="identifier">missing_primary_expression</span><span class="special">>>;</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"><</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"><</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">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">type</span> 8862 <span class="special">>;</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"><</span> 8866 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">>,</span> <span class="identifier">unary_exp3</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 8869 <span class="special">>;</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"><</span> 8873 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp6</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 8876 <span class="special">></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"><</span><span class="identifier">plus_exp3</span><span class="special">>;</span> 8879<span class="preprocessor">#include</span> <span class="special"><</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">></span> 8880 8881<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 8885 <span class="identifier">foldl_start_with_parser</span><span class="special"><</span> 8886 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp6</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 8889 <span class="special">>,</span> 8890 <span class="identifier">fail_at_first_char_expected</span><span class="special"><</span> 8891 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp6</span><span class="special">></span> 8892 <span class="special">></span> 8893 <span class="special">></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"><</span><span class="identifier">plus_exp4</span><span class="special">>;</span> 8896<span class="preprocessor">#include</span> <span class="special"><</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">></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"><</span> 8900 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp6</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 8903 <span class="special">></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"><</span><span class="identifier">plus_exp5</span><span class="special">>;</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"><</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">>;</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"><</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"><</span><span class="identifier">missing_primary_expression</span><span class="special">>>;</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"><</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"><</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">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">type</span> 8917 <span class="special">>;</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"><</span> 8921 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">times_token</span><span class="special">,</span> <span class="identifier">divides_token</span><span class="special">>,</span> <span class="identifier">unary_exp4</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 8924 <span class="special">>;</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"><</span> 8928 <span class="identifier">sequence</span><span class="special"><</span><span class="identifier">one_of</span><span class="special"><</span><span class="identifier">plus_token</span><span class="special">,</span> <span class="identifier">minus_token</span><span class="special">>,</span> <span class="identifier">mult_exp7</span><span class="special">>,</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"><</span><span class="identifier">binary_op</span><span class="special">></span> 8931 <span class="special">></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"><</span><span class="identifier">plus_exp6</span><span class="special">>;</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