【发布时间】:2013-08-26 22:05:28
【问题描述】:
我有这个,在我的 boost::spirit 语法中;
paren = (qi::token(LEFT_PAREN) >> character >> qi::token(RIGHT_PAREN)) [ build_paren ]
;
character = qi::token(CHARACTER) [ build_character]
;
这些被定义为;
qi::rule<Iterator> paren;
qi::rule<Iterator, char> character;
函数build_paren,具有以下原型(通过编译器转换错误找到);
void build_paren(boost::fusion::vector2<boost::iterator_range<__gnu_cxx::__normal_iterator<char*, std::basic_string<char>>>, boost::iterator_range<__gnu_cxx::__normal_iterator<char*, std::basic_string<char>>>> v)
这里的向量,包含两个字符串,分别是"(\0" 和")\0",这是我所期望的,但是我如何获得匹配字符的char?
真的,我想要的 build_paran 函数原型是;
void build_paren(std::string left_paren, char character, std::string right_paren)
或者,同样的,但是 char 参数是列表中的最后一个参数。
【问题讨论】:
-
问题: 1. 您确定要将语义操作用于诸如暴露字符属性之类的简单事情吗? 2.
qi::token是什么? -
也可能很有趣:“Semantic actions are evil”?
-
@sehe:qi::token 的参数是一个枚举,它定义了我来自词法分析器的标记。我知道为此使用语义操作,目前是矫枉过正,但这只是一个玩具示例,在我开始实现完整的解析器之前获得基础知识!我计划在哪里递归地构建我的 AST。
-
使用词法分析器改变了画面,虽然只是一点点。请务必在
token_def<Attr>和mpl::vector<>支持的令牌属性列表中指定属性类型。也就是说,您仍然需要做出规则声明qi::rule<Iterator, char()>才能使其正常工作。 -
我刚刚将解析器规则更改为
char(),编译器现在希望build_paren具有以下原型(如我所愿);void print_paren(boost::fusion::vector3<boost::iterator_range<__gnu_cxx::__normal_iterator<char*, std::basic_string<char>>>, std::string, boost::iterator_range<__gnu_cxx::__normal_iterator<char*, std::basic_string<char>>>> vec),但字符始终为0!
标签: c++ boost boost-spirit boost-spirit-qi boost-spirit-lex