2016-05-21 02:03:45 +02:00
|
|
|
#include <plasp/sas/Predicate.h>
|
|
|
|
|
|
|
|
#include <iostream>
|
2016-05-22 16:00:58 +02:00
|
|
|
#include <limits>
|
|
|
|
#include <sstream>
|
|
|
|
|
2016-11-29 06:03:05 +01:00
|
|
|
#include <plasp/output/Formatting.h>
|
2016-05-21 02:03:45 +02:00
|
|
|
|
2017-05-12 14:17:57 +02:00
|
|
|
#include <tokenize/TokenizerException.h>
|
2017-05-09 15:05:59 +02:00
|
|
|
|
2016-05-21 02:03:45 +02:00
|
|
|
namespace plasp
|
|
|
|
{
|
|
|
|
namespace sas
|
|
|
|
{
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
|
|
|
// Predicate
|
|
|
|
//
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2017-05-12 14:17:57 +02:00
|
|
|
Predicate Predicate::fromSAS(tokenize::Tokenizer<> &tokenizer)
|
2016-05-22 16:00:58 +02:00
|
|
|
{
|
|
|
|
Predicate predicate;
|
|
|
|
|
|
|
|
try
|
|
|
|
{
|
2017-05-12 14:17:57 +02:00
|
|
|
tokenizer.skipLine();
|
2016-05-22 16:00:58 +02:00
|
|
|
|
2017-05-12 14:17:57 +02:00
|
|
|
predicate.m_name = tokenizer.get<std::string>();
|
2016-05-22 16:00:58 +02:00
|
|
|
|
2016-05-29 15:08:10 +02:00
|
|
|
while (true)
|
|
|
|
{
|
2016-08-30 13:01:22 +02:00
|
|
|
// Skip whitespace but not newlines
|
2017-05-12 14:17:57 +02:00
|
|
|
tokenizer.skipBlankSpace();
|
2016-05-29 15:08:10 +02:00
|
|
|
|
2016-08-30 13:01:22 +02:00
|
|
|
// TODO: check \r handling
|
2017-05-12 14:17:57 +02:00
|
|
|
if (tokenizer.currentCharacter() == '\n')
|
2016-05-29 15:08:10 +02:00
|
|
|
break;
|
|
|
|
|
2017-05-12 14:17:57 +02:00
|
|
|
const auto value = tokenizer.get<std::string>();
|
2016-05-29 15:08:10 +02:00
|
|
|
predicate.m_arguments.emplace_back(std::move(value));
|
|
|
|
}
|
2016-05-22 16:00:58 +02:00
|
|
|
}
|
|
|
|
catch (const std::exception &e)
|
|
|
|
{
|
2017-05-12 14:17:57 +02:00
|
|
|
throw tokenize::TokenizerException(tokenizer.location(), "could not parse operator predicate");
|
2016-05-22 16:00:58 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
return predicate;
|
|
|
|
}
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
const std::string &Predicate::name() const
|
|
|
|
{
|
|
|
|
return m_name;
|
|
|
|
}
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
const Predicate::Arguments &Predicate::arguments() const
|
|
|
|
{
|
|
|
|
return m_arguments;
|
|
|
|
}
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2016-11-29 06:03:05 +01:00
|
|
|
void Predicate::printAsSAS(output::ColorStream &stream) const
|
2016-05-22 16:00:58 +02:00
|
|
|
{
|
|
|
|
if (m_arguments.empty())
|
|
|
|
{
|
2016-11-29 06:03:05 +01:00
|
|
|
stream << m_name;
|
2016-05-22 16:00:58 +02:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (size_t i = 0; i < m_arguments.size(); i++)
|
|
|
|
{
|
|
|
|
if (i > 0)
|
2016-11-29 06:03:05 +01:00
|
|
|
stream << " ";
|
2016-05-22 16:00:58 +02:00
|
|
|
|
2016-11-29 06:03:05 +01:00
|
|
|
stream << m_arguments[i];
|
2016-05-22 16:00:58 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2016-11-29 06:03:05 +01:00
|
|
|
void Predicate::printAsASP(output::ColorStream &stream) const
|
2016-05-21 02:03:45 +02:00
|
|
|
{
|
2016-05-22 16:00:58 +02:00
|
|
|
if (m_arguments.empty())
|
|
|
|
{
|
2016-11-29 06:03:05 +01:00
|
|
|
stream << output::String(m_name.c_str());
|
2016-05-22 16:00:58 +02:00
|
|
|
return;
|
|
|
|
}
|
2016-05-21 02:31:47 +02:00
|
|
|
|
2016-11-29 06:03:05 +01:00
|
|
|
stream << "(" << output::String(m_name.c_str());
|
2016-05-21 02:03:45 +02:00
|
|
|
|
2016-05-22 16:00:58 +02:00
|
|
|
for (size_t i = 0; i < m_arguments.size(); i++)
|
2016-11-29 06:03:05 +01:00
|
|
|
stream << ", " << output::String(m_arguments[i].c_str());
|
2016-05-21 02:03:45 +02:00
|
|
|
|
2016-11-29 06:03:05 +01:00
|
|
|
stream << ")";
|
2016-05-21 02:03:45 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|