可以说我有这样的代码(行号作为参考):
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的局部变量的名称(当前正在作为节点处理,但是前一级)
我无法弄清楚一些事情
我是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) 无论我在互联网上阅读什么,强烈建议如果我希望我的班级能够很好地使用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)