Delete balloon_scope.h

This commit is contained in:
Valk Richard Li 2020-06-01 01:23:29 +08:00 committed by GitHub
parent b3c9a9cd1e
commit 94bf62d13a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 0 additions and 260 deletions

View File

@ -1,260 +0,0 @@
#ifndef __BALLOON_SCOPE_H__
#define __BALLOON_SCOPE_H__
/*
when running a balloon process
there will be two types of blocks:
root block
if-else block
loop block
function block
and many types of local scopes:
if-else local scope
loop local scope
local scopes must be put in a block
values in different blocks cannot call each other
*/
class balloon_scope
{
private:
std::list<var> global;
std::list<std::list<std::list<var> > > scope_list;
/*
example:
std::list<var> global // global scope
std::list<std::list<std::list<var> > > // total scope
-> std::list<std::list<var> > // block scope
->std::list<var> // local scope
-> var -> var -> var -> var
*/
public:
void set_clear()
{
global.clear();
scope_list.clear();
return;
}
bool check_redefine(std::string name)
{
if(!scope_list.empty() && !scope_list.back().empty())
{
// check the last block scope
// redefinition only occurs in last block scope
// if scope list is empty ,then check the global scope
std::list<std::list<var> >::iterator i=scope_list.back().end();
--i;
for(std::list<var>::iterator j=i->begin();j!=i->end();++j)
if(j->get_name()==name)
return true;
return false;
}
if(!global.empty())
{
for(std::list<var>::iterator i=global.begin();i!=global.end();++i)
if(i->get_name()==name)
return true;
return false;
}
return false;
}
bool search_var(std::string name)
{
if(!scope_list.empty() && !scope_list.back().empty())
{
// get the last block
std::list<std::list<var> >::iterator i=scope_list.back().end();
--i;
for(;;--i)
{
if(!i->empty())// avoid sigsegv
{
for(std::list<var>::iterator j=i->begin();j!=i->end();++j)
if(j->get_name()==name)
return true;
}
if(i==scope_list.back().begin())
break;
}
}
if(!global.empty())
{
for(std::list<var>::iterator i=global.begin();i!=global.end();++i)
if(i->get_name()==name)
return true;
}
return false;
}
void add_new_var(var t)
{
if(!scope_list.empty() && !scope_list.back().empty())
{
// get the last block and the get the last local scope in this blcok
std::list<std::list<var> >::iterator i=scope_list.back().end();
--i;
i->push_back(t);
return;
}
global.push_back(t);
return;
}
void print_last_block()
{
if(!scope_list.empty() && !scope_list.back().empty())
{
std::list<std::list<var> >::iterator i=scope_list.back().end();
--i;
// get the last scope block(std::list<std::list<var> >)
for(;;--i)
{
if(!i->empty())// avoid sigsegv
{
for(std::list<var>::iterator j=i->begin();j!=i->end();++j)
std::cout<<j->get_name()<<std::endl;
}
if(i==scope_list.back().begin())
break;
}
}
return;
}
var get_var(std::string name)
{
if(!scope_list.empty() && !scope_list.back().empty())
{
std::list<std::list<var> >::iterator i=scope_list.back().end();
--i;
// get the last scope block(std::list<std::list<var> >)
for(;;--i)
{
if(!i->empty())// avoid sigsegv
{
for(std::list<var>::iterator j=i->begin();j!=i->end();++j)
if(j->get_name()==name)
return *j;
}
if(i==scope_list.back().begin())
break;
}
}
if(!global.empty())
{
for(std::list<var>::iterator i=global.begin();i!=global.end();++i)
if(i->get_name()==name)
return *i;
}
return error_var;
}
var* append_get_addr(std::string name)
{
var* addr=NULL;
if(!scope_list.empty())
{
int cnt=1;
// append function will get array's address from parameters' scope so the last two blocks will be checked
// because when calling a function,a new block scope will be created.
// but the array does not exist in this block,
// so you must find the block before this block.
std::list<std::list<std::list<var> > >::iterator blk=scope_list.end();
--blk;
for(;;--blk,++cnt)
{
if(!blk->empty())// avoid sigsegv
{
std::list<std::list<var> >::iterator i=blk->end();
--i;
for(;;--i)
{
if(!i->empty())// avoid sigsegv
{
for(std::list<var>::iterator j=i->begin();j!=i->end();++j)
if(j->get_name()==name)
{
addr=&(*j);
return addr;
}
}
if(i==blk->begin())
break;
}
}
if(cnt==2 || blk==scope_list.begin())
break;
}
}
if(!global.empty())// if can't find array's address,find the global scope
{
for(std::list<var>::iterator i=global.begin();i!=global.end();++i)
if(i->get_name()==name)
{
addr=&(*i);
return addr;
}
}
return &error_var;
}
var* get_addr(std::string name)
{
var* addr=NULL;
if(!scope_list.empty() && !scope_list.back().empty())
{
// get the last block
std::list<std::list<var> >::iterator i=scope_list.back().end();
--i;
for(;;--i)
{
if(!i->empty())// avoid sigsegv
for(std::list<var>::iterator j=i->begin();j!=i->end();++j)
if(j->get_name()==name)
{
addr=&(*j);
return addr;
}
if(i==scope_list.back().begin())
break;
}
}
if(!global.empty())
for(std::list<var>::iterator i=global.begin();i!=global.end();++i)
if(i->get_name()==name)
{
addr=&(*i);
return addr;
}
return &error_var;
}
void add_new_block_scope()
{
std::list<std::list<var> > new_list;
scope_list.push_back(new_list);
return;
}
void add_new_local_scope()
{
if(!scope_list.empty())
{
std::list<std::list<std::list<var> > >::iterator i=scope_list.end();
--i;
std::list<var> new_list;
i->push_back(new_list);
}
return;
}
void pop_last_block_scope()
{
if(!scope_list.empty())
scope_list.pop_back();
return;
}
void pop_last_local_scope()
{
if(!scope_list.empty() && !scope_list.back().empty())
scope_list.back().pop_back();
return;
}
};
balloon_scope scope;
#endif