Refactored predicate argument parsing.
This commit is contained in:
parent
b4bc347006
commit
2c564f47d3
@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <iterator>
|
#include <iterator>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
namespace plasp
|
namespace plasp
|
||||||
{
|
{
|
||||||
@ -29,6 +30,9 @@ class Parser
|
|||||||
template<typename Type>
|
template<typename Type>
|
||||||
Type parse();
|
Type parse();
|
||||||
|
|
||||||
|
template<class CharacterCondition>
|
||||||
|
void parseUntil(std::vector<std::string> &container, CharacterCondition characterCondition);
|
||||||
|
|
||||||
template<typename Type>
|
template<typename Type>
|
||||||
void expect(const Type &expectedValue);
|
void expect(const Type &expectedValue);
|
||||||
|
|
||||||
@ -59,6 +63,38 @@ class Parser
|
|||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
template<class CharacterCondition>
|
||||||
|
void Parser::parseUntil(std::vector<std::string> &container, CharacterCondition characterCondition)
|
||||||
|
{
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
skipWhiteSpace();
|
||||||
|
|
||||||
|
std::string value;
|
||||||
|
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
const auto character = *m_position;
|
||||||
|
|
||||||
|
if (characterCondition(character))
|
||||||
|
{
|
||||||
|
container.emplace_back(std::move(value));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (std::isspace(character))
|
||||||
|
break;
|
||||||
|
|
||||||
|
value.push_back(character);
|
||||||
|
advance();
|
||||||
|
}
|
||||||
|
|
||||||
|
container.emplace_back(std::move(value));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -26,17 +26,12 @@ Predicate Predicate::fromSAS(utils::Parser &parser)
|
|||||||
{
|
{
|
||||||
parser.skipLine();
|
parser.skipLine();
|
||||||
|
|
||||||
// TODO: Inefficient, reimplement in one pass
|
predicate.m_name = parser.parse<std::string>();
|
||||||
const std::string line = parser.getLine();
|
|
||||||
|
|
||||||
std::stringstream lineStream(line);
|
parser.parseUntil(predicate.m_arguments, [](const auto character)
|
||||||
lineStream >> predicate.m_name;
|
{
|
||||||
|
return character == '\n';
|
||||||
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)
|
catch (const std::exception &e)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user