令牌解析器语义动作

我已经根据精灵lex示例4中显示的代码编写了一个工作令牌解析器 我的一条规则是这样的
    set_name 
        =   (   tok.set_ >> tok.name_ >> tok.identifier )
            [
                std::cout << val("set name statement to: ") << _3 << "n"
            ]
        ;
这很好用。当提出
SET NAME xyz
它按照我的预期输出   将name name设置为:xyz 现在我想做一些有用的事情,将找到的名字存储在一个类中。从解析器语义示例开始,我编写了这段代码
  class writer
    {
    public:
        void print(string const& s) const
        {
            std::cout << s << std::endl;
        }
    };

  writer w;

  ...

    set_name 
        =   (   tok.set_ >> tok.name_ >> tok.identifier )
            [
                boost::bind( &writer::print, &w, ::_3 )
            ]
        ;
这不编译 1> C: Program Files boost boost_1_44 boost / bind / bind.hpp(318):错误C2664:'R boost :: _ mfi :: cmf1 :: operator()(const U&,A1)const':无法将参数2从'bool'转换为'const std :: basic_string' 1>用 1> [ 1> R =无效, 1> T = eCrew :: rule :: writer, 1> A1 = const std :: string&, 1> U = eCrew :: rule :: writer * 1>] 1>和 1> [ 1> _Elem = char, 1> _Traits = std :: char_traits, 1> _Ax = std :: allocator 1>] 1>原因:无法从'bool'转换为'const std :: string' 1>没有构造函数可以采用源类型,或构造函数重载解析是不明确的 为什么编译器抱怨尝试从bool转换为字符串?我看不到布尔。     
已邀请:
占位符
std::cout << val("set name statement to: ") << _3 << "n"
是指
boost::spirit::_3
,这是一个boost.phoenix v2占位符。占位符
boost::bind(&writer::print, &w, ::_3)
是一个boost.bind占位符(自然)。 这些占位符不共享相同的行为,甚至不会引用相同的数据。形式为_N的Phoenix占位符引用解析器的第N个子属性,而绑定占位符具有不同的含义: _1指的是整个解析器的属性 _2指的是解析器的上下文 _3指的是
bool&
'hit'参数 在你的情况下最简单的解决方案是使用
boost::phoenix::bind
而不是
boost::bind
,这样你就可以继续使用
_3
来引用解析器的第三个子属性,而不必在
writer::print
内手动选择它。 或者,只将语义动作附加到
tok.identifier
,以便boost.bind的
::_1
按预期工作:
set_name
  = tok.set_
    >> tok.name_
    >> tok.identifier[boost::bind(&writer::print, &w, ::_1)]
;
    

要回复问题请先登录注册