小编Grz*_*zak的帖子

来自语义动作的boost :: spirit访问位置迭代器

可以说我有这样的代码(行号作为参考):

1:
2:function FuncName_1 {
3:    var Var_1 = 3;
4:    var  Var_2 = 4;
5:    ...
Run Code Online (Sandbox Code Playgroud)

我想编写一个语法来解析这样的文本,将所有的标识符(函数和变量名)信息放入一个树(utree?).每个节点应保留:line_num,column_num和符号值.例:

root: FuncName_1 (line:2,col:10)
  children[0]: Var_1 (line:3, col:8)
  children[1]: Var_1 (line:4, col:9)
Run Code Online (Sandbox Code Playgroud)

我想将它放入树中,因为我计划遍历该树,并且对于每个节点,我必须知道"上下文":(当前节点的所有父节点).

例如,在使用Var_1处理节点时,我必须知道这是函数FuncName_1的局部变量的名称(当前正在作为节点处理,但是前一级)

我无法弄清楚一些事情

  1. 这可以通过语义动作和语言在Spirit中完成吗?或者我应该使用变体<>树?
  2. 如何同时将这三个信息(column,line,symbol_name)传递给节点?我知道我必须使用pos_iterator作为语法的迭代器类型,但如何在sematic动作中访问这些信息?

我是Boost的新手,所以我一遍又一遍地阅读Spirit文章,我试着谷歌我的问题,但我不知道怎么能把所有的部分放在一起找到解决方案.好像没有人像我之前那样有这样的用例(或者我只是无法找到它)看起来像位置迭代器的唯一解决方案是解析错误处理的那些,但事实并非如此我感兴趣的.只解析我正在采取的代码的代码如下,但我不知道如何继续前进.

  #include <boost/spirit/include/qi.hpp>
  #include <boost/spirit/include/support_line_pos_iterator.hpp>

  namespace qi = boost::spirit::qi;
  typedef boost::spirit::line_pos_iterator<std::string::const_iterator> pos_iterator_t;

  template<typename Iterator=pos_iterator_t, typename Skipper=qi::space_type>
  struct ParseGrammar: public qi::grammar<Iterator, Skipper>
  {
        ParseGrammar():ParseGrammar::base_type(SourceCode)
        {
           using namespace qi;
           KeywordFunction = lit("function");
           KeywordVar    = lit("var");
           SemiColon     = lit(';');

           Identifier = lexeme [alpha >> *(alnum | '_')];
           VarAssignemnt = …
Run Code Online (Sandbox Code Playgroud)

c++ boost abstract-syntax-tree boost-spirit-qi

11
推荐指数
1
解决办法
2386
查看次数

为什么std :: vector使用移动构造函数,尽管声明为noexcept(false)

无论我在互联网上阅读什么,强烈建议如果我希望我的班级能够很好地使用std::vector(即从我的班级移动语义std::vector),我应该将构造函数移动为"noexcept"(或noexcept(true)).

为什么std::vector使用它,即使我将其标记noexcept(false)为实验?

#include <iostream>
#include <vector>
using std::cout;

struct T
{
    T() { cout <<"T()\n"; }

    T(const T&) { cout <<"T(const T&)\n"; }

    T& operator= (const T&)
    { cout <<"T& operator= (const T&)\n"; return *this; }

    ~T() { cout << "~T()\n"; }

    T& operator=(T&&) noexcept(false)
    { cout <<"T& operator=(T&&)\n"; return *this; }

    T(T&&) noexcept(false)
    { cout << "T(T&&)\n"; }
};

int main()
{
    std::vector<T> t_vec;
    t_vec.push_back(T());
}
Run Code Online (Sandbox Code Playgroud)

输出:

T()
T(T&&) …
Run Code Online (Sandbox Code Playgroud)

c++ vector move-semantics noexcept c++11

7
推荐指数
1
解决办法
615
查看次数