P
Hiho,
es lag an dem wide_phrase_scanner_t. Das funktioniert, bringt aber beim Kompilieren eine hässliceh Warnung:
warning C4584: 'boost::spirit::classic::scanner<IteratorT,PoliciesT>': Basisklasse 'boost::spirit::classic::scanner_base' ist bereits eine Basisklasse von 'boost::spirit::classic::scanner<IteratorT,PoliciesT>'
1> with
1> [
1> IteratorT=const wchar_t *,
1> PoliciesT=boost::spirit::classic::wide_phrase_scanner_t
1> ]
1> and
1> [
1> IteratorT=const wchar_t *,
1> PoliciesT=boost::spirit::classic::scanner_policies_t
1> ]
1> d:\quellcode\boost\boost_1_39_0\boost\spirit\home\classic\core\scanner\scanner.hpp(205): Siehe Deklaration von 'boost::spirit::classic::scanner_base'
1> 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 "boost::spirit::classic::scanner<IteratorT,PoliciesT>".
1> with
1> [
1> IteratorT=const wchar_t *,
1> PoliciesT=boost::spirit::classic::wide_phrase_scanner_t
1> ]
1> 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 "boost::detail::is_base_and_derived_impl<B,D>".
1> with
1> [
1> B=boost::spirit::classic::parser_context_base,
1> D=wscanner
1> ]
1> d:\quellcode\boost\boost_1_39_0\boost\mpl\if.hpp(63): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "boost::is_base_and_derived<Base,Derived>".
1> with
1> [
1> Base=boost::spirit::classic::parser_context_base,
1> Derived=wscanner
1> ]
1> 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 "boost::mpl::if_<T1,T2,T3>".
1> with
1> [
1> T1=boost::is_base_and_derivedboost::spirit::classic::parser\_context_base,wscanner,
1> T2=wscanner,
1> T3=boost::spirit::classic::parser_context<>
1> ]
1> 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 "boost::spirit::classic::impl::get_param<BaseT,DefaultT,T0,T1,T2>".
1> with
1> [
1> BaseT=boost::spirit::classic::parser_context_base,
1> DefaultT=boost::spirit::classic::parser_context<>,
1> T0=wscanner,
1> T1=boost::spirit::classic::nil_t,
1> T2=boost::spirit::classic::nil_t
1> ]
1> 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 "boost::spirit::classic::impl::get_context<T0,T1,T2>".
1> with
1> [
1> T0=wscanner,
1> T1=boost::spirit::classic::nil_t,
1> T2=boost::spirit::classic::nil_t
1> ]
1> 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 "boost::spirit::classic::impl::rule_base<DerivedT,EmbedT,T0,T1,T2>".
1> with
1> [
1> DerivedT=boost::spirit::classic::rule<wscanner>,
1> EmbedT=const boost::spirit::classic::rule<wscanner> &,
1> T0=wscanner,
1> T1=boost::spirit::classic::nil_t,
1> T2=boost::spirit::classic::nil_t
1> ]
1> d:\quellcode\spcedit\spcedit\stddata.cpp(360): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "boost::spirit::classic::rule<T0>".
1> with
1> [
1> T0=wscanner
1> ]
Der dazugehörige Code ist:
typedef bs::scanner<const wchar_t*,bs::wide_phrase_scanner_t> wscanner;
typedef bs::rule<wscanner> wrule;
std::vector<std::wstring> v;
wrule components = bs::real_p >> bs::real_p >> bs::real_p;
wrule vec = L'(' >> components[bs::push_back_a(v)] >> L')';
wrule myRule = *vec;
if (bs::parse(vectors.c_str(),myRule,bs::space_p).full)
...
Wenn ich die Grammatik wie in der Doku mache:
struct VectorGrammar : public bs::grammar<VectorGrammar>
{
template <typename ScannerT>
struct definition
{
definition(VectorGrammar const& self)
{
bs::rule<ScannerT> components = bs::real_p >> bs::real_p >> bs::real_p;
bs::rule<ScannerT> vec = L'(' >> components[bs::push_back_a(v)] >> L')';
r = +vec;
}
bs::rule<ScannerT> r;
bs::rule<ScannerT> const& start() const { return r; }
std::vector<CStdData::StringType> v;
};
};
VectorGrammar vec; // Our parser
bs::parse_info<const wchar_t*> info = bs::parse(vectors.c_str(), vec,bs::space_p);
kompiliert das zwar, bringt aber einen Adress-Lesefehler zur Laufzeit. Auch hier ist der String wieder ein wstring.