Escaping predicates containing hyphens for ASP output.
This commit is contained in:
parent
4258dfcfd0
commit
d8d6998936
@ -1,12 +1,15 @@
|
|||||||
#ifndef __UTILS__PARSING_H
|
#ifndef __UTILS__PARSING_H
|
||||||
#define __UTILS__PARSING_H
|
#define __UTILS__PARSING_H
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
#include <exception>
|
#include <exception>
|
||||||
#include <iosfwd>
|
#include <iosfwd>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <typeinfo>
|
#include <typeinfo>
|
||||||
|
|
||||||
|
#include <boost/algorithm/string/replace.hpp>
|
||||||
|
|
||||||
#include <plasp/utils/ParserException.h>
|
#include <plasp/utils/ParserException.h>
|
||||||
|
|
||||||
namespace plasp
|
namespace plasp
|
||||||
@ -56,6 +59,30 @@ void parseExpected(std::istream &istream, const T &expectedValue)
|
|||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
inline std::string escapeASP(const std::string &string)
|
||||||
|
{
|
||||||
|
auto escaped = string;
|
||||||
|
|
||||||
|
boost::replace_all(escaped, "_", "__");
|
||||||
|
boost::replace_all(escaped, "-", "_h");
|
||||||
|
|
||||||
|
return escaped;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
inline std::string unescapeASP(const std::string &string)
|
||||||
|
{
|
||||||
|
auto unescaped = string;
|
||||||
|
|
||||||
|
boost::replace_all(unescaped, "_h", "-");
|
||||||
|
boost::replace_all(unescaped, "__", "_");
|
||||||
|
|
||||||
|
return unescaped;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -85,18 +85,18 @@ void Predicate::printAsASP(std::ostream &ostream) const
|
|||||||
{
|
{
|
||||||
if (m_arguments.empty())
|
if (m_arguments.empty())
|
||||||
{
|
{
|
||||||
ostream << m_name;
|
ostream << utils::escapeASP(m_name);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ostream << m_name << "(";
|
ostream << utils::escapeASP(m_name) << "(";
|
||||||
|
|
||||||
for (size_t i = 0; i < m_arguments.size(); i++)
|
for (size_t i = 0; i < m_arguments.size(); i++)
|
||||||
{
|
{
|
||||||
if (i > 0)
|
if (i > 0)
|
||||||
ostream << ", ";
|
ostream << ", ";
|
||||||
|
|
||||||
ostream << m_arguments[i];
|
ostream << utils::escapeASP(m_arguments[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
ostream << ")";
|
ostream << ")";
|
||||||
|
@ -108,14 +108,14 @@ void Value::printAsASP(std::ostream &ostream) const
|
|||||||
if (m_sign == Value::Sign::Negative)
|
if (m_sign == Value::Sign::Negative)
|
||||||
ostream << "not ";
|
ostream << "not ";
|
||||||
|
|
||||||
ostream << m_name;
|
ostream << utils::escapeASP(m_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
void Value::printAsASPCommaSeparated(std::ostream &ostream) const
|
void Value::printAsASPCommaSeparated(std::ostream &ostream) const
|
||||||
{
|
{
|
||||||
ostream << m_name << ", " << (m_sign == Sign::Positive ? "true" : "false");
|
ostream << utils::escapeASP(m_name) << ", " << (m_sign == Sign::Positive ? "true" : "false");
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
16
tests/TestUtils.cpp
Normal file
16
tests/TestUtils.cpp
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
#include <gtest/gtest.h>
|
||||||
|
|
||||||
|
#include <plasp/utils/Parsing.h>
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
TEST(UtilsTests, EscapeASP)
|
||||||
|
{
|
||||||
|
const std::string predicate = "action(stack_on(block-1, block-2))";
|
||||||
|
|
||||||
|
const auto escaped = plasp::utils::escapeASP(predicate);
|
||||||
|
const auto unescaped = plasp::utils::unescapeASP(escaped);
|
||||||
|
|
||||||
|
ASSERT_EQ(escaped.find("-"), std::string::npos);
|
||||||
|
ASSERT_EQ(predicate, unescaped);
|
||||||
|
}
|
Reference in New Issue
Block a user