blob: 1db9d9d745a2917a2e6f19b219b5e2ba7c672f3d [file] [log] [blame]
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Parser Directive for Attribute Commit/Rollback (hold[])</title>
<link rel="stylesheet" href="../../../../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.0">
<link rel="home" href="../../../../index.html" title="Spirit 2.5">
<link rel="up" href="../directive.html" title="Parser Directives">
<link rel="prev" href="skip.html" title="Parser Directive Re-Establishing Skipping (skip[])">
<link rel="next" href="as.html" title="Parser Directives Forcing Atomic Assignment (as&lt;T&gt;, as_string[], as_wstring[])">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr>
<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../../../boost.png"></td>
<td align="center"><a href="../../../../../../../../index.html">Home</a></td>
<td align="center"><a href="../../../../../../../../libs/libraries.htm">Libraries</a></td>
<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
<td align="center"><a href="../../../../../../../../more/index.htm">More</a></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="skip.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../directive.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="as.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h5 class="title">
<a name="spirit.qi.reference.directive.hold"></a><a class="link" href="hold.html" title="Parser Directive for Attribute Commit/Rollback (hold[])">Parser Directive
for Attribute Commit/Rollback (<code class="computeroutput"><span class="identifier">hold</span><span class="special">[]</span></code>)</a>
</h5></div></div></div>
<a name="spirit.qi.reference.directive.hold.description"></a><h6>
<a name="spirit.qi.reference.directive.hold.description-heading"></a>
<a class="link" href="hold.html#spirit.qi.reference.directive.hold.description">Description</a>
</h6>
<p>
The <code class="computeroutput"><span class="identifier">hold</span><span class="special">[]</span></code>
directive helps managing attributes, mainly for alternative parsers.
It instantiates a new attribute instance for the embedded parser. The
value of that attribute instance is copied to the outer attribute if
the embedded parser succeeds and it is discarded otherwise. Alternative
parsers normally do not rollback changes made to the outer attribute
by an failed alternative. Wrapping those alternatives into a <code class="computeroutput"><span class="identifier">hold</span><span class="special">[]</span></code>
directive ensures that only the succeeding alternative gets to modify
the attribute.
</p>
<a name="spirit.qi.reference.directive.hold.header"></a><h6>
<a name="spirit.qi.reference.directive.hold.header-heading"></a>
<a class="link" href="hold.html#spirit.qi.reference.directive.hold.header">Header</a>
</h6>
<pre class="programlisting"><span class="comment">// forwards to &lt;boost/spirit/home/qi/directive/hold.hpp&gt;
</span><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">spirit</span><span class="special">/</span><span class="identifier">include</span><span class="special">/</span><span class="identifier">qi_hold</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
</pre>
<p>
Also, see <a class="link" href="../../../structure/include.html" title="Include">Include Structure</a>.
</p>
<a name="spirit.qi.reference.directive.hold.namespace"></a><h6>
<a name="spirit.qi.reference.directive.hold.namespace-heading"></a>
<a class="link" href="hold.html#spirit.qi.reference.directive.hold.namespace">Namespace</a>
</h6>
<div class="informaltable"><table class="table">
<colgroup><col></colgroup>
<thead><tr><th>
<p>
Name
</p>
</th></tr></thead>
<tbody><tr><td>
<p>
<code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">spirit</span><span class="special">::</span><span class="identifier">hold</span> <span class="comment">// alias:
boost::spirit::qi::hold</span></code>
</p>
</td></tr></tbody>
</table></div>
<a name="spirit.qi.reference.directive.hold.model_of"></a><h6>
<a name="spirit.qi.reference.directive.hold.model_of-heading"></a>
<a class="link" href="hold.html#spirit.qi.reference.directive.hold.model_of">Model of</a>
</h6>
<div class="blockquote"><blockquote class="blockquote"><p>
<a class="link" href="../parser_concepts/unaryparser.html" title="UnaryParser"><code class="computeroutput"><span class="identifier">UnaryParser</span></code></a>
</p></blockquote></div>
<div class="variablelist">
<p class="title"><b>Notation</b></p>
<dl>
<dt><span class="term"><code class="computeroutput"><span class="identifier">a</span></code></span></dt>
<dd><p>
A <a class="link" href="../parser_concepts/parser.html" title="Parser"><code class="computeroutput"><span class="identifier">Parser</span></code></a>.
</p></dd>
</dl>
</div>
<a name="spirit.qi.reference.directive.hold.expression_semantics"></a><h6>
<a name="spirit.qi.reference.directive.hold.expression_semantics-heading"></a>
<a class="link" href="hold.html#spirit.qi.reference.directive.hold.expression_semantics">Expression
Semantics</a>
</h6>
<p>
Semantics of an expression is defined only where it differs from, or
is not defined in <a class="link" href="../parser_concepts/unaryparser.html" title="UnaryParser"><code class="computeroutput"><span class="identifier">UnaryParser</span></code></a>.
</p>
<div class="informaltable"><table class="table">
<colgroup>
<col>
<col>
</colgroup>
<thead><tr>
<th>
<p>
Expression
</p>
</th>
<th>
<p>
Semantics
</p>
</th>
</tr></thead>
<tbody><tr>
<td>
<p>
<code class="computeroutput"><span class="identifier">hold</span><span class="special">[</span><span class="identifier">a</span><span class="special">]</span></code>
</p>
</td>
<td>
<p>
Create a new attribute instance while parsing <code class="computeroutput"><span class="identifier">a</span></code>, copying the result to
the outer attribute only after <code class="computeroutput"><span class="identifier">a</span></code>
succeeds.
</p>
</td>
</tr></tbody>
</table></div>
<a name="spirit.qi.reference.directive.hold.attributes"></a><h6>
<a name="spirit.qi.reference.directive.hold.attributes-heading"></a>
<a class="link" href="hold.html#spirit.qi.reference.directive.hold.attributes">Attributes</a>
</h6>
<p>
See <a class="link" href="../../quick_reference/compound_attribute_rules.html#spirit.qi.quick_reference.compound_attribute_rules.notation">Compound
Attribute Notation</a>.
</p>
<div class="informaltable"><table class="table">
<colgroup>
<col>
<col>
</colgroup>
<thead><tr>
<th>
<p>
Expression
</p>
</th>
<th>
<p>
Attribute
</p>
</th>
</tr></thead>
<tbody><tr>
<td>
<p>
<code class="computeroutput"><span class="identifier">hold</span><span class="special">[</span><span class="identifier">a</span><span class="special">]</span></code>
</p>
</td>
<td>
<p>
</p>
<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">a</span><span class="special">:</span> <span class="identifier">A</span> <span class="special">--&gt;</span> <span class="identifier">hold</span><span class="special">[</span><span class="identifier">a</span><span class="special">]:</span> <span class="identifier">A</span>
<span class="identifier">a</span><span class="special">:</span> <span class="identifier">Unused</span> <span class="special">--&gt;</span> <span class="identifier">hold</span><span class="special">[</span><span class="identifier">a</span><span class="special">]:</span> <span class="identifier">Unused</span></pre>
<p>
</p>
</td>
</tr></tbody>
</table></div>
<div class="note"><table border="0" summary="Note">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../images/note.png"></td>
<th align="left">Note</th>
</tr>
<tr><td align="left" valign="top"><p>
The <code class="computeroutput"><span class="identifier">hold</span><span class="special">[]</span></code>
directive uses <code class="computeroutput"><span class="identifier">swap</span><span class="special">()</span></code> to implement the rollback/commit
semantics for the attribute. For this reason the attribute type needs
to to be usable with <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">swap</span></code>
(needs to either define a proper overload for <code class="computeroutput"><span class="identifier">swap</span><span class="special">(</span><span class="identifier">attribute_type</span><span class="special">&amp;,</span> <span class="identifier">attribute_type</span><span class="special">&amp;)</span></code> or expose a member function
<code class="computeroutput"><span class="identifier">attribute_type</span><span class="special">::</span><span class="identifier">swap</span><span class="special">(</span><span class="identifier">attribute_type</span><span class="special">&amp;)</span></code>.
</p></td></tr>
</table></div>
<a name="spirit.qi.reference.directive.hold.complexity"></a><h6>
<a name="spirit.qi.reference.directive.hold.complexity-heading"></a>
<a class="link" href="hold.html#spirit.qi.reference.directive.hold.complexity">Complexity</a>
</h6>
<div class="blockquote"><blockquote class="blockquote"><p>
The complexity is defined by the complexity of the subject parser,
<code class="computeroutput"><span class="identifier">a</span></code>
</p></blockquote></div>
<a name="spirit.qi.reference.directive.hold.example"></a><h6>
<a name="spirit.qi.reference.directive.hold.example-heading"></a>
<a class="link" href="hold.html#spirit.qi.reference.directive.hold.example">Example</a>
</h6>
<div class="note"><table border="0" summary="Note">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../images/note.png"></td>
<th align="left">Note</th>
</tr>
<tr><td align="left" valign="top"><p>
The test harness for the example(s) below is presented in the <a class="link" href="../basics.html#spirit.qi.reference.basics.examples">Basics Examples</a>
section.
</p></td></tr>
</table></div>
<p>
Some using declarations:
</p>
<p>
</p>
<pre class="programlisting"><span class="keyword">using</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">spirit</span><span class="special">::</span><span class="identifier">qi</span><span class="special">::</span><span class="identifier">hold</span><span class="special">;</span>
<span class="keyword">using</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">spirit</span><span class="special">::</span><span class="identifier">qi</span><span class="special">::</span><span class="identifier">int_</span><span class="special">;</span>
<span class="keyword">using</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">spirit</span><span class="special">::</span><span class="identifier">qi</span><span class="special">::</span><span class="identifier">attr</span><span class="special">;</span>
</pre>
<p>
</p>
<p>
The use of <code class="computeroutput"><span class="identifier">hold</span><span class="special">[]</span></code>
here will make sure the changes to the attribute caused by the (failing)
first alternative will not be visible after the whole parsing succeeded.
</p>
<p>
</p>
<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">v</span><span class="special">;</span>
<span class="identifier">test_phrase_parser_attr</span><span class="special">(</span><span class="string">"123"</span><span class="special">,</span>
<span class="identifier">hold</span><span class="special">[</span><span class="identifier">int_</span> <span class="special">&gt;&gt;</span> <span class="char">':'</span> <span class="special">&gt;&gt;</span> <span class="identifier">int_</span><span class="special">]</span> <span class="special">|</span> <span class="identifier">int_</span> <span class="special">&gt;&gt;</span> <span class="identifier">attr</span><span class="special">(</span><span class="number">0</span><span class="special">),</span> <span class="identifier">v</span><span class="special">);</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">v</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">&lt;&lt;</span> <span class="string">","</span> <span class="special">&lt;&lt;</span> <span class="identifier">v</span><span class="special">[</span><span class="number">1</span><span class="special">]</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> <span class="comment">// will output: &gt;123,0&lt;
</span></pre>
<p>
</p>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright &#169; 2001-2011 Joel de Guzman, Hartmut Kaiser<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
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>)
</p>
</div></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="skip.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../directive.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="as.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>