2

首先,很抱歉标题不准确,只是我实际上并不知道是什么导致了编译错误(我是 Spirit/phoenix/tuple 的新手),因此为了我的问题的可读性,我将整个语法导出到 pastebin: http ://pastebin.com/RsGM8E4r

代码在 Visual Studio 2010 中编译:

Iterator = std::string::const_iterator

以及您在底部了解语法和我的问题所需的其他信息:

namespace parser { namespace container1 {

    template < typename _C >
    class atom : public element < _C >
    {
        private:
            typedef typename std::basic_string < _C >       _string;

        public:
            explicit atom ( const boost::variant < bool, long, double, _string > & value )
            :   _value ( value )
            {
                    _element_type = TY_ATOM;
            }

            explicit atom ()
            {

            }

            template < typename T >
            const T as () const
            {
                return boost::apply_visitor ( atom_visitor < _C, T > (), _value );
            }

        private:
            boost::variant < bool, long, double, _string >  _value;
    };

    template < typename _C >
    struct item
    {
        typedef typename element < _C >                 type;
        typedef typename boost::shared_ptr < type >     ptr;
    };
}}

group 和 list 也有元素作为基础。

现在,我不明白的是,当您查看语法时, atom 的规则定义是:

atom =
    ( qi::double_ | qi::long_ | qi::bool_ | string )    [ qi::_val = phoenix::construct < _item_ptr > ( phoenix::new_ < _atom > ( qi::_1 ) ) ]
;

这给出了一个很长的编译器错误列表,我无法真正理解..再次导出到 pastebin:http: //pastebin.com/k4HseJ01

但是,如果我将规则更改为

atom =
    ( qi::double_ | qi::long_ | qi::bool_ | string )    [ qi::_val = phoenix::construct < _item_ptr > ( phoenix::new_ < _atom > () ) ]
;

它编译成功,但是我需要从该规则中获取解析的数据:P

非常感谢您的帮助,我真的坚持了好几天。

4

0 回答 0