static bool parse_PB(B& in, S& solver, bool abort_on_error) { try{ parseSize(in, solver); parseGoal(in, solver); return parseConstrs(in, solver); }catch (cchar* msg){ if (abort_on_error){ reportf("PARSE ERROR! [line %d] %s\n", in.line, msg); xfree(msg); if (opt_satlive && !opt_try) printf("s UNKNOWN\n"); exit(opt_try ? 5 : 0); }else throw msg; } }
bool FSMDescrip::loadFromXML(const std::string& xmlName, bool verbose) { logger << Logger::INFO_MSG << "Loading behavior from xml: " << xmlName; TiXmlDocument xml(xmlName); bool loadOkay = xml.LoadFile(); if (!loadOkay) { logger << Logger::ERR_MSG << "Could not load behavior configuration xml ("; logger << xmlName << ") due to xml syntax errors.\n"; logger << "\t" << xml.ErrorDesc(); return false; } TiXmlElement* popNode = xml.RootElement(); if (!popNode) { logger << Logger::ERR_MSG << "Root element does not exist."; return false; } if (popNode->ValueStr() != "BFSM") { logger << Logger::ERR_MSG << "Root element value should be \"BFSM\"."; return false; } std::string absPath; os::path::absPath(xmlName, absPath); std::string junk; os::path::split(absPath, _behaviorFldr, junk); logger << Logger::INFO_MSG << "Behavior root: " << _behaviorFldr; TiXmlElement* child; for (child = popNode->FirstChildElement(); child; child = child->NextSiblingElement()) { if (child->ValueStr() == "GoalSet") { int i; if (!child->Attribute("id", &i)) { logger << Logger::ERR_MSG << "GoalSet requires an \"id\" property."; return false; } size_t setID = static_cast<size_t>(i); // confirm that the id doesn't already exist if (_goalSets.find(setID) != _goalSets.end()) { logger << Logger::WARN_MSG << "Found multiple GoalSets with the same id: "; logger << setID << ".\n\tGoal definitions will be merged!"; } else { _goalSets[setID] = new GoalSet(); } TiXmlElement* goalNode; for (goalNode = child->FirstChildElement(); goalNode; goalNode = goalNode->NextSiblingElement()) { if (goalNode->ValueStr() == "Goal") { Goal* goal = parseGoal(goalNode, _behaviorFldr); if (goal == 0x0) { logger << Logger::ERR_MSG << "Error parsing a goal description."; return false; } // Make sure that this goal doesn't duplicate previous goal ids if (!_goalSets[setID]->addGoal(goal->getID(), goal)) { logger << Logger::ERR_MSG << "GoalSet " << setID; logger << " has two goals with the identifier: " << goal->getID(); logger << " (second appears on line " << goalNode->Row() << ")."; return false; } } else { logger << Logger::WARN_MSG << "Found a child tag of the GoalSet that " "is not a \"Goal\" tag on line " << goalNode->Row() << ". " "It will be ignored."; } } } else if (child->ValueStr() == "State") { if (!parseState(child, _behaviorFldr, _states)) { return false; } } else if (child->ValueStr() == "Transition") { std::string from; Transition* trans = parseTransition(child, _behaviorFldr, from); if (trans == 0x0) { return false; } addTransition(from, trans); } else if (child->ValueStr() == "VelModifier") { VelModifier* vel = parseVelModifier(child, _behaviorFldr); if (vel == 0x0) { return false; } else { _velModifiers.push_back(vel); } } else if (child->ValueStr() == "Task") { Task* task = parseTask(child, _behaviorFldr); if (task == 0x0) { logger << Logger::WARN_MSG << "User-specified Task on line "; logger << child->Row() << " couldn't be instantiated. " "It is being ignored."; } else { _tasks.push_back(task); } } else if (child->ValueStr() == "EventSystem") { if (!EVENT_SYSTEM->parseEvents(child, _behaviorFldr)) { return false; } } else { logger << Logger::ERR_MSG << "Unrecognized tag as child of <Population>: <"; logger << child->ValueStr() << ">."; return false; } } return true; }
std::unique_ptr<AST::Node> Parser_Ast::Impl::parse() { return parseGoal(); }