<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[boost::spirit und Unicode, 2. Spirit Rule-Frage]]></title><description><![CDATA[<p>Hiho,</p>
<p>ich versuche gerade spirit mit wchar_t zu nutzen, aber irgendwie will das einfach nicht funktionieren. Selbst einfachste Beispiele nicht</p>
<pre><code class="language-cpp">bs::rule&lt;&gt; stringNumber =+ bs::range&lt;wchar_t&gt;(L'0',L'9');
if (bs::parse(line.c_str(),stringNumber).full)
{
	//...
</code></pre>
<p><em>line</em> ist ein std::wstring.<br />
Ich benutze das VS2005 SP1. Folgende Fehlermeldung kommt:</p>
<blockquote>
<p>d:\quellcode\boost\boost_1_39_0\boost\spirit\home\classic\core\non_terminal\impl\rule.ipp(192) : error C2664: 'boost::spirit::classic::impl::abstract_parser&lt;ScannerT,AttrT&gt;::do_parse_virtual': Konvertierung des Parameters 1 von 'const boost::spirit::classic::scanner&lt;IteratorT,PoliciesT&gt;' in 'const boost::spirit::classic::scanner&lt;&gt; &amp;' nicht möglich</p>
</blockquote>
<p>Hat jemand eine Ahnung, woran das liegt? Sollte doch eigentlich funktionieren,.</p>
<p>MfG Pellaeon</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/246025/boost-spirit-und-unicode-2-spirit-rule-frage</link><generator>RSS for Node</generator><lastBuildDate>Fri, 18 Sep 2026 05:41:16 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/246025.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 22 Jul 2009 07:56:24 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to boost::spirit und Unicode, 2. Spirit Rule-Frage on Thu, 23 Jul 2009 12:46:56 GMT]]></title><description><![CDATA[<p>Hiho,</p>
<p>ich versuche gerade spirit mit wchar_t zu nutzen, aber irgendwie will das einfach nicht funktionieren. Selbst einfachste Beispiele nicht</p>
<pre><code class="language-cpp">bs::rule&lt;&gt; stringNumber =+ bs::range&lt;wchar_t&gt;(L'0',L'9');
if (bs::parse(line.c_str(),stringNumber).full)
{
	//...
</code></pre>
<p><em>line</em> ist ein std::wstring.<br />
Ich benutze das VS2005 SP1. Folgende Fehlermeldung kommt:</p>
<blockquote>
<p>d:\quellcode\boost\boost_1_39_0\boost\spirit\home\classic\core\non_terminal\impl\rule.ipp(192) : error C2664: 'boost::spirit::classic::impl::abstract_parser&lt;ScannerT,AttrT&gt;::do_parse_virtual': Konvertierung des Parameters 1 von 'const boost::spirit::classic::scanner&lt;IteratorT,PoliciesT&gt;' in 'const boost::spirit::classic::scanner&lt;&gt; &amp;' nicht möglich</p>
</blockquote>
<p>Hat jemand eine Ahnung, woran das liegt? Sollte doch eigentlich funktionieren,.</p>
<p>MfG Pellaeon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1747360</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1747360</guid><dc:creator><![CDATA[Pellaeon]]></dc:creator><pubDate>Thu, 23 Jul 2009 12:46:56 GMT</pubDate></item><item><title><![CDATA[Reply to boost::spirit und Unicode, 2. Spirit Rule-Frage on Wed, 22 Jul 2009 08:45:41 GMT]]></title><description><![CDATA[<p>bei deiner Fehlermeldung stehen bestimmt noch die eingesetzten Templateparameter mit drin. (beim VS im Output-Tab schauen, nicht in der Fehlerübersicht)</p>
<p>Ich kann jetzt nach einem kurzen Blick in die Doku nur raten: rule&lt;&gt; benutzt den default-scanner, dessen erster template-parameter (der Iterator) ist ein char const*. Und der dürfte sich mit dem wchar beißen. Deine Fehlermeldung dürfte noch etwas enthalten was darauf hindeutet (IteratorT = char const*)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1747381</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1747381</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 22 Jul 2009 08:45:41 GMT</pubDate></item><item><title><![CDATA[Reply to boost::spirit und Unicode, 2. Spirit Rule-Frage on Thu, 23 Jul 2009 12:48:54 GMT]]></title><description><![CDATA[<p>Hiho,</p>
<p>jo ich hatte das wchar immer an der falschen Stelle versucht zu nutzen. So geht es:</p>
<pre><code class="language-cpp">typedef bs::scanner&lt;const wchar_t*&gt; wscanner; 
typedef bs::rule&lt;wscanner&gt; wrule;
typedef bs::chlit&lt;wchar_t&gt; wchar_p;

wrule vec = L'(' &gt;&gt; bs::int_p &gt;&gt; L',' &gt;&gt; bs::int_p &gt;&gt; L',' &gt;&gt; bs::int_p &gt;&gt; L')';
wrule myRule = *vec;

if (bs::parse(vectors.c_str(),myRule,bs::space_p).full)
</code></pre>
<p>Ich hätte aber mal noch eine Frage an die Spirit-Profis. Das ist für mich Neuland, habe jetzt erst angefangen mir die Tuts anzuschauen. Ich will gern folgendes parsen: <strong>&quot;(x1,y1,z1) (x2,y2,z2)&quot;</strong> usw, also Vektoren. Am liebsten wäre es mir, wenn die Zahlen gleich als String rauskommen, aber erstmal als Zahl wäre auch ok. Mit dem Code drüber funktioniert das nur, wenn keine Leerzeichen dazwischen sind, obwohl ich <strong>space_p</strong> gesetzt habe. Das versteh ich nicht so recht. Laut Tut müsste er doch jetzt Leerzeichen auslasse?</p>
<p>MfG Pellaeon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1748201</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1748201</guid><dc:creator><![CDATA[Pellaeon]]></dc:creator><pubDate>Thu, 23 Jul 2009 12:48:54 GMT</pubDate></item><item><title><![CDATA[Reply to boost::spirit und Unicode, 2. Spirit Rule-Frage on Thu, 23 Jul 2009 14:17:30 GMT]]></title><description><![CDATA[<p>Pellaeon schrieb:</p>
<blockquote>
<p>Am liebsten wäre es mir, wenn die Zahlen gleich als String rauskommen, aber erstmal als Zahl wäre auch ok.</p>
</blockquote>
<p>Ich bin mir nicht 100%i sicher, meine aber folgendes gelesen zu haben:<br />
Die Zahlenparser haben für ihre semantic actions zwei verschiedene Schnittstellen: eine gibt direkt die geparste Zahl zurück, die andere übergibt (wie alle anderen Parser auch) ein Itratorenpaar (Anfang und Ende der geparsten Sequenz). Damit kannst du den gewünschten String dann initialisieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1748302</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1748302</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 23 Jul 2009 14:17:30 GMT</pubDate></item><item><title><![CDATA[Reply to boost::spirit und Unicode, 2. Spirit Rule-Frage on Thu, 23 Jul 2009 20:41:08 GMT]]></title><description><![CDATA[<p>In spirit2 ist das komplett anders gelöst, da musst du nur den richtigen Namespace angeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1748520</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1748520</guid><dc:creator><![CDATA[phlox81]]></dc:creator><pubDate>Thu, 23 Jul 2009 20:41:08 GMT</pubDate></item><item><title><![CDATA[Reply to boost::spirit und Unicode, 2. Spirit Rule-Frage on Fri, 24 Jul 2009 05:26:52 GMT]]></title><description><![CDATA[<p>Hiho,</p>
<p>erstmal danke für die Antworten.<br />
Also die Zahlen als String rausbekommen, funktioniert super mit dem <em>push_back_a</em>. Das einzige, was noch nicht klappt, ist das space_p als Skip Parser. Der macht irgendwie nix. Deswegen muss ich momentan noch immner per Hand in den Regel die Leerzeichen mit aufnehmen.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/642">@phlox81</a> : ist das Spirit 2 final? Weil in der Boost Doku wird man immer zur Classic-Variante gelenkt. Und da ich da die Dok und Tuts benutze, bin ich nich bei der &quot;alten&quot; Version.</p>
<p>MfG Pellaeon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1748613</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1748613</guid><dc:creator><![CDATA[Pellaeon]]></dc:creator><pubDate>Fri, 24 Jul 2009 05:26:52 GMT</pubDate></item><item><title><![CDATA[Reply to boost::spirit und Unicode, 2. Spirit Rule-Frage on Fri, 24 Jul 2009 06:32:07 GMT]]></title><description><![CDATA[<p>Pellaeon schrieb:</p>
<blockquote>
<p>ist das Spirit 2 final?</p>
</blockquote>
<p>Was verstehst du unter final? Spirit2 wird sicherlich noch weiterentwickelt.</p>
<blockquote>
<p>Weil in der Boost Doku wird man immer zur Classic-Variante gelenkt. Und da ich da die Dok und Tuts benutze, bin ich nich bei der &quot;alten&quot; Version.</p>
</blockquote>
<p>Phlox hat ja <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-244035.html" rel="nofollow">hier</a> neulich schon den Link zur Spirit2 Doku geliefert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1748630</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1748630</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 24 Jul 2009 06:32:07 GMT</pubDate></item><item><title><![CDATA[Reply to boost::spirit und Unicode, 2. Spirit Rule-Frage on Fri, 24 Jul 2009 09:28:58 GMT]]></title><description><![CDATA[<p>Ich hoffe du hast bei der rule noch den <code>wide_phrase_scanner_t</code> angegeben. Der sorgt dafür, dass die rule mit dem space_p Skipper klarkommt.</p>
<p>Also in etwa so:</p>
<pre><code class="language-cpp">typedef bs::scanner&lt;const wchar_t*, wide_phrase_scanner_t&gt; wscanner;
typedef bs::rule&lt;wscanner&gt; wrule;
typedef bs::chlit&lt;wchar_t&gt; wchar_p;

wrule vec = L'(' &gt;&gt; bs::int_p &gt;&gt; L',' &gt;&gt; bs::int_p &gt;&gt; L',' &gt;&gt; bs::int_p &gt;&gt; L')';
wrule myRule = *vec;

if (bs::parse(vectors.c_str(),myRule,bs::space_p).full)
</code></pre>
<p>Ansonsten solltest du, wie im FAQ erwähnt, die rule&lt;&gt; nicht benutzen um Parser zu speichern. Grammatiken haben das Problem nicht, Iterator- oder Scannertyp im voraus kennen zu müssen. Außerdem kannst du in Grammatiken ganz leicht Optimierungen einbauen (z.B. subrule, subgrammar) ohne das öffentliche Interface zu verändern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1748736</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1748736</guid><dc:creator><![CDATA[Don06]]></dc:creator><pubDate>Fri, 24 Jul 2009 09:28:58 GMT</pubDate></item><item><title><![CDATA[Reply to boost::spirit und Unicode, 2. Spirit Rule-Frage on Mon, 27 Jul 2009 06:20:36 GMT]]></title><description><![CDATA[<p>Hiho,</p>
<p>es lag an dem wide_phrase_scanner_t. Das funktioniert, bringt aber beim Kompilieren eine hässliceh Warnung:</p>
<blockquote>
<p>warning C4584: 'boost::spirit::classic::scanner&lt;IteratorT,PoliciesT&gt;': Basisklasse 'boost::spirit::classic::scanner_base' ist bereits eine Basisklasse von 'boost::spirit::classic::scanner&lt;IteratorT,PoliciesT&gt;'<br />
1&gt; with<br />
1&gt; [<br />
1&gt; IteratorT=const wchar_t *,<br />
1&gt; PoliciesT=boost::spirit::classic::wide_phrase_scanner_t<br />
1&gt; ]<br />
1&gt; and<br />
1&gt; [<br />
1&gt; IteratorT=const wchar_t *,<br />
1&gt; PoliciesT=boost::spirit::classic::scanner_policies_t<br />
1&gt; ]<br />
1&gt; d:\quellcode\boost\boost_1_39_0\boost\spirit\home\classic\core\scanner\scanner.hpp(205): Siehe Deklaration von 'boost::spirit::classic::scanner_base'<br />
1&gt; d:\quellcode\boost\boost_1_39_0\boost\type_traits\is_base_and_derived.hpp(225): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template &quot;boost::spirit::classic::scanner&lt;IteratorT,PoliciesT&gt;&quot;.<br />
1&gt; with<br />
1&gt; [<br />
1&gt; IteratorT=const wchar_t *,<br />
1&gt; PoliciesT=boost::spirit::classic::wide_phrase_scanner_t<br />
1&gt; ]<br />
1&gt; d:\quellcode\boost\boost_1_39_0\boost\type_traits\is_base_and_derived.hpp(235): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template &quot;boost::detail::is_base_and_derived_impl&lt;B,D&gt;&quot;.<br />
1&gt; with<br />
1&gt; [<br />
1&gt; B=boost::spirit::classic::parser_context_base,<br />
1&gt; D=wscanner<br />
1&gt; ]<br />
1&gt; d:\quellcode\boost\boost_1_39_0\boost\mpl\if.hpp(63): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template &quot;boost::is_base_and_derived&lt;Base,Derived&gt;&quot;.<br />
1&gt; with<br />
1&gt; [<br />
1&gt; Base=boost::spirit::classic::parser_context_base,<br />
1&gt; Derived=wscanner<br />
1&gt; ]<br />
1&gt; d:\quellcode\boost\boost_1_39_0\boost\spirit\home\classic\core\non_terminal\impl\rule.ipp(64): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template &quot;boost::mpl::if_&lt;T1,T2,T3&gt;&quot;.<br />
1&gt; with<br />
1&gt; [<br />
1&gt; T1=boost::is_base_and_derived<a href="boost::spirit::classic::parser%5C_context_base,wscanner" rel="nofollow">boost::spirit::classic::parser\_context_base,wscanner</a>,<br />
1&gt; T2=wscanner,<br />
1&gt; T3=boost::spirit::classic::parser_context&lt;&gt;<br />
1&gt; ]<br />
1&gt; d:\quellcode\boost\boost_1_39_0\boost\spirit\home\classic\core\non_terminal\impl\rule.ipp(71): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template &quot;boost::spirit::classic::impl::get_param&lt;BaseT,DefaultT,T0,T1,T2&gt;&quot;.<br />
1&gt; with<br />
1&gt; [<br />
1&gt; BaseT=boost::spirit::classic::parser_context_base,<br />
1&gt; DefaultT=boost::spirit::classic::parser_context&lt;&gt;,<br />
1&gt; T0=wscanner,<br />
1&gt; T1=boost::spirit::classic::nil_t,<br />
1&gt; T2=boost::spirit::classic::nil_t<br />
1&gt; ]<br />
1&gt; d:\quellcode\boost\boost_1_39_0\boost\spirit\home\classic\core\non_terminal\impl\rule.ipp(146): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template &quot;boost::spirit::classic::impl::get_context&lt;T0,T1,T2&gt;&quot;.<br />
1&gt; with<br />
1&gt; [<br />
1&gt; T0=wscanner,<br />
1&gt; T1=boost::spirit::classic::nil_t,<br />
1&gt; T2=boost::spirit::classic::nil_t<br />
1&gt; ]<br />
1&gt; d:\quellcode\boost\boost_1_39_0\boost\spirit\home\classic\core\non_terminal\rule.hpp(110): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template &quot;boost::spirit::classic::impl::rule_base&lt;DerivedT,EmbedT,T0,T1,T2&gt;&quot;.<br />
1&gt; with<br />
1&gt; [<br />
1&gt; DerivedT=boost::spirit::classic::rule&lt;wscanner&gt;,<br />
1&gt; EmbedT=const boost::spirit::classic::rule&lt;wscanner&gt; &amp;,<br />
1&gt; T0=wscanner,<br />
1&gt; T1=boost::spirit::classic::nil_t,<br />
1&gt; T2=boost::spirit::classic::nil_t<br />
1&gt; ]<br />
1&gt; d:\quellcode\spcedit\spcedit\stddata.cpp(360): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template &quot;boost::spirit::classic::rule&lt;T0&gt;&quot;.<br />
1&gt; with<br />
1&gt; [<br />
1&gt; T0=wscanner<br />
1&gt; ]</p>
</blockquote>
<p>Der dazugehörige Code ist:</p>
<pre><code class="language-cpp">typedef bs::scanner&lt;const wchar_t*,bs::wide_phrase_scanner_t&gt; wscanner;	
typedef bs::rule&lt;wscanner&gt; wrule;

std::vector&lt;std::wstring&gt; v;
wrule components = bs::real_p &gt;&gt; bs::real_p &gt;&gt; bs::real_p;
wrule vec = L'(' &gt;&gt; components[bs::push_back_a(v)] &gt;&gt; L')';	
wrule myRule = *vec;

if (bs::parse(vectors.c_str(),myRule,bs::space_p).full)
...
</code></pre>
<p>Wenn ich die Grammatik wie in der Doku mache:</p>
<pre><code class="language-cpp">struct VectorGrammar : public bs::grammar&lt;VectorGrammar&gt;
{
	template &lt;typename ScannerT&gt;
	struct definition
	{		
		definition(VectorGrammar const&amp; self)
		{
			bs::rule&lt;ScannerT&gt; components = bs::real_p &gt;&gt; bs::real_p &gt;&gt; bs::real_p;
			bs::rule&lt;ScannerT&gt; vec = L'(' &gt;&gt; components[bs::push_back_a(v)] &gt;&gt; L')';	
			r = +vec;
		}

		bs::rule&lt;ScannerT&gt;  r;            
		bs::rule&lt;ScannerT&gt; const&amp; start() const { return r; }

		std::vector&lt;CStdData::StringType&gt; v;
	};
};

VectorGrammar vec;    //  Our parser
bs::parse_info&lt;const wchar_t*&gt; info = bs::parse(vectors.c_str(), vec,bs::space_p);
</code></pre>
<p>kompiliert das zwar, bringt aber einen Adress-Lesefehler zur Laufzeit. Auch hier ist der String wieder ein wstring.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1750079</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1750079</guid><dc:creator><![CDATA[Pellaeon]]></dc:creator><pubDate>Mon, 27 Jul 2009 06:20:36 GMT</pubDate></item></channel></rss>