精神气语问题

时间:2012-02-01 09:05:28

标签: c++ boost grammar boost-spirit-qi

首先,抱歉标题不准确,只是我实际上并不知道什么导致编译错误(我是精神/凤凰/元组的新手),因此为了我的问题的可读性,我将整个语法导出到引擎收录: 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 and list也有元素作为基础。

现在,我不明白的是,当你看语法时,原子的规则定义是:

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

非常感谢您提前寻求任何帮助,我真的坚持了好几天。

0 个答案:

没有答案