Removed unnecessary file.
This commit is contained in:
parent
015c34fc2b
commit
252f50108b
@ -10,7 +10,6 @@
|
||||
|
||||
#include <plasp/utils/ParserException.h>
|
||||
#include <plasp/utils/ParserPolicy.h>
|
||||
#include <plasp/utils/ParserTraits.h>
|
||||
#include <plasp/utils/Stream.h>
|
||||
#include <plasp/utils/StreamCoordinate.h>
|
||||
|
||||
|
@ -1,363 +0,0 @@
|
||||
#ifndef __PLASP__UTILS__PARSER_TRAITS_H
|
||||
#define __PLASP__UTILS__PARSER_TRAITS_H
|
||||
|
||||
#include <algorithm>
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
|
||||
namespace plasp
|
||||
{
|
||||
namespace utils
|
||||
{
|
||||
/*
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// ParserTraits
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
template<class ParserPolicy, typename Type>
|
||||
class ParserTraits
|
||||
{
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
template<class ParserPolicy>
|
||||
class ParserTraits<ParserPolicy, std::string>
|
||||
{
|
||||
public:
|
||||
static std::string parse(Parser<ParserPolicy> &parser);
|
||||
static bool testAndReturn(Parser<ParserPolicy> &parser, const std::string &value);
|
||||
static bool testAndSkip(Parser<ParserPolicy> &parser, const std::string &value);
|
||||
static void expect(Parser<ParserPolicy> &parser, const std::string &expectedValue);
|
||||
static bool test(Parser<ParserPolicy> &parser, const std::string &value);
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
template<class ParserPolicy>
|
||||
class ParserTraits<ParserPolicy, char>
|
||||
{
|
||||
public:
|
||||
static char parse(Parser<ParserPolicy> &parser);
|
||||
static bool testAndReturn(Parser<ParserPolicy> &parser, const char &value);
|
||||
static bool testAndSkip(Parser<ParserPolicy> &parser, const char &value);
|
||||
static void expect(Parser<ParserPolicy> &parser, const char &expectedValue);
|
||||
static bool test(Parser<ParserPolicy> &parser, const char &value);
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
template<class ParserPolicy>
|
||||
class ParserTraits<ParserPolicy, uint64_t>
|
||||
{
|
||||
public:
|
||||
static uint64_t parse(Parser<ParserPolicy> &parser);
|
||||
static bool testAndReturn(Parser<ParserPolicy> &parser, const uint64_t &value);
|
||||
static bool testAndSkip(Parser<ParserPolicy> &parser, const uint64_t &value);
|
||||
static void expect(Parser<ParserPolicy> &parser, const uint64_t &expectedValue);
|
||||
static bool test(Parser<ParserPolicy> &parser, const uint64_t &value);
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
template<class ParserPolicy>
|
||||
class ParserTraits<ParserPolicy, int64_t>
|
||||
{
|
||||
public:
|
||||
static int64_t parse(Parser<ParserPolicy> &parser);
|
||||
static bool testAndReturn(Parser<ParserPolicy> &parser, const int64_t &value);
|
||||
static bool testAndSkip(Parser<ParserPolicy> &parser, const int64_t &value);
|
||||
static void expect(Parser<ParserPolicy> &parser, const int64_t &expectedValue);
|
||||
static bool test(Parser<ParserPolicy> &parser, const int64_t &value);
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
template<class ParserPolicy>
|
||||
class ParserTraits<ParserPolicy, uint32_t>
|
||||
{
|
||||
public:
|
||||
static uint32_t parse(Parser<ParserPolicy> &parser);
|
||||
static bool testAndReturn(Parser<ParserPolicy> &parser, const uint32_t &value);
|
||||
static bool testAndSkip(Parser<ParserPolicy> &parser, const uint32_t &value);
|
||||
static void expect(Parser<ParserPolicy> &parser, const uint32_t &expectedValue);
|
||||
static bool test(Parser<ParserPolicy> &parser, const uint32_t &value);
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
template<class ParserPolicy>
|
||||
class ParserTraits<ParserPolicy, int32_t>
|
||||
{
|
||||
public:
|
||||
static int32_t parse(Parser<ParserPolicy> &parser);
|
||||
static bool testAndReturn(Parser<ParserPolicy> &parser, const int32_t &value);
|
||||
static bool testAndSkip(Parser<ParserPolicy> &parser, const int32_t &value);
|
||||
static void expect(Parser<ParserPolicy> &parser, const int32_t &expectedValue);
|
||||
static bool test(Parser<ParserPolicy> &parser, const int32_t &value);
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
template<class ParserPolicy>
|
||||
class ParserTraits<ParserPolicy, bool>
|
||||
{
|
||||
public:
|
||||
static bool parse(Parser<ParserPolicy> &parser);
|
||||
static bool testAndReturn(Parser<ParserPolicy> &parser, const bool &value);
|
||||
static bool testAndSkip(Parser<ParserPolicy> &parser, const bool &value);
|
||||
static void expect(Parser<ParserPolicy> &parser, const bool &expectedValue);
|
||||
static bool test(Parser<ParserPolicy> &parser, const bool &value);
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
template<class Parser, typename Type>
|
||||
bool ParserTraits<Parser, Type>::testAndReturn(Parser &parser, const Type &value)
|
||||
{
|
||||
const auto position = parser.position();
|
||||
|
||||
const auto result = test(parser, value);
|
||||
|
||||
parser.seek(position);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
template<class Parser, typename Type>
|
||||
bool ParserTraits<Parser, Type>::testAndSkip(Parser &parser, const Type &value)
|
||||
{
|
||||
const auto position = parser.position();
|
||||
|
||||
const auto result = test(parser, value);
|
||||
|
||||
if (result == false)
|
||||
parser.seek(position);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
template<class ParserPolicy>
|
||||
void Parser<ParserPolicy>::expect(const Type &expectedValue)
|
||||
{
|
||||
if (testAndSkip(parser, expectedValue))
|
||||
return;
|
||||
|
||||
std::stringstream message;
|
||||
message << "unexpected value, expected “" << expectedValue << "”";
|
||||
|
||||
throw ParserException(parser.coordinate(), message.str());
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
template<class Parser>
|
||||
std::string ParserTraits<Parser, std::string>::parse(Parser &parser)
|
||||
{
|
||||
parser.skipWhiteSpace();
|
||||
|
||||
const auto startPosition = parser.position();
|
||||
|
||||
while (!parser.isWhiteSpace(parser.currentCharacter()))
|
||||
parser.advance();
|
||||
|
||||
const auto endPosition = parser.position();
|
||||
const auto length = static_cast<size_t>(endPosition - startPosition);
|
||||
|
||||
std::string value;
|
||||
value.reserve(length);
|
||||
|
||||
parser.seek(startPosition);
|
||||
|
||||
for (size_t i = 0; i < length; i++)
|
||||
{
|
||||
value.push_back(parser.currentCharacter());
|
||||
parser.advance();
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
template<class Parser>
|
||||
char ParserTraits<Parser, char>::parse(Parser &parser)
|
||||
{
|
||||
const auto value = parser.currentCharacter();
|
||||
|
||||
parser.advance();
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
template<class Parser>
|
||||
uint64_t parseIntegerBody(Parser &parser)
|
||||
{
|
||||
parser.checkStream();
|
||||
|
||||
if (!std::isdigit(parser.currentCharacter()))
|
||||
throw ParserException(parser.coordinate(), "could not parse integer value");
|
||||
|
||||
uint64_t value = 0;
|
||||
|
||||
while (!parser.atEndOfStream())
|
||||
{
|
||||
const auto character = parser.currentCharacter();
|
||||
|
||||
if (!std::isdigit(character))
|
||||
break;
|
||||
|
||||
value *= 10;
|
||||
value += character - '0';
|
||||
|
||||
parser.advance();
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
template<class Parser>
|
||||
int64_t ParserTraits<Parser, int64_t>::parse(Parser &parser)
|
||||
{
|
||||
parser.skipWhiteSpace();
|
||||
|
||||
bool positive = parser.template testAndSkip<char>('+') || !parser.template testAndSkip<char>('-');
|
||||
|
||||
const auto value = parseIntegerBody(parser);
|
||||
|
||||
return (positive ? value : -value);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
template<class Parser>
|
||||
uint64_t ParserTraits<Parser, uint64_t>::parse(Parser &parser)
|
||||
{
|
||||
parser.skipWhiteSpace();
|
||||
|
||||
if (parser.currentCharacter() == '-')
|
||||
throw ParserException(parser.coordinate(), "expected unsigned integer, got signed one");
|
||||
|
||||
return parseIntegerBody(parser);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
template<class Parser>
|
||||
int32_t ParserTraits<Parser, int32_t>::parse(Parser &parser)
|
||||
{
|
||||
return static_cast<int32_t>(ParserTraits<Parser, int64_t>::parse(parser));
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
template<class Parser>
|
||||
uint32_t ParserTraits<Parser, uint32_t>::parse(Parser &parser)
|
||||
{
|
||||
return static_cast<uint32_t>(ParserTraits<Parser, uint64_t>::parse(parser));
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
template<class Parser>
|
||||
bool ParserTraits<Parser, bool>::parse(Parser &parser)
|
||||
{
|
||||
parser.skipWhiteSpace();
|
||||
|
||||
if (parser.template testAndSkip<char>('0'))
|
||||
return false;
|
||||
|
||||
if (parser.template testAndSkip<char>('1'))
|
||||
return true;
|
||||
|
||||
throw ParserException(parser.coordinate(), "could not parse Boolean value");
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
template<class Parser>
|
||||
bool ParserTraits<Parser, std::string>::test(Parser &parser, const std::string &expectedValue)
|
||||
{
|
||||
if (!parser.isWhiteSpace(expectedValue.front()))
|
||||
parser.skipWhiteSpace();
|
||||
|
||||
const auto match = std::find_if(expectedValue.cbegin(), expectedValue.cend(),
|
||||
[&parser](const auto &expectedCharacter)
|
||||
{
|
||||
const auto character = static_cast<char>(parser.currentCharacter());
|
||||
|
||||
if (character != expectedCharacter)
|
||||
return true;
|
||||
|
||||
parser.advance();
|
||||
|
||||
return false;
|
||||
});
|
||||
|
||||
return (match == expectedValue.cend());
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
template<class Parser>
|
||||
bool ParserTraits<Parser, char>::test(Parser &parser, const char &expectedValue)
|
||||
{
|
||||
const auto result = (parser.currentCharacter() == expectedValue);
|
||||
|
||||
parser.advance();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
template<class Parser>
|
||||
bool ParserTraits<Parser, int64_t>::test(Parser &parser, const int64_t &expectedValue)
|
||||
{
|
||||
const auto value = parse(parser);
|
||||
|
||||
return (value == expectedValue);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
template<class Parser>
|
||||
bool ParserTraits<Parser, uint64_t>::test(Parser &parser, const uint64_t &expectedValue)
|
||||
{
|
||||
const auto value = parse(parser);
|
||||
|
||||
return (value == expectedValue);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
template<class Parser>
|
||||
bool ParserTraits<Parser, int32_t>::test(Parser &parser, const int32_t &expectedValue)
|
||||
{
|
||||
return ParserTraits<Parser, int64_t>::test(parser, static_cast<int64_t>(expectedValue));
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
template<class Parser>
|
||||
bool ParserTraits<Parser, uint32_t>::test(Parser &parser, const uint32_t &expectedValue)
|
||||
{
|
||||
return ParserTraits<Parser, uint64_t>::test(parser, static_cast<uint64_t>(expectedValue));
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
*/
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
Reference in New Issue
Block a user