/Src/Dependencies/Boost/libs/phoenix/doc/html/phoenix/inside/expression/boilerplate_macros.html

http://hadesmem.googlecode.com/ · HTML · 515 lines · 494 code · 21 blank · 0 comment · 0 complexity · b8f4d85b5b6a0f7f3ec3218b66e78c93 MD5 · raw file

  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
  4. <title>Boilerplate Macros</title>
  5. <link rel="stylesheet" href="../../../../../../../doc/src/boostbook.css" type="text/css">
  6. <meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
  7. <link rel="home" href="../../../index.html" title="Chapter&#160;1.&#160;Phoenix 3.0">
  8. <link rel="up" href="../expression.html" title="Phoenix Expressions">
  9. <link rel="prev" href="../expression.html" title="Phoenix Expressions">
  10. <link rel="next" href="../actions.html" title="More on Actions">
  11. </head>
  12. <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
  13. <table cellpadding="2" width="100%"><tr>
  14. <td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../../boost.png"></td>
  15. <td align="center"><a href="../../../../../../../index.html">Home</a></td>
  16. <td align="center"><a href="../../../../../../../libs/libraries.htm">Libraries</a></td>
  17. <td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
  18. <td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
  19. <td align="center"><a href="../../../../../../../more/index.htm">More</a></td>
  20. </tr></table>
  21. <hr>
  22. <div class="spirit-nav">
  23. <a accesskey="p" href="../expression.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../expression.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="../actions.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
  24. </div>
  25. <div class="section">
  26. <div class="titlepage"><div><div><h4 class="title">
  27. <a name="phoenix.inside.expression.boilerplate_macros"></a><a class="link" href="boilerplate_macros.html" title="Boilerplate Macros">Boilerplate
  28. Macros</a>
  29. </h4></div></div></div>
  30. <div class="toc"><dl>
  31. <dt><span class="section"><a href="boilerplate_macros.html#phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression">BOOST_PHOENIX_DEFINE_EXPRESSION</a></span></dt>
  32. <dt><span class="section"><a href="boilerplate_macros.html#phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_vararg">BOOST_PHOENIX_DEFINE_EXPRESSION_VARARG</a></span></dt>
  33. <dt><span class="section"><a href="boilerplate_macros.html#phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext">BOOST_PHOENIX_DEFINE_EXPRESSION_EXT</a></span></dt>
  34. <dt><span class="section"><a href="boilerplate_macros.html#phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext_vararg">BOOST_PHOENIX_DEFINE_EXPRESSION_EXT_VARARG</a></span></dt>
  35. </dl></div>
  36. <p>
  37. When having more and more expressions, you start to realize that this is
  38. a very repetetive task. Phoenix provides boilerplate macros that make defining
  39. Phoenix Expressions as you have seen in the <a class="link" href="../expression.html" title="Phoenix Expressions">previous
  40. section</a> look like a piece of cake.
  41. </p>
  42. <div class="section">
  43. <div class="titlepage"><div><div><h5 class="title">
  44. <a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression"></a><a class="link" href="boilerplate_macros.html#phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression" title="BOOST_PHOENIX_DEFINE_EXPRESSION">BOOST_PHOENIX_DEFINE_EXPRESSION</a>
  45. </h5></div></div></div>
  46. <a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression.description"></a><h6>
  47. <a name="id843517"></a>
  48. <a class="link" href="boilerplate_macros.html#phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression.description">Description</a>
  49. </h6>
  50. <p>
  51. <code class="computeroutput"><span class="identifier">BOOST_PHOENIX_DEFINE_EXPRESSION</span></code>
  52. is a macro that can be used to generate all the necessary boilerplate
  53. to create Phoenix Expressions
  54. </p>
  55. <a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression.synopsis"></a><h6>
  56. <a name="id843552"></a>
  57. <a class="link" href="boilerplate_macros.html#phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression.synopsis">Synopsis</a>
  58. </h6>
  59. <pre class="programlisting"><span class="identifier">BOOST_PHOENIX_DEFINE_EXPRESSION</span><span class="special">(</span>
  60. <span class="special">(</span><span class="identifier">namespace_seq</span><span class="special">)(</span><span class="identifier">name</span><span class="special">)</span>
  61. <span class="special">,</span> <span class="special">(</span><span class="identifier">child_grammar0</span><span class="special">)</span>
  62. <span class="special">(</span><span class="identifier">child_grammar1</span><span class="special">)</span>
  63. <span class="special">...</span>
  64. <span class="special">)</span>
  65. </pre>
  66. <a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression.semantics"></a><h6>
  67. <a name="id843658"></a>
  68. <a class="link" href="boilerplate_macros.html#phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression.semantics">Semantics</a>
  69. </h6>
  70. <p>
  71. The above macro generates the necessary code for an expression <code class="computeroutput"><span class="identifier">name</span></code> in namespace <code class="computeroutput"><span class="identifier">namespace_seq</span></code>.
  72. The sequence of <code class="computeroutput"><span class="special">(</span><span class="identifier">child_grammarN</span><span class="special">)</span></code> declares how many children the expression
  73. will have and what <code class="computeroutput"><span class="identifier">proto</span><span class="special">::</span><span class="identifier">grammar</span></code>
  74. they match.
  75. </p>
  76. <p>
  77. The macro should be used at global scope. <code class="computeroutput"><span class="identifier">namespace_seq</span></code>
  78. shall be the sequence of namespaces under which the following symbols
  79. will be defined:
  80. </p>
  81. <pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">tag</span>
  82. <span class="special">{</span>
  83. <span class="keyword">struct</span> <span class="identifier">name</span><span class="special">;</span>
  84. <span class="special">}</span>
  85. <span class="keyword">namespace</span> <span class="identifier">expression</span>
  86. <span class="special">{</span>
  87. <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">A0</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">A1</span> <span class="special">...</span> <span class="keyword">typename</span> <span class="identifier">AN</span><span class="special">&gt;</span>
  88. <span class="keyword">struct</span> <span class="identifier">name</span>
  89. <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">phoenix</span><span class="special">::</span><span class="identifier">expr</span><span class="special">&lt;</span>
  90. <span class="identifier">tag</span><span class="special">::</span><span class="identifier">name</span>
  91. <span class="special">,</span> <span class="identifier">A0</span>
  92. <span class="special">,</span> <span class="identifier">A1</span>
  93. <span class="special">...</span>
  94. <span class="special">,</span> <span class="identifier">AN</span>
  95. <span class="special">&gt;</span>
  96. <span class="special">}</span>
  97. <span class="keyword">namespace</span> <span class="identifier">rule</span>
  98. <span class="special">{</span>
  99. <span class="keyword">struct</span> <span class="identifier">name</span>
  100. <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">phoenix</span><span class="special">::</span><span class="identifier">expr</span><span class="special">&lt;</span>
  101. <span class="identifier">child_grammar0</span>
  102. <span class="special">,</span> <span class="identifier">child_grammar1</span>
  103. <span class="special">...</span>
  104. <span class="special">,</span> <span class="identifier">child_grammarN</span>
  105. <span class="special">&gt;</span>
  106. <span class="special">{};</span>
  107. <span class="special">}</span>
  108. <span class="keyword">namespace</span> <span class="identifier">functional</span>
  109. <span class="special">{</span>
  110. <span class="keyword">struct</span> <span class="identifier">make_name</span><span class="special">;</span> <span class="comment">// A polymorphic function object that can be called to create the expression node
  111. </span><span class="special">}</span>
  112. <span class="keyword">namespace</span> <span class="identifier">result_of</span>
  113. <span class="special">{</span>
  114. <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">A0</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">A1</span> <span class="special">...</span> <span class="keyword">typename</span> <span class="identifier">AN</span><span class="special">&gt;</span>
  115. <span class="keyword">struct</span> <span class="identifier">make_name</span><span class="special">;</span> <span class="comment">// The result type of the expression node
  116. </span><span class="special">}</span>
  117. <span class="comment">// convenience polymorphic function to create an expression node
  118. </span><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">A0</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">A1</span> <span class="special">...</span> <span class="keyword">typename</span> <span class="identifier">AN</span><span class="special">&gt;</span>
  119. <span class="identifier">result_of</span><span class="special">::</span><span class="identifier">make_name</span><span class="special">&lt;</span><span class="identifier">A0</span><span class="special">,</span> <span class="identifier">A1</span> <span class="special">...</span> <span class="identifier">AN</span><span class="special">&gt;</span>
  120. <span class="identifier">make_name</span><span class="special">(</span><span class="identifier">A0</span> <span class="keyword">const</span> <span class="special">&amp;</span> <span class="identifier">a0</span><span class="special">,</span> <span class="identifier">A1</span> <span class="keyword">const</span> <span class="special">&amp;</span> <span class="identifier">a1</span> <span class="special">...</span> <span class="identifier">AN</span> <span class="keyword">const</span> <span class="special">&amp;</span> <span class="identifier">an</span><span class="special">);</span>
  121. </pre>
  122. <p>
  123. This macros also adds a specialization for <code class="computeroutput"><span class="identifier">meta_grammar</span><span class="special">::</span><span class="identifier">case_</span><span class="special">&lt;</span><span class="identifier">tag</span><span class="special">::</span><span class="identifier">name</span><span class="special">&gt;</span></code> to enable the rule for further use
  124. in actions.
  125. </p>
  126. <a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression.header"></a><h6>
  127. <a name="id844495"></a>
  128. <a class="link" href="boilerplate_macros.html#phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression.header">Header</a>
  129. </h6>
  130. <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="identifier">core</span><span class="special">/</span><span class="identifier">expression</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  131. </pre>
  132. <a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression.example"></a><h6>
  133. <a name="id844579"></a>
  134. <a class="link" href="boilerplate_macros.html#phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression.example">Example</a>
  135. </h6>
  136. <p>
  137. The example from the previous section can be rewritten as:
  138. </p>
  139. <pre class="programlisting"><span class="identifier">BOOST_PHOENIX_DEFINE_EXPRESSION</span><span class="special">(</span>
  140. <span class="special">(</span><span class="identifier">plus</span><span class="special">)</span>
  141. <span class="special">,</span> <span class="special">(</span><span class="identifier">meta_grammar</span><span class="special">)</span> <span class="comment">// Lhs
  142. </span> <span class="special">(</span><span class="identifier">meta_grammar</span><span class="special">)</span> <span class="comment">// Rhs
  143. </span><span class="special">)</span>
  144. <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Lhs</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Rhs</span><span class="special">&gt;</span>
  145. <span class="keyword">typename</span> <span class="identifier">plus</span><span class="special">&lt;</span><span class="identifier">Lhs</span><span class="special">,</span> <span class="identifier">Rhs</span><span class="special">&gt;::</span><span class="identifier">type</span>
  146. <span class="identifier">plus</span><span class="special">(</span><span class="identifier">Lhs</span> <span class="keyword">const</span> <span class="special">&amp;</span> <span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">Rhs</span> <span class="keyword">const</span> <span class="special">&amp;</span> <span class="identifier">rhs</span><span class="special">)</span>
  147. <span class="special">{</span>
  148. <span class="keyword">return</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">plus</span><span class="special">&lt;</span><span class="identifier">Lhs</span><span class="special">,</span> <span class="identifier">Rhs</span><span class="special">&gt;::</span><span class="identifier">make</span><span class="special">(</span><span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">rhs</span><span class="special">);</span>
  149. <span class="special">}</span>
  150. </pre>
  151. </div>
  152. <div class="section">
  153. <div class="titlepage"><div><div><h5 class="title">
  154. <a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_vararg"></a><a class="link" href="boilerplate_macros.html#phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_vararg" title="BOOST_PHOENIX_DEFINE_EXPRESSION_VARARG">BOOST_PHOENIX_DEFINE_EXPRESSION_VARARG</a>
  155. </h5></div></div></div>
  156. <a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_vararg.description"></a><h6>
  157. <a name="id844930"></a>
  158. <a class="link" href="boilerplate_macros.html#phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_vararg.description">Description</a>
  159. </h6>
  160. <p>
  161. <code class="computeroutput"><span class="identifier">BOOST_PHOENIX_DEFINE_EXPRESSION_VARARG</span></code>
  162. is a macro that can be used to generate all the necessary boilerplate
  163. to create Phoenix Expressions
  164. </p>
  165. <a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_vararg.synopsis"></a><h6>
  166. <a name="id844966"></a>
  167. <a class="link" href="boilerplate_macros.html#phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_vararg.synopsis">Synopsis</a>
  168. </h6>
  169. <pre class="programlisting"><span class="identifier">BOOST_PHOENIX_DEFINE_EXPRESSION_VARARG</span><span class="special">(</span>
  170. <span class="special">(</span><span class="identifier">namespace_seq</span><span class="special">)(</span><span class="identifier">name</span><span class="special">)</span>
  171. <span class="special">,</span> <span class="special">(</span><span class="identifier">child_grammar0</span><span class="special">)</span>
  172. <span class="special">(</span><span class="identifier">child_grammar1</span><span class="special">)</span>
  173. <span class="special">...</span>
  174. <span class="special">(</span><span class="identifier">child_grammarN</span><span class="special">)</span>
  175. <span class="special">,</span> <span class="identifier">N</span>
  176. <span class="special">)</span>
  177. </pre>
  178. <a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_vararg.semantics"></a><h6>
  179. <a name="id845097"></a>
  180. <a class="link" href="boilerplate_macros.html#phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_vararg.semantics">Semantics</a>
  181. </h6>
  182. <p>
  183. The above macro generates the necessary code for an expression <code class="computeroutput"><span class="identifier">name</span></code> in namespace <code class="computeroutput"><span class="identifier">namespace_seq</span></code>.
  184. <code class="computeroutput"><span class="identifier">N</span></code> is the maximum number
  185. of variable children. All but the last elements in the grammar sequence
  186. are required children of the expression, and the last denotes a variable
  187. number of children. The number of children an expression of this kind
  188. can hold is therefor <code class="computeroutput"><span class="identifier">N</span><span class="special">-</span><span class="number">1</span></code> plus
  189. the size of the sequence
  190. </p>
  191. <p>
  192. The macro should be used at global scope. <code class="computeroutput"><span class="identifier">namespace_seq</span></code>
  193. shall be the sequence of namespaces under which the following symbols
  194. will be defined:
  195. </p>
  196. <pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">tag</span>
  197. <span class="special">{</span>
  198. <span class="keyword">struct</span> <span class="identifier">name</span><span class="special">;</span>
  199. <span class="special">}</span>
  200. <span class="keyword">namespace</span> <span class="identifier">expression</span>
  201. <span class="special">{</span>
  202. <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">A0</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">A1</span> <span class="special">...</span> <span class="keyword">typename</span> <span class="identifier">AN</span><span class="special">&gt;</span>
  203. <span class="keyword">struct</span> <span class="identifier">name</span>
  204. <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">phoenix</span><span class="special">::</span><span class="identifier">expr</span><span class="special">&lt;</span>
  205. <span class="identifier">tag</span><span class="special">::</span><span class="identifier">name</span>
  206. <span class="special">,</span> <span class="identifier">A0</span>
  207. <span class="special">,</span> <span class="identifier">A1</span>
  208. <span class="special">...</span>
  209. <span class="special">,</span> <span class="identifier">AN</span>
  210. <span class="special">&gt;</span>
  211. <span class="special">{};</span>
  212. <span class="special">}</span>
  213. <span class="keyword">namespace</span> <span class="identifier">rule</span>
  214. <span class="special">{</span>
  215. <span class="keyword">struct</span> <span class="identifier">name</span>
  216. <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">name</span><span class="special">&lt;</span>
  217. <span class="identifier">child_grammar0</span>
  218. <span class="special">,</span> <span class="identifier">child_grammar1</span>
  219. <span class="special">...</span>
  220. <span class="special">,</span> <span class="identifier">proto</span><span class="special">::</span><span class="identifier">vararg</span><span class="special">&lt;</span><span class="identifier">child_grammarN</span><span class="special">&gt;</span>
  221. <span class="special">&gt;</span>
  222. <span class="special">{};</span>
  223. <span class="special">}</span>
  224. <span class="keyword">namespace</span> <span class="identifier">functional</span>
  225. <span class="special">{</span>
  226. <span class="keyword">struct</span> <span class="identifier">make_name</span><span class="special">;</span> <span class="comment">// A polymorphic function object that can be called to create the expression node
  227. </span><span class="special">}</span>
  228. <span class="keyword">namespace</span> <span class="identifier">result_of</span>
  229. <span class="special">{</span>
  230. <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">A0</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">A1</span> <span class="special">...</span> <span class="keyword">typename</span> <span class="identifier">AN</span><span class="special">&gt;</span>
  231. <span class="keyword">struct</span> <span class="identifier">make_name</span><span class="special">;</span> <span class="comment">// The result type of the expression node
  232. </span><span class="special">}</span>
  233. <span class="comment">// convenience polymorphic function to create an expression node
  234. </span><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">A0</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">A1</span> <span class="special">...</span> <span class="keyword">typename</span> <span class="identifier">AN</span><span class="special">&gt;</span>
  235. <span class="identifier">result_of</span><span class="special">::</span><span class="identifier">make_name</span><span class="special">&lt;</span><span class="identifier">A0</span><span class="special">,</span> <span class="identifier">A1</span> <span class="special">...</span> <span class="identifier">AN</span><span class="special">&gt;</span>
  236. <span class="identifier">make_name</span><span class="special">(</span><span class="identifier">A0</span> <span class="keyword">const</span> <span class="special">&amp;</span> <span class="identifier">a0</span><span class="special">,</span> <span class="identifier">A1</span> <span class="keyword">const</span> <span class="special">&amp;</span> <span class="identifier">a1</span> <span class="special">...</span> <span class="identifier">AN</span> <span class="keyword">const</span> <span class="special">&amp;</span> <span class="identifier">an</span><span class="special">);</span>
  237. </pre>
  238. <p>
  239. This macros also adds a specialization for <code class="computeroutput"><span class="identifier">meta_grammar</span><span class="special">::</span><span class="identifier">case_</span><span class="special">&lt;</span><span class="identifier">tag</span><span class="special">::</span><span class="identifier">name</span><span class="special">&gt;</span></code> to enable the rule for further use
  240. in actions.
  241. </p>
  242. <a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_vararg.header"></a><h6>
  243. <a name="id845946"></a>
  244. <a class="link" href="boilerplate_macros.html#phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_vararg.header">Header</a>
  245. </h6>
  246. <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="identifier">core</span><span class="special">/</span><span class="identifier">expression</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  247. </pre>
  248. <a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_vararg.example"></a><h6>
  249. <a name="id846029"></a>
  250. <a class="link" href="boilerplate_macros.html#phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_vararg.example">Example</a>
  251. </h6>
  252. <pre class="programlisting"><span class="identifier">BOOST_PHOENIX_DEFINE_EXPRESSION_VARARG</span><span class="special">(</span>
  253. <span class="special">(</span><span class="identifier">boost</span><span class="special">)(</span><span class="identifier">phoenix</span><span class="special">)(</span><span class="identifier">mem_fun_ptr</span><span class="special">)</span>
  254. <span class="special">,</span> <span class="special">(</span><span class="identifier">meta_grammar</span><span class="special">)</span> <span class="comment">// Pointer to Object
  255. </span> <span class="special">(</span><span class="identifier">meta_grammar</span><span class="special">)</span> <span class="comment">// Member pointer
  256. </span> <span class="special">(</span><span class="identifier">meta_grammar</span><span class="special">)</span> <span class="comment">// Variable number of arguments
  257. </span> <span class="special">,</span> <span class="identifier">BOOST_PHOENIX_LIMIT</span>
  258. <span class="special">)</span>
  259. </pre>
  260. <p>
  261. This defines the member function pointer operator expression as described
  262. in <a class="link" href="../../modules/operator.html" title="Operator">operators</a>.
  263. </p>
  264. </div>
  265. <div class="section">
  266. <div class="titlepage"><div><div><h5 class="title">
  267. <a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext"></a><a class="link" href="boilerplate_macros.html#phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext" title="BOOST_PHOENIX_DEFINE_EXPRESSION_EXT">BOOST_PHOENIX_DEFINE_EXPRESSION_EXT</a>
  268. </h5></div></div></div>
  269. <a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext.description"></a><h6>
  270. <a name="id846209"></a>
  271. <a class="link" href="boilerplate_macros.html#phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext.description">Description</a>
  272. </h6>
  273. <p>
  274. <code class="computeroutput"><span class="identifier">BOOST_PHOENIX_DEFINE_EXPRESSION_EXT</span></code>
  275. is a macro that can be used to generate all the necessary boilerplate
  276. to create Phoenix Expressions
  277. </p>
  278. <a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext.synopsis"></a><h6>
  279. <a name="id846245"></a>
  280. <a class="link" href="boilerplate_macros.html#phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext.synopsis">Synopsis</a>
  281. </h6>
  282. <pre class="programlisting"><span class="identifier">BOOST_PHOENIX_DEFINE_EXPRESSION_EXT</span><span class="special">(</span>
  283. <span class="identifier">actor</span>
  284. <span class="special">,</span> <span class="special">(</span><span class="identifier">namespace_seq</span><span class="special">)(</span><span class="identifier">name</span><span class="special">)</span>
  285. <span class="special">,</span> <span class="special">(</span><span class="identifier">child_grammar0</span><span class="special">)</span>
  286. <span class="special">(</span><span class="identifier">child_grammar1</span><span class="special">)</span>
  287. <span class="special">...</span>
  288. <span class="special">(</span><span class="identifier">child_grammarN</span><span class="special">)</span>
  289. <span class="special">,</span> <span class="identifier">N</span>
  290. <span class="special">)</span>
  291. </pre>
  292. <a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext.semantics"></a><h6>
  293. <a name="id846388"></a>
  294. <a class="link" href="boilerplate_macros.html#phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext.semantics">Semantics</a>
  295. </h6>
  296. <p>
  297. The above macro generates the necessary code for an expression <code class="computeroutput"><span class="identifier">name</span></code> in namespace <code class="computeroutput"><span class="identifier">namespace_seq</span></code>.
  298. The sequence of <code class="computeroutput"><span class="special">(</span><span class="identifier">child_grammarN</span><span class="special">)</span></code> declares how many children the expression
  299. will have and what <code class="computeroutput"><span class="identifier">proto</span><span class="special">::</span><span class="identifier">grammar</span></code>
  300. they match.
  301. </p>
  302. <p>
  303. The macro should be used at global scope. <code class="computeroutput"><span class="identifier">namespace_seq</span></code>
  304. shall be the sequence of namespaces under which the following symbols
  305. will be defined:
  306. </p>
  307. <pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">tag</span>
  308. <span class="special">{</span>
  309. <span class="keyword">struct</span> <span class="identifier">name</span><span class="special">;</span>
  310. <span class="special">}</span>
  311. <span class="keyword">namespace</span> <span class="identifier">expression</span>
  312. <span class="special">{</span>
  313. <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">A0</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">A1</span> <span class="special">...</span> <span class="keyword">typename</span> <span class="identifier">AN</span><span class="special">&gt;</span>
  314. <span class="keyword">struct</span> <span class="identifier">name</span>
  315. <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">phoenix</span><span class="special">::</span><span class="identifier">expr_ext</span><span class="special">&lt;</span>
  316. <span class="identifier">actor</span>
  317. <span class="special">,</span> <span class="identifier">tag</span><span class="special">::</span><span class="identifier">name</span>
  318. <span class="special">,</span> <span class="identifier">A0</span>
  319. <span class="special">,</span> <span class="identifier">A1</span>
  320. <span class="special">...</span>
  321. <span class="special">,</span> <span class="identifier">AN</span>
  322. <span class="special">&gt;</span>
  323. <span class="special">}</span>
  324. <span class="keyword">namespace</span> <span class="identifier">rule</span>
  325. <span class="special">{</span>
  326. <span class="keyword">struct</span> <span class="identifier">name</span>
  327. <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">phoenix</span><span class="special">::</span><span class="identifier">expr</span><span class="special">&lt;</span>
  328. <span class="identifier">child_grammar0</span>
  329. <span class="special">,</span> <span class="identifier">child_grammar1</span>
  330. <span class="special">...</span>
  331. <span class="special">,</span> <span class="identifier">child_grammarN</span>
  332. <span class="special">&gt;</span>
  333. <span class="special">{};</span>
  334. <span class="special">}</span>
  335. <span class="keyword">namespace</span> <span class="identifier">functional</span>
  336. <span class="special">{</span>
  337. <span class="keyword">struct</span> <span class="identifier">make_name</span><span class="special">;</span> <span class="comment">// A polymorphic function object that can be called to create the expression node
  338. </span><span class="special">}</span>
  339. <span class="keyword">namespace</span> <span class="identifier">result_of</span>
  340. <span class="special">{</span>
  341. <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">A0</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">A1</span> <span class="special">...</span> <span class="keyword">typename</span> <span class="identifier">AN</span><span class="special">&gt;</span>
  342. <span class="keyword">struct</span> <span class="identifier">make_name</span><span class="special">;</span> <span class="comment">// The result type of the expression node
  343. </span><span class="special">}</span>
  344. <span class="comment">// convenience polymorphic function to create an expression node
  345. </span><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">A0</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">A1</span> <span class="special">...</span> <span class="keyword">typename</span> <span class="identifier">AN</span><span class="special">&gt;</span>
  346. <span class="identifier">result_of</span><span class="special">::</span><span class="identifier">make_name</span><span class="special">&lt;</span><span class="identifier">A0</span><span class="special">,</span> <span class="identifier">A1</span> <span class="special">...</span> <span class="identifier">AN</span><span class="special">&gt;</span>
  347. <span class="identifier">make_name</span><span class="special">(</span><span class="identifier">A0</span> <span class="keyword">const</span> <span class="special">&amp;</span> <span class="identifier">a0</span><span class="special">,</span> <span class="identifier">A1</span> <span class="keyword">const</span> <span class="special">&amp;</span> <span class="identifier">a1</span> <span class="special">...</span> <span class="identifier">AN</span> <span class="keyword">const</span> <span class="special">&amp;</span> <span class="identifier">an</span><span class="special">);</span>
  348. </pre>
  349. <p>
  350. This macros also adds a specialization for <code class="computeroutput"><span class="identifier">meta_grammar</span><span class="special">::</span><span class="identifier">case_</span><span class="special">&lt;</span><span class="identifier">tag</span><span class="special">::</span><span class="identifier">name</span><span class="special">&gt;</span></code> to enable the rule for further use
  351. in actions.
  352. </p>
  353. <a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext.header"></a><h6>
  354. <a name="id847236"></a>
  355. <a class="link" href="boilerplate_macros.html#phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext.header">Header</a>
  356. </h6>
  357. <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="identifier">core</span><span class="special">/</span><span class="identifier">expression</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  358. </pre>
  359. <a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext.example"></a><h6>
  360. <a name="id847320"></a>
  361. <a class="link" href="boilerplate_macros.html#phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext.example">Example</a>
  362. </h6>
  363. <pre class="programlisting"><span class="identifier">BOOST_PHOENIX_DEFINE_EXPRESSION_EXT</span><span class="special">(</span>
  364. <span class="identifier">if_actor</span>
  365. <span class="special">,</span> <span class="special">(</span><span class="identifier">boost</span><span class="special">)(</span><span class="identifier">phoenix</span><span class="special">)(</span><span class="identifier">if_</span><span class="special">)</span>
  366. <span class="special">,</span> <span class="special">(</span><span class="identifier">meta_grammar</span><span class="special">)</span> <span class="comment">// Cond
  367. </span> <span class="special">(</span><span class="identifier">meta_grammar</span><span class="special">)</span> <span class="comment">// Then
  368. </span><span class="special">)</span>
  369. </pre>
  370. <p>
  371. This defines the if_ expression. The custom actor defines <code class="computeroutput"><span class="identifier">else_</span></code> as a member.
  372. </p>
  373. </div>
  374. <div class="section">
  375. <div class="titlepage"><div><div><h5 class="title">
  376. <a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext_vararg"></a><a class="link" href="boilerplate_macros.html#phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext_vararg" title="BOOST_PHOENIX_DEFINE_EXPRESSION_EXT_VARARG">BOOST_PHOENIX_DEFINE_EXPRESSION_EXT_VARARG</a>
  377. </h5></div></div></div>
  378. <a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext_vararg.description"></a><h6>
  379. <a name="id847483"></a>
  380. <a class="link" href="boilerplate_macros.html#phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext_vararg.description">Description</a>
  381. </h6>
  382. <p>
  383. <code class="computeroutput"><span class="identifier">BOOST_PHOENIX_DEFINE_EXPRESSION_EXT_VARARG</span></code>
  384. is a macro that can be used to generate all the necessary boilerplate
  385. to create Phoenix Expressions
  386. </p>
  387. <a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext_vararg.synopsis"></a><h6>
  388. <a name="id847519"></a>
  389. <a class="link" href="boilerplate_macros.html#phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext_vararg.synopsis">Synopsis</a>
  390. </h6>
  391. <pre class="programlisting"><span class="identifier">BOOST_PHOENIX_DEFINE_EXPRESSION_EXT_VARARG</span><span class="special">(</span>
  392. <span class="identifier">actor</span>
  393. <span class="special">,</span> <span class="special">(</span><span class="identifier">namespace_seq</span><span class="special">)(</span><span class="identifier">name</span><span class="special">)</span>
  394. <span class="special">,</span> <span class="special">(</span><span class="identifier">child_grammar0</span><span class="special">)</span>
  395. <span class="special">(</span><span class="identifier">child_grammar1</span><span class="special">)</span>
  396. <span class="special">...</span>
  397. <span class="special">(</span><span class="identifier">child_grammarN</span><span class="special">)</span>
  398. <span class="special">,</span> <span class="identifier">N</span>
  399. <span class="special">)</span>
  400. </pre>
  401. <a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext_vararg.semantics"></a><h6>
  402. <a name="id847663"></a>
  403. <a class="link" href="boilerplate_macros.html#phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext_vararg.semantics">Semantics</a>
  404. </h6>
  405. <p>
  406. The above macro generates the necessary code for an expression <code class="computeroutput"><span class="identifier">name</span></code> in namespace <code class="computeroutput"><span class="identifier">namespace_seq</span></code>.
  407. <code class="computeroutput"><span class="identifier">N</span></code> is the maximum number
  408. of variable children. All but the last elements in the grammar sequence
  409. are required children of the expression, and the last denotes a variable
  410. number of children. The number of children an expression of this kind
  411. can hold is therefor <code class="computeroutput"><span class="identifier">N</span><span class="special">-</span><span class="number">1</span></code> plus
  412. the size of the sequence
  413. </p>
  414. <p>
  415. The macro should be used at global scope. <code class="computeroutput"><span class="identifier">namespace_seq</span></code>
  416. shall be the sequence of namespaces under which the following symbols
  417. will be defined:
  418. </p>
  419. <pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">tag</span>
  420. <span class="special">{</span>
  421. <span class="keyword">struct</span> <span class="identifier">name</span><span class="special">;</span>
  422. <span class="special">}</span>
  423. <span class="keyword">namespace</span> <span class="identifier">expression</span>
  424. <span class="special">{</span>
  425. <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">A0</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">A1</span> <span class="special">...</span> <span class="keyword">typename</span> <span class="identifier">AN</span><span class="special">&gt;</span>
  426. <span class="keyword">struct</span> <span class="identifier">name</span>
  427. <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">phoenix</span><span class="special">::</span><span class="identifier">expr_ext</span><span class="special">&lt;</span>
  428. <span class="identifier">actor</span>
  429. <span class="special">,</span> <span class="identifier">tag</span><span class="special">::</span><span class="identifier">name</span>
  430. <span class="special">,</span> <span class="identifier">A0</span>
  431. <span class="special">,</span> <span class="identifier">A1</span>
  432. <span class="special">...</span>
  433. <span class="special">,</span> <span class="identifier">AN</span>
  434. <span class="special">&gt;</span>
  435. <span class="special">{};</span>
  436. <span class="special">}</span>
  437. <span class="keyword">namespace</span> <span class="identifier">rule</span>
  438. <span class="special">{</span>
  439. <span class="keyword">struct</span> <span class="identifier">name</span>
  440. <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">name</span><span class="special">&lt;</span>
  441. <span class="identifier">child_grammar0</span>
  442. <span class="special">,</span> <span class="identifier">child_grammar1</span>
  443. <span class="special">...</span>
  444. <span class="special">,</span> <span class="identifier">proto</span><span class="special">::</span><span class="identifier">vararg</span><span class="special">&lt;</span><span class="identifier">child_grammarN</span><span class="special">&gt;</span>
  445. <span class="special">&gt;</span>
  446. <span class="special">{};</span>
  447. <span class="special">}</span>
  448. <span class="keyword">namespace</span> <span class="identifier">functional</span>
  449. <span class="special">{</span>
  450. <span class="keyword">struct</span> <span class="identifier">make_name</span><span class="special">;</span> <span class="comment">// A polymorphic function object that can be called to create the expression node
  451. </span><span class="special">}</span>
  452. <span class="keyword">namespace</span> <span class="identifier">result_of</span>
  453. <span class="special">{</span>
  454. <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">A0</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">A1</span> <span class="special">...</span> <span class="keyword">typename</span> <span class="identifier">AN</span><span class="special">&gt;</span>
  455. <span class="keyword">struct</span> <span class="identifier">make_name</span><span class="special">;</span> <span class="comment">// The result type of the expression node
  456. </span><span class="special">}</span>
  457. <span class="comment">// convenience polymorphic function to create an expression node
  458. </span><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">A0</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">A1</span> <span class="special">...</span> <span class="keyword">typename</span> <span class="identifier">AN</span><span class="special">&gt;</span>
  459. <span class="identifier">result_of</span><span class="special">::</span><span class="identifier">make_name</span><span class="special">&lt;</span><span class="identifier">A0</span><span class="special">,</span> <span class="identifier">A1</span> <span class="special">...</span> <span class="identifier">AN</span><span class="special">&gt;</span>
  460. <span class="identifier">make_name</span><span class="special">(</span><span class="identifier">A0</span> <span class="keyword">const</span> <span class="special">&amp;</span> <span class="identifier">a0</span><span class="special">,</span> <span class="identifier">A1</span> <span class="keyword">const</span> <span class="special">&amp;</span> <span class="identifier">a1</span> <span class="special">...</span> <span class="identifier">AN</span> <span class="keyword">const</span> <span class="special">&amp;</span> <span class="identifier">an</span><span class="special">);</span>
  461. </pre>
  462. <p>
  463. This macros also adds a specialization for <code class="computeroutput"><span class="identifier">meta_grammar</span><span class="special">::</span><span class="identifier">case_</span><span class="special">&lt;</span><span class="identifier">tag</span><span class="special">::</span><span class="identifier">name</span><span class="special">&gt;</span></code> to enable the rule for further use
  464. in actions.
  465. </p>
  466. <a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext_vararg.header"></a><h6>
  467. <a name="id848523"></a>
  468. <a class="link" href="boilerplate_macros.html#phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext_vararg.header">Header</a>
  469. </h6>
  470. <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="identifier">core</span><span class="special">/</span><span class="identifier">expression</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  471. </pre>
  472. <a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext_vararg.example"></a><h6>
  473. <a name="id848607"></a>
  474. <a class="link" href="boilerplate_macros.html#phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext_vararg.example">Example</a>
  475. </h6>
  476. <p>
  477. TBD
  478. </p>
  479. </div>
  480. </div>
  481. <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
  482. <td align="left"></td>
  483. <td align="right"><div class="copyright-footer">Copyright &#169; 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p>
  484. Distributed under the Boost Software License, Version 1.0. (See accompanying
  485. 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>)
  486. </p>
  487. </div></td>
  488. </tr></table>
  489. <hr>
  490. <div class="spirit-nav">
  491. <a accesskey="p" href="../expression.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../expression.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="../actions.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
  492. </div>
  493. </body>
  494. </html>