You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
107 lines
2.2 KiB
107 lines
2.2 KiB
#include <inttypes.h> |
|
#include "init.h" |
|
#include "debug.h" |
|
#include "object.h" |
|
#include "globals.h" |
|
#include "arifmetic.h" |
|
#include "parser/parser.h" |
|
#include "parser/grammatical.h" |
|
#include "parser/lexical.h" |
|
|
|
int ParseConfigFile(char* config) |
|
{ |
|
yyscan_t scanner; |
|
struct lexical_extra extra; |
|
FILE* conffd; |
|
int ret; |
|
|
|
conffd=fopen(config,"r"); |
|
if(conffd==0) |
|
{ |
|
COUT(ERROR)<<"Can't open file "<<config<<std::endl; |
|
return 1; |
|
} |
|
extra.filename=config; |
|
extra.inclevel=0; |
|
extra.maxinclevel=10; |
|
extra.curline=1; |
|
extra.curpos=extra.curoffset=0; |
|
conflex_init_extra(&extra,&scanner); |
|
confset_in(conffd,scanner); |
|
// {YYSTYPE qqq; while(conflex(&qqq,scanner)>0);} |
|
ret=confparse(scanner); |
|
conflex_destroy(scanner); |
|
fclose(conffd); |
|
return ret; |
|
} |
|
|
|
|
|
int RegisterArifmeticFunctions() |
|
{ |
|
RegisterFunction("ADD",Arifm_Add); |
|
RegisterFunction("SUB",Arifm_Sub); |
|
RegisterFunction("MUL",Arifm_Mul); |
|
RegisterFunction("DIV",Arifm_Div); |
|
RegisterFunction("POW",Arifm_Pow); |
|
RegisterFunction("POS",Arifm_Pos); |
|
RegisterFunction("NEG",Arifm_Neg); |
|
|
|
RegisterFunction("GET",Get<ObjectList>); |
|
RegisterFunction("GET",Get<ObjectPair>); |
|
return 0; |
|
} |
|
|
|
|
|
int BuildDepTree(DepTree* deptree,std::set<std::string>& used) |
|
{ |
|
return deptree->CreateGlobalTree(used); |
|
} |
|
|
|
|
|
int CheckFunctions() |
|
{ |
|
std::set<std::string> funcs; |
|
|
|
for(auto& i:G_tosave) |
|
{ |
|
i->UsedFuncs(funcs); |
|
for(auto& f:funcs) if(G_funcs.find(f)==G_funcs.end()) |
|
{ |
|
COUT(ERROR)<<"Unknown function "<<f<<" in directive save"<<i->Dump()<<std::endl; |
|
return 1; |
|
} |
|
funcs.clear(); |
|
} |
|
|
|
for(auto& i:G_toprint) |
|
{ |
|
i->UsedFuncs(funcs); |
|
for(auto& f:funcs) if(G_funcs.find(f)==G_funcs.end()) |
|
{ |
|
COUT(ERROR)<<"Unknown function "<<f<<" in directive print"<<i->Dump()<<std::endl; |
|
return 1; |
|
} |
|
funcs.clear(); |
|
} |
|
|
|
for(auto& i:G_vars) |
|
{ |
|
i.second->UsedFuncs(funcs); |
|
for(auto& f:funcs) if(G_funcs.find(f)==G_funcs.end()) |
|
{ |
|
COUT(ERROR)<<"Unknown function "<<f<<" in definition of variable "<<i.first<<std::endl; |
|
return 1; |
|
} |
|
funcs.clear(); |
|
} |
|
|
|
return 0; |
|
} |
|
|
|
|
|
void DumpConfig() |
|
{ |
|
for(auto& i: G_vars) COUT(INFO)<<i.first<<"="+i.second->Dump()<<";"<<std::endl; |
|
for(auto& i: G_tosave) COUT(INFO)<<"save"<<i->Dump()<<";"<<std::endl; |
|
for(auto& i: G_toprint) COUT(INFO)<<"print"<<i->Dump()<<";"<<std::endl; |
|
}
|
|
|