patrick
/
plasp
Archived
1
0
Fork 0
This repository has been archived on 2023-07-19. You can view files and clone it, but cannot push or open issues or pull requests.
plasp/src/plasp/sas/Predicate.cpp

108 lines
2.2 KiB
C++

#include <plasp/sas/Predicate.h>
#include <iostream>
#include <limits>
#include <sstream>
#include <plasp/utils/IO.h>
#include <plasp/utils/ParserException.h>
namespace plasp
{
namespace sas
{
////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Predicate
//
////////////////////////////////////////////////////////////////////////////////////////////////////
Predicate Predicate::fromSAS(utils::Parser &parser)
{
Predicate predicate;
try
{
parser.skipLine();
// TODO: Inefficient, reimplement in one pass
const std::string line = parser.getLine();
std::stringstream lineStream(line);
lineStream >> predicate.m_name;
while (lineStream.peek() == ' ')
lineStream.ignore(1);
for (std::string argument; std::getline(lineStream, argument, ' ');)
predicate.m_arguments.push_back(std::move(argument));
}
catch (const std::exception &e)
{
throw utils::ParserException(parser.row(), parser.column(), "Could not parse operator predicate");
}
return predicate;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
const std::string &Predicate::name() const
{
return m_name;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
const Predicate::Arguments &Predicate::arguments() const
{
return m_arguments;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
void Predicate::printAsSAS(std::ostream &ostream) const
{
if (m_arguments.empty())
{
ostream << m_name;
return;
}
for (size_t i = 0; i < m_arguments.size(); i++)
{
if (i > 0)
ostream << " ";
ostream << m_arguments[i];
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////
void Predicate::printAsASP(std::ostream &ostream) const
{
if (m_arguments.empty())
{
ostream << utils::escapeASP(m_name);
return;
}
ostream << utils::escapeASP(m_name) << "(";
for (size_t i = 0; i < m_arguments.size(); i++)
{
if (i > 0)
ostream << ", ";
ostream << utils::escapeASP(m_arguments[i]);
}
ostream << ")";
}
////////////////////////////////////////////////////////////////////////////////////////////////////
}
}