00001 #ifndef PhysicsTools_Utilities_cutParset_h 00002 #define PhysicsTools_Utilities_cutParset_h 00003 #include "PhysicsTools/Utilities/src/SelectorPtr.h" 00004 #include "PhysicsTools/Utilities/src/AnyObjSelector.h" 00005 #include "PhysicsTools/Utilities/src/Grammar.h" 00006 #include "FWCore/Utilities/interface/EDMException.h" 00007 #include <string> 00008 00009 namespace reco { 00010 namespace parser { 00011 template<typename T> 00012 bool cutParser(const std::string & cut, SelectorPtr & sel) { 00013 bool justBlanks = true; 00014 for(std::string::const_iterator c = cut.begin(); c != cut.end(); ++c) { 00015 if(*c != ' ') { justBlanks = false; break; } 00016 } 00017 if(justBlanks) { 00018 sel = SelectorPtr(new AnyObjSelector); 00019 return true; 00020 } else { 00021 using namespace boost::spirit; 00022 Grammar grammar(sel, (const T *)(0)); 00023 bool returnValue = false; 00024 const char* startingFrom =cut.c_str(); 00025 try { 00026 returnValue = parse(startingFrom, grammar.use_parser<0>() >> end_p, space_p).full; 00027 } 00028 catch(BaseException& e) { 00029 throw edm::Exception(edm::errors::Configuration)<<"Cut parser error:"<<baseExceptionWhat(e)<<" (char "<<e.where-startingFrom<<")\n"; 00030 } 00031 return returnValue; 00032 } 00033 } 00034 } 00035 } 00036 00037 #endif