Argument::Argument(const std::string& str, SymbolTable symbol_table, bool isRel, Log log) { StrVarMap v_map; if(str[0] != '(') { if(str[0] == '?') { t = Argument::Var; val = str; return; } Symbol* sym; size_t id = symbol_table.CheckEntry(str, 0, isRel, sym); if(sym == NULL) id = symbol_table.AddEntry(str, Location(), 0, isRel); if(isRel) t = Argument::Relation; else t = Argument::Function; value = id; return; } std::string cmd; StringVec args; if(!SeparateCommand(str, cmd, args, log)) { log.Fatal << "Unable to construct argument from " << str << std::endl; return; } Symbol* sym; size_t id = symbol_table.CheckEntry(cmd, args.size(), isRel, sym); if(sym == NULL) id = symbol_table.AddEntry(cmd, Location(), args.size(), isRel); if(isRel) t = Argument::Relation; else t = Argument::Function; value = id; for(size_t i = 0;i < args.size();i++) { Argument *arg; if(id == SymbolTable::NotID || id == SymbolTable::OrID) arg = ConstructArgument(args[i], v_map, symbol_table, true, log); else arg = ConstructArgument(args[i], v_map, symbol_table, false, log); if(arg != NULL) this->args.push_back(arg); } }