首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法编译使用Phoenix执行元更改令牌值的boost-spirit示例

无法编译使用Phoenix执行元更改令牌值的boost-spirit示例
EN

Stack Overflow用户
提问于 2013-05-13 22:58:07
回答 1查看 392关注 0票数 2

当我尝试编译下面的代码(使用boost\spirit\home\lex\argument.hpp: value_setter中的示例)时,我得到以下编译器错误:

代码语言:javascript
复制
c:\program files (x86)\boost\boost_1_50\boost\range\iterator.hpp(63) : error C2039: 'type' : is not a member of 'boost::mpl::eval_if_c<C,F1,F2>'
with
[
    C=true,
    F1=boost::range_const_iterator<const char *>,
    F2=boost::range_mutable_iterator<const char *const >
]
c:\program files (x86)\boost\boost_1_50\boost\range\iterator_range_core.hpp(56) : see reference to class template instantiation 'boost::range_iterator<C>' being compiled
with
[
    C=const char *const 
]
...

没有语义操作,一切都编译得很好。示例如下:

代码语言:javascript
复制
#include <boost/spirit/include/lex_lexertl.hpp>
namespace lex = boost::spirit::lex;

template <typename Lexer>
struct my_tokens : lex::lexer<Lexer>
{
    my_tokens()
    {
        identifier = "[a-zA-Z_][a-zA-Z0-9_]*";
        this->self = identifier  [ lex::_val = "identifier" ] // problematic action
                   ;
    }
    lex::token_def<> identifier;
};

int main()
{
    typedef std::string::iterator base_iterator_type;
    typedef
        lex::lexertl::actor_lexer<lex::lexertl::token<base_iterator_type> > 
        lexer_type;

    my_tokens<lexer_type> myLexer;
    std::string str = "id1";
    base_iterator_type first = str.begin();
    bool r = lex::tokenize(first, str.end(), myLexer);

    if (!r) {
        std::string rest(first, str.end());
        std::cerr << "Lexical analysis failed\n" << "stopped at: \"" 
                  << rest << "\"\n";
    }
}

哪里出了问题?如何设置/更改令牌的值?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-14 14:58:10

您的token_def应该公开预期的属性类型(编译错误表明您正在将字符串文字分配给iterator_range):

代码语言:javascript
复制
lex::token_def<std::string> identifier;

现在,匹配赋值中的类型

代码语言:javascript
复制
this->self = identifier  [ lex::_val = std::string("identifier") ]

不要忘记更新令牌类型以反映可能的令牌属性类型集:

代码语言:javascript
复制
typedef
    lex::lexertl::actor_lexer<lex::lexertl::token<base_iterator_type,
        boost::mpl::vector<std::string> > > 
    lexer_type;

现在它应该编译了:

代码语言:javascript
复制
#include <boost/spirit/include/lex_lexertl.hpp>
#include <boost/spirit/include/phoenix.hpp>
namespace lex = boost::spirit::lex;
namespace phx = boost::phoenix;

template <typename Lexer>
struct my_tokens : lex::lexer<Lexer>
{
    my_tokens()
    {
        identifier = "[a-zA-Z_][a-zA-Z0-9_]*";
        this->self = identifier  [ lex::_val = std::string("identifier") ]
                   ;
    }
    lex::token_def<std::string> identifier;
};

int main()
{
    typedef std::string::iterator base_iterator_type;
    typedef
        lex::lexertl::actor_lexer<lex::lexertl::token<base_iterator_type, boost::mpl::vector<std::string> > > 
        lexer_type;

    my_tokens<lexer_type> myLexer;
    std::string str = "id1";
    base_iterator_type first = str.begin();
    bool r = lex::tokenize(first, str.end(), myLexer);

    if (!r) {
        std::string rest(first, str.end());
        std::cerr << "Lexical analysis failed\n" << "stopped at: \"" 
                  << rest << "\"\n";
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16525152

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档