<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Boost.Spirit &#187; Spirit2 Release</title>
	<atom:link href="http://boost-spirit.com/home/category/spirit2-release/feed/" rel="self" type="application/rss+xml" />
	<link>http://boost-spirit.com/home</link>
	<description>Home of The Boost.Spirit Library</description>
	<lastBuildDate>Sun, 04 Dec 2011 22:11:29 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Dispatching on Expectation Point Failures</title>
		<link>http://boost-spirit.com/home/2011/02/28/dispatching-on-expectation-point-failures/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=dispatching-on-expectation-point-failures</link>
		<comments>http://boost-spirit.com/home/2011/02/28/dispatching-on-expectation-point-failures/#comments</comments>
		<pubDate>Mon, 28 Feb 2011 14:23:06 +0000</pubDate>
		<dc:creator>Rob Stewart</dc:creator>
				<category><![CDATA[Intermediate]]></category>
		<category><![CDATA[Qi Example]]></category>
		<category><![CDATA[Spirit2 Release]]></category>
		<category><![CDATA[User Experience]]></category>

		<guid isPermaLink="false">http://boost-spirit.com/home/?p=1364</guid>
		<description><![CDATA[When using expectation points, a parsing failure results in an exception that generically indicates the failure, but probably doesn&#8217;t explain the problem in the most meaningful way. It is possible to attach an error handler to react to the failed match in a more specialized way: That will produce a message like the following on [...]<br /><div><img src="http://boost-spirit.com/home/wp-content/plugins/gd-star-rating/gfx.php?value=5.0" /></div><div>Rating: 5.0/<strong>5</strong> (3 votes cast)</div><br />]]></description>
			<content:encoded><![CDATA[<p>When using expectation points, a parsing failure results in an exception that generically indicates the failure, but probably doesn&#8217;t explain the problem in the most meaningful way. It is possible to attach an error handler to react to the failed match in a more specialized way:</p>
<p><span id="more-1364"></span></p>
<pre class="brush: cpp; title: ; notranslate">
rule = alpha &gt; '!';
on_error&lt;fail&gt;(rule,
   std::cerr &lt;&lt; val(&quot;Expected '!' at offset &quot;) &lt;&lt; (_3 - _1)
      &lt;&lt; &quot; in \&quot; &lt;&lt; std::string(_1, _2) &lt;&lt; '&quot;'
      &lt;&lt; std::endl);
</pre>
<p>That will produce a message like the following on stderr:</p>
<p><code> Expected '!' at offset 7 in "Some input"</code></p>
<p>However, if there&#8217;s more than one expectation point in a rule, then the  diagnostic may be unhelpfully generic. To do otherwise, one must distinguish which  expectation point failed. While it is certainly possible to factor the  grammar into additional rules in order to have at most one expectation  point per rule, that&#8217;s not necessary and can make the grammar less readable than otherwise. Instead, the <em>what</em> parameter (<code>_4</code>) of the error handler can be used:</p>
<pre class="brush: cpp; title: ; notranslate">
rule = alpha &gt; '!';
on_error&lt;fail&gt;(rule,
   std::cerr &lt;&lt; val(&quot;Expected &quot; &lt;&lt; _4 &lt;&lt; &quot; at offset &quot;)
      &lt;&lt; (_3 - _1) &lt;&lt; &quot; in \&quot; &lt;&lt; std::string(_1, _2) &lt;&lt; '&quot;'
      &lt;&lt; std::endl);
</pre>
<p>The <em>what</em> parameter describes the failure.  In the case of an expectation point match failure, it is the name of the parser that failed to match or, if the parser is to match literal text, like <code>'!'</code> in the preceding example, the <em>what</em> parameter will be <code>"literal-char"</code> or similar. In this case, <code>_4</code> will be <code>"literal-char"</code> (in the form of a boost::spirit::utf8_string which is a specialization of std::basic_string), and thus not terribly useful in a diagnostic.</p>
<p>To make the error message more helpful, and especially in rules with more than one literal parser to distinguish, create distinct, named rules:</p>
<pre class="brush: cpp; title: ; notranslate">
exclamation = lit('!');
exclamation.name(&quot;!&quot;);
rule = alpha &gt; exclamation;
on_error&lt;fail&gt;(rule,
   std::cerr &lt;&lt; val(&quot;Expected &quot;) &lt;&lt; _4 &lt;&lt; &quot; at offset &quot;
      &lt;&lt; (_3 - _1) &lt;&lt; &quot; in \&quot; &lt;&lt; std::string(_1, _2) &lt;&lt; '&quot;'
      &lt;&lt; std::endl);
</pre>
<p>This will report <code>Expected ! at offset...</code> when the exclamation rule fails to match.</p>
<p>Since an expectation point failure is distinguished by the <em>what</em> parameter, it follows that the <em>what</em> parameter can be used to dispatch to different behavior in the error handler based upon which expectation point failed to match. Doing so can be as simple as passing the <em>what</em> parameter to an error handling function which can use normal C++ techniques for dispatch such as cascading if-else&#8217;s or a map lookup, using the <em>what</em> string as the key to find a function to call. However, Phoenix offers power to do that work within the context of the <code>on_error()</code> call:</p>
<pre class="brush: cpp; title: ; notranslate">
semicolon = lit(';');
semicolon.name(&quot;;&quot;);
rule = alpha &gt; semicolon &gt; alpha;
on_error&lt;fail&gt;(rule,
   let(_a = bind(&amp;boost::spirit::info::tag, _4))
   [
      if_(&quot;;&quot; == _a)
      [
         report_missing(_4, _1, _2, _3)
      ]
      .else_
      [
         if_(&quot;alpha&quot; == _a)
         [
            report_missing(&quot;second word&quot;, _1, _2, _3)
         ]
         .else_
         [
            report_error(_4, _1, _2, _3)
         ]
      ]
   ]);
</pre>
<p>For the last example to compile, a number of include and using directives are necessary beyond the basics you are probably accustomed to seeing:</p>
<pre class="brush: cpp; title: ; notranslate">
#include &lt;boost/spirit/home/phoenix/bind/bind_member_variable.hpp&gt;
#include &lt;boost/spirit/home/phoenix/scope/let.hpp&gt;
#include &lt;boost/spirit/home/phoenix/scope/local_variable.hpp&gt;
#include &lt;boost/spirit/home/phoenix/statement/if.hpp&gt;
using boost::phoenix::local_names;
</pre>
<p>It would seem, at first blush, that comparing to <code>_4</code> directly should work, but it doesn&#8217;t because <code>_4</code> is a Phoenix actor. Instead, a string type is needed to support the comparisons against the string literals for dispatching. In this example, a local Phoenix variable, <code>_a</code> is declared and assigned the result of binding <code>_4</code> to boost::spirit::info::tag, the field of the boost::spirit::info struct that contains the <em>what</em> string. Thus, <code>_a</code> is a variable local to the error handler that is bound to the boost::spirit::utf8_string that describes the error and supports comparisons. Note the use of Phoenix&#8217;s <code>let</code> construct to declare a local variable scope. (This <code>_a</code>, which is <code>boost::phoenix::local_names::_a</code>, can be ambiguous with <code>boost::spirit::qi::_a</code>, depending upon using directives and declarations.)</p>
<p>The two functions, <code>report_missing()</code> and <code>report_error()</code> are not defined here, but presumably would report on stderr or raise an exception to indicate that a parsing error occurred, and would report the error context from the input range <code>[_1,_2)</code> and would note the error location, within that range, as given by <code>_3</code>.</p>
<p>When dispatching in this manner, there can be other parsing errors besides expectation point match failures, hence the final <code>.else_</code> branch in the example error handler. For lack of a better response, the example just reports a generic error message that includes the <em>what</em> parameter's text to give some sort of explanation. A real world rule would possibly provide a more context-specific diagnostic.</p>
<p>A final caution regarding this technique: the compile time, maintenance burden, and code size increases with each additional expectation point to be handled. Using a map-based dispatch may well be better when the number of expectation points grows. However, the diagnostic text generation may get out of synchronization with the point in the grammar triggering it because of their being located in different parts of the code.</p>
<p>There is another way to keep the diagnostic text near the rule triggering an error, while avoiding a great deal of code within the grammar. It involves collecting the rule name and corresponding diagnostic in a structure stored in an array that is then passed to an error handler that uses the <em>what</em> parameter to select a diagnostic from the array. If that was as clear as mud, don't worry. The code should make it clear. Let's start with the rule name to diagnostic mapping which combines the structure and array within a class template:</p>
<pre class="brush: cpp; title: ; notranslate">
template &lt;size_t N&gt;
class diagnostics
{
public:
   diagnostics();

   // Adds a tag and diagnostic message pair to self.
   void
   add(char const * _tag, char const * _diagnostic);

   // Returns the diagnostic, if any, for _tag.
   char const *
   operator [](char const * _tag) const;

private:
   struct entry
   {
      char const * tag;
      char const * diagnostic;
   };

   entry  entries_[N];
   size_t size_;
};
</pre>
<p>diagnostics, as written, simply saves pointers to string literals. For more flexibility, it could store real strings (std::basic_string&lt;&gt;s, for instance), but this design is useful and simpler for exposition. To use diagnostics, one must create a grammar data member for each rule that will use it, and then populate it as needed by the rule:</p>
<pre class="brush: cpp; title: ; notranslate">
semicolon = lit(';');
semicolon.name(&quot;;&quot;);
rule = alpha &gt; semicolon &gt; alpha;
diags.add(&quot;;&quot;, &quot;Missing semicolon after first word&quot;);
diags.add(&quot;alpha&quot;, &quot;Missing second word&quot;);
on_error&lt;fail&gt;(rule,
   error_handler(ref(diags), _1, _2, _3, _4));
</pre>
<p>Notice how the first expectation point is identified by a named rule for the required semicolon, which will produce an error message or exception containing the diagnostic text <code>"Missing semicolon after first word"</code>. Similarly, if there is no word after a semicolon, then the diagnostic <code>"Missing second word"</code> will be used because the second alpha will fail to match. In each case, the expectation is that the error handler will use <code>_4</code> to indicate which rule fail to satisfy an expectation point.</p>
<p>To round out this example, here's how <code>error_handler()</code> might look:</p>
<pre class="brush: cpp; title: ; notranslate">
struct error_handler_impl
{
   template &lt;class, class, class, class, class&gt;
   struct result { typedef void type; };

   template &lt;class D, class B, class E, class W, class I&gt;
   void
   operator ()(D const &amp; _diagnostics, B _begin, E _end,
      W _where, I const &amp; _info) const
   {
      utf8_string const &amp; tag(_info.tag);
      char const * const what(tag.c_str());
      char const * diagnostic(_diagnostics[what]);
      std::string scratch;
      if (!diagnostic)
      {
         scratch.reserve(25 + tag.length());
         scratch = &quot;Invalid syntax: expected &quot;;
         scratch += tag;
         diagnostic = scratch.c_str();
      }
      raise_parsing_error(diagnostic, _begin, _end,
         _where);
   }
};
phx::function&lt;error_handler_impl&gt; error_handler;
</pre>
<p>You're probably wondering where the implementation of diagnostics' member functions are to be found. Here they are:</p>
<pre class="brush: cpp; title: ; notranslate">
template &lt;size_t N&gt;
inline
diagnostics&lt;N&gt;::diagnostics()
   : size_(0)
{
}

template &lt;size_t N&gt;
void
diagnostics&lt;N&gt;::add(char const * const _tag,
   char const * const _diagnostic)
{
   assert(size_ &lt; N);
   entry &amp; e(entries_[size_++]);
   e.tag = _tag;
   e.diagnostic = _diagnostic;
}

template &lt;size_t N&gt;
char const *
diagnostics&lt;N&gt;::operator [](char const * const _tag) const
{
   for (size_t i(0); i &lt; size_; ++i)
   {
      entry const &amp; e(entries_[i]);
      if (0 == std::strcmp(e.tag, _tag))
      {
         return e.diagnostic;
      }
   }
   return 0;
}
</pre>
<p>It should now be apparent that there are numerous ways to dispatch error handling when using expectation points, but all revolve around decoding the <em>what</em> parameter. In the end, factor your grammar to be functional and readable and then consider which expectation point failure dispatching technique fits best without sacrificing readability or performance.</p>
<br /><div><img src="http://boost-spirit.com/home/wp-content/plugins/gd-star-rating/gfx.php?value=5.0" /></div><div>Rating: 5.0/<strong>5</strong> (3 votes cast)</div><br />]]></content:encoded>
			<wfw:commentRss>http://boost-spirit.com/home/2011/02/28/dispatching-on-expectation-point-failures/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Porting Spirit 2.0 (beta) to Spirit 2.1</title>
		<link>http://boost-spirit.com/home/2009/12/10/from-spirit-2-0-beta-to-spirit-2-1/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=from-spirit-2-0-beta-to-spirit-2-1</link>
		<comments>http://boost-spirit.com/home/2009/12/10/from-spirit-2-0-beta-to-spirit-2-1/#comments</comments>
		<pubDate>Fri, 11 Dec 2009 06:57:02 +0000</pubDate>
		<dc:creator>Joel de Guzman</dc:creator>
				<category><![CDATA[Spirit2 Release]]></category>

		<guid isPermaLink="false">http://boost-spirit.com/home/?p=707</guid>
		<description><![CDATA[Spirit 2 has undergone lots of revisions from its inception to what you are seeing now. An early beta  release, dubbed Spirit 2 beta, was included as part of Boost 1.39. The adventurous among you started using it as soon as it was released. Spirit 2.1 is essentially the same as Spirit2 beta apart from [...]<br /><div><img src="http://boost-spirit.com/home/wp-content/plugins/gd-star-rating/gfx.php?value=5.0" /></div><div>Rating: 5.0/<strong>5</strong> (2 votes cast)</div><br />]]></description>
			<content:encoded><![CDATA[<p>Spirit 2 has undergone lots of revisions from its inception to what you are seeing now. An early beta  release, dubbed Spirit 2 beta, was included as part of Boost 1.39. The adventurous among you started using it as soon as it was released. Spirit 2.1 is essentially the same as Spirit2 beta apart from some cosmetic differences and QOI changes. For the sake of those who started using Spirit from 2.0 beta, here’s what’s changed:</p>
<p><a href="http://boost-spirit.com/home/?page_id=697">See full article here.</a></p>
<br /><div><img src="http://boost-spirit.com/home/wp-content/plugins/gd-star-rating/gfx.php?value=5.0" /></div><div>Rating: 5.0/<strong>5</strong> (2 votes cast)</div><br />]]></content:encoded>
			<wfw:commentRss>http://boost-spirit.com/home/2009/12/10/from-spirit-2-0-beta-to-spirit-2-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Spirit2 Advantage</title>
		<link>http://boost-spirit.com/home/2009/11/19/the-spirit2-advantage/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=the-spirit2-advantage</link>
		<comments>http://boost-spirit.com/home/2009/11/19/the-spirit2-advantage/#comments</comments>
		<pubDate>Fri, 20 Nov 2009 04:53:10 +0000</pubDate>
		<dc:creator>Joel de Guzman</dc:creator>
				<category><![CDATA[Spirit2 Release]]></category>
		<category><![CDATA[Spirit]]></category>

		<guid isPermaLink="false">http://boost-spirit.com/home/?p=530</guid>
		<description><![CDATA[Why would you want to upgrade to Spirit2 from “Classic” Spirit? Here&#8217;s a teaser: Spirit 1.x [ straight pattern matching (no actions)  ] real    0m0.359s user   0m0.332s sys     0m0.012s Spirit 1.x [ parse tree generation ] real    0m9.305s user   0m9.209s sys     0m0.076s Spirit 2.1 [ AST with variant nodes generation ] real    0m0.459s [...]<br /><div><img src="http://boost-spirit.com/home/wp-content/plugins/gd-star-rating/gfx.php?value=5.0" /></div><div>Rating: 5.0/<strong>5</strong> (3 votes cast)</div><br />]]></description>
			<content:encoded><![CDATA[<p>Why would you want to upgrade to Spirit2 from “Classic” Spirit?</p>
<p>Here&#8217;s a teaser:</p>
<blockquote><p>Spirit 1.x [ straight pattern matching (no actions)  ]<br />
real    0m0.359s<br />
user   0m0.332s<br />
sys     0m0.012s</p>
<p>Spirit 1.x [ parse tree generation ]<br />
real    0m9.305s<br />
user   0m9.209s<br />
sys     0m0.076s</p>
<p>Spirit 2.1 [ AST with variant nodes generation ]<br />
real    0m0.459s<br />
user   0m0.432s<br />
sys     0m0.028s</p></blockquote>
<p><a href="http://boost-spirit.com/home/?page_id=515">Check out this short article.</a></p>
<br /><div><img src="http://boost-spirit.com/home/wp-content/plugins/gd-star-rating/gfx.php?value=5.0" /></div><div>Rating: 5.0/<strong>5</strong> (3 votes cast)</div><br />]]></content:encoded>
			<wfw:commentRss>http://boost-spirit.com/home/2009/11/19/the-spirit2-advantage/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Spirit 2.1 Released!!!</title>
		<link>http://boost-spirit.com/home/2009/11/19/spirit-2-1-released/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=spirit-2-1-released</link>
		<comments>http://boost-spirit.com/home/2009/11/19/spirit-2-1-released/#comments</comments>
		<pubDate>Thu, 19 Nov 2009 08:07:44 +0000</pubDate>
		<dc:creator>Joel de Guzman</dc:creator>
				<category><![CDATA[Spirit2 Release]]></category>
		<category><![CDATA[Release]]></category>
		<category><![CDATA[Spirit]]></category>

		<guid isPermaLink="false">http://boost-spirit.com/home/?p=430</guid>
		<description><![CDATA[The much-awaited Spirit 2.1 is now released after more than 2 years in beta (Spirit 2.0). Boost release 1.41.0 includes Spirit 2.1. This is the official release of the new Spirit 2.1, a completely new library for parsing, lexing, and output generation. Boost release 1.41.0 is now available! This release contains one new library and [...]<br /><div><img src="http://boost-spirit.com/home/wp-content/plugins/gd-star-rating/gfx.php?value=0.0" /></div><div>Rating: 0.0/<strong>5</strong> (0 votes cast)</div><br />]]></description>
			<content:encoded><![CDATA[<div class="wp-caption alignright" style="width: 194px"><img title="Champagne" src="http://www.istockphoto.com/file_thumbview_approve/3376501/2/istockphoto_3376501-celebration-toast-with-champagne.jpg" alt="" width="184" height="207" /><p class="wp-caption-text">Champagne to us all <img src='http://boost-spirit.com/home/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p></div>
<p>The much-awaited Spirit 2.1 is now released after more than 2 years in beta (Spirit 2.0). Boost release 1.41.0 includes Spirit 2.1. This is the official release of the new Spirit 2.1, a completely new library for parsing,         lexing, and output generation.</p>
<h4>Boost release 1.41.0 is now available!</h4>
<p>This release contains one new library and numerous bug fixes for existing libraries. For details, including download links, see<br />
<a href="http://www.boost.org/users/news/version_1_41_0">http://www.boost.org/users/news/version_1_41_0</a></p>
<p>The release can also be downloaded directly from SourceForge. See<br />
<a href="http://sourceforge.net/projects/boost/files/">http://sourceforge.net/projects/boost/files/</a></p>
<p>To install this release on your system, see<br />
<a href="http://www.boost.org/doc/libs/1_41_0/more/getting_started/index.html">http://www.boost.org/doc/libs/1_41_0/more/getting_started/index.html</a></p>
<p>Thanks,</p>
<p>&#8211;The Boost release team</p>
<br /><div><img src="http://boost-spirit.com/home/wp-content/plugins/gd-star-rating/gfx.php?value=0.0" /></div><div>Rating: 0.0/<strong>5</strong> (0 votes cast)</div><br />]]></content:encoded>
			<wfw:commentRss>http://boost-spirit.com/home/2009/11/19/spirit-2-1-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Using Spirit V2.1 With Older Versions of Boost (pre V1.41)</title>
		<link>http://boost-spirit.com/home/2009/11/14/using-spirit-v2-1-with-older-versions-of-boost-pre-v1-41/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=using-spirit-v2-1-with-older-versions-of-boost-pre-v1-41</link>
		<comments>http://boost-spirit.com/home/2009/11/14/using-spirit-v2-1-with-older-versions-of-boost-pre-v1-41/#comments</comments>
		<pubDate>Sun, 15 Nov 2009 04:10:49 +0000</pubDate>
		<dc:creator>Hartmut Kaiser</dc:creator>
				<category><![CDATA[Spirit2 Release]]></category>

		<guid isPermaLink="false">http://boost-spirit.com/home/?p=416</guid>
		<description><![CDATA[Would you like to try the new version of Spirit but you are stuck with an older version of Boost? If yes, don’t despair, there might be help! See full article here. Rating: 0.0/5 (0 votes cast)<br /><div><img src="http://boost-spirit.com/home/wp-content/plugins/gd-star-rating/gfx.php?value=0.0" /></div><div>Rating: 0.0/<strong>5</strong> (0 votes cast)</div><br />]]></description>
			<content:encoded><![CDATA[<p>Would you like to try the new version of <em>Spirit</em> but you are stuck with an older version of <a title="Boost" href="http://www.boost.org/">Boost</a>? If yes, don’t despair, there might be help!</p>
<p><a href="http://boost-spirit.com/home/?page_id=369">See full article here.</a></p>
<br /><div><img src="http://boost-spirit.com/home/wp-content/plugins/gd-star-rating/gfx.php?value=0.0" /></div><div>Rating: 0.0/<strong>5</strong> (0 votes cast)</div><br />]]></content:encoded>
			<wfw:commentRss>http://boost-spirit.com/home/2009/11/14/using-spirit-v2-1-with-older-versions-of-boost-pre-v1-41/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Spirit V2.1 will be released with Boost V1.41</title>
		<link>http://boost-spirit.com/home/2009/11/06/spirit-v2-1-will-be-released-with-boost-v1-41/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=spirit-v2-1-will-be-released-with-boost-v1-41</link>
		<comments>http://boost-spirit.com/home/2009/11/06/spirit-v2-1-will-be-released-with-boost-v1-41/#comments</comments>
		<pubDate>Fri, 06 Nov 2009 20:30:09 +0000</pubDate>
		<dc:creator>Hartmut Kaiser</dc:creator>
				<category><![CDATA[Spirit2 Release]]></category>

		<guid isPermaLink="false">http://boost-spirit.com/home/?p=218</guid>
		<description><![CDATA[Now, as the release of the new Spirit version is at our doorstep, I would like to whet your appetite. Let’s start with a list of high level things worth knowing. See full article here. Rating: 0.0/5 (0 votes cast)<br /><div><img src="http://boost-spirit.com/home/wp-content/plugins/gd-star-rating/gfx.php?value=0.0" /></div><div>Rating: 0.0/<strong>5</strong> (0 votes cast)</div><br />]]></description>
			<content:encoded><![CDATA[<p>Now, as the release of the new <em>Spirit</em> version is at our doorstep, I would like to whet your appetite. Let’s start with a list of high level things worth knowing.</p>
<p><a href="http://boost-spirit.com/home/?page_id=424">See full article here.</a></p>
<br /><div><img src="http://boost-spirit.com/home/wp-content/plugins/gd-star-rating/gfx.php?value=0.0" /></div><div>Rating: 0.0/<strong>5</strong> (0 votes cast)</div><br />]]></content:encoded>
			<wfw:commentRss>http://boost-spirit.com/home/2009/11/06/spirit-v2-1-will-be-released-with-boost-v1-41/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Spirit 2.1 Release Coming Very Soon</title>
		<link>http://boost-spirit.com/home/2009/09/25/spirit-2-1-release-coming-very-soon/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=spirit-2-1-release-coming-very-soon</link>
		<comments>http://boost-spirit.com/home/2009/09/25/spirit-2-1-release-coming-very-soon/#comments</comments>
		<pubDate>Fri, 25 Sep 2009 16:39:54 +0000</pubDate>
		<dc:creator>Joel de Guzman</dc:creator>
				<category><![CDATA[Spirit2 Release]]></category>

		<guid isPermaLink="false">http://boost-spirit.com/home/?p=49</guid>
		<description><![CDATA[After a long time in beta (more than 2 years with Spirit 2.0), Spirit 2.1 will finally be released with the upcoming Boost 1.41 release. The code is very stable now and is ready for production code. We are working hard on finishing the documentation in time for Boost 1.41. You can peek at the [...]<br /><div><img src="http://boost-spirit.com/home/wp-content/plugins/gd-star-rating/gfx.php?value=1.0" /></div><div>Rating: 1.0/<strong>5</strong> (1 vote cast)</div><br />]]></description>
			<content:encoded><![CDATA[<p>After a long time in beta (more than 2 years with Spirit 2.0), Spirit 2.1 will finally be released with the upcoming Boost 1.41 release. The code is very stable now and is ready for production code. We are working hard on finishing the documentation in time for Boost 1.41. You can peek at the current state of the <a href="http://svn.boost.org/svn/boost/trunk/libs/spirit/doc/html/index.html">documentation here</a>. Currently, you can find the code and documentation in the Boost SVN trunk. If you have a new project involving Spirit, we highly recommend starting with Spirit 2.1 now. Allow me to quote OvermindDL&#8217;s post from the Spirit mailing list:</p>
<p style="padding-left: 30px;"><em>I may start to sound like a bot with how often I say this, but Spirit.Classic is ancient, you should switch to Spirit2.1, it can do everything you did above a GREAT deal easier, a lot less code, and it executes faster.  For example, Spirit2.1 can build your entire AST inline, no weird overriding, no need to build things up afterwards, etc&#8230;, all as one nice and fast step.  You really need to update. See the other posts from the past day for links to docs and such for Spirit2.1. Spirit2.1 is currently in Boost Trunk, but will be formally released with Boost 1.41, but is otherwise complete.</em></p>
<br /><div><img src="http://boost-spirit.com/home/wp-content/plugins/gd-star-rating/gfx.php?value=1.0" /></div><div>Rating: 1.0/<strong>5</strong> (1 vote cast)</div><br />]]></content:encoded>
			<wfw:commentRss>http://boost-spirit.com/home/2009/09/25/spirit-2-1-release-coming-very-soon/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

