Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
d938c59
Add applicative parser
rprospero Jun 22, 2026
7f8d043
Add function call overload for parsers
rprospero Jun 22, 2026
8e71769
Allow exact tests
rprospero Jun 22, 2026
15b790d
Enable exact parses
rprospero Jun 22, 2026
15439ba
Rework double parsing
rprospero Jun 22, 2026
42bb805
Add Vector3 parser
rprospero Jun 22, 2026
66833dd
Add parser for StructureAtom
rprospero Jun 22, 2026
16d33a0
Start parsing xyz structures
rprospero Jun 22, 2026
b47ea24
Reworking with stream base
rprospero Jun 23, 2026
b52d1b5
Start fixing up StructureAtom
rprospero Jun 23, 2026
15dbe67
No required final newline in Structure
rprospero Jun 23, 2026
7c174af
Get structure import working
rprospero Jun 23, 2026
6837977
Simplify apply on parsers
rprospero Jun 23, 2026
2aab03c
Remove explicit call to template type in lambda
rprospero Jun 23, 2026
9fc22d5
Explicit nullopt in null parsers
rprospero Jun 24, 2026
026c85c
Turn null parser into a function
rprospero Jun 24, 2026
afd5c27
Update src/base/applicative.cpp
rprospero Jun 24, 2026
2d04d17
Update src/base/applicative.cpp
rprospero Jun 24, 2026
ae822a5
Update tests/io/applicative.cpp
rprospero Jun 24, 2026
8918bdf
Update tests/io/applicative.cpp
rprospero Jun 24, 2026
1709810
Update src/base/applicative.h
rprospero Jun 24, 2026
2df5259
Update tests/io/applicative.cpp
rprospero Jun 24, 2026
06e44a1
Update src/base/applicative.h
rprospero Jun 24, 2026
f5c63fb
Update src/nodes/importXYZStructure.cpp
rprospero Jun 24, 2026
b292355
Rename Parsers namespace
rprospero Jun 24, 2026
2ae7f20
Assort Pr suggestions
rprospero Jun 24, 2026
f59e75c
Rename inlineSpaces
rprospero Jun 24, 2026
09d8bcc
Sort cmake file
rprospero Jun 24, 2026
4973993
Move more Structure parsing code into node
rprospero Jun 24, 2026
17dc164
Update src/base/parserLibrary.h
rprospero Jun 26, 2026
e4006cc
Update src/base/parserLibrary.cpp
rprospero Jun 26, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 13 additions & 11 deletions src/base/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,27 +1,29 @@
add_library(
base
applicative.cpp
cbor.cpp
enumOptionsBase.cpp
geometry.cpp
lineParser.cpp
lock.cpp
messenger.cpp
outputHandler.cpp
sysFunc.cpp
timer.cpp
units.cpp
version.cpp
enumOption.h
enumOptionsBase.h
enumOptions.h
enumOptionsBase.cpp
enumOptionsBase.h
geometry.cpp
geometry.h
lineParser.cpp
lineParser.h
lock.cpp
lock.h
messenger.cpp
messenger.h
outputHandler.cpp
outputHandler.h
parserLibrary.cpp
sysFunc.cpp
sysFunc.h
timer.cpp
timer.h
units.cpp
units.h
version.cpp
version.h
)

Expand Down
90 changes: 90 additions & 0 deletions src/base/applicative.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
// SPDX-License-Identifier: GPL-3.0-or-later
// Copyright (c) 2026 Team Dissolve and contributors

#include "applicative.h"

#include <algorithm>
#include <cmath>
#include <sstream>

namespace Parsers
{

// A parser that expects an exact string
Parser<std::string_view> literal(std::string_view constant) { return Parser<std::string_view>(constant); }

Parser<std::string> takeWhile(std::function<bool(char)> f)
{
Parser<std::string> result(
[f](auto &input) -> ParserOutput<std::string>
{
if (input.eof())
return {};
std::string result = "";
while (f(input.peek()))
result.push_back(input.get());
if (result.empty())
return {};
return {{result, input}};
});
return result;
}

// A parser that accepts and amount of whitespace
Parser<std::string> spaces()
{
return takeWhile([](const char c) { return isspace(c); });
}
// A parser that accepts space and tab
Parser<std::string> inlineSpaces()
{
return takeWhile([](const char c) { return c == ' ' || c == '\t'; });
}
// A parse that accepts any amount of visible characters
Parser<std::string> graphs()
{
return takeWhile([](const char c) { return std::isgraph(c); });
}
// A parse that accepts any amount of alphanumeric characters
Parser<std::string> alphanums()
{
return takeWhile([](const char c) { return std::isalnum(c); });
}
// A parse that accepts any amount of letters
Parser<std::string> alphas()
{
return takeWhile([](const char c) { return std::isalpha(c); });
}
// A parse that accepts any amount of upper case letters
Parser<std::string> uppers()
{
return takeWhile([](const char c) { return std::isupper(c); });
}
// A parse that accepts any amount of lower case letters
Parser<std::string> lowers()
{
return takeWhile([](const char c) { return std::islower(c); });
}
// A parse that accepts any amount of punctuation case letters
Parser<std::string> punctuations()
{
return takeWhile([](const char c) { return std::ispunct(c); });
}
// A parser that accepts any amount of digit characters
Parser<std::string> digits()
{
return takeWhile([](const char c) { return std::isdigit(c); });
}

// A parser that continues until a newline
Parser<std::string> inlines()
{
return takeWhile([](const auto c) { return c != '\r' && c != '\n'; });
}

// A parser that matches newline characters
Parser<std::string_view> newlines() { return "\r\n"_p | "\n"_p; }

// A quick wrapper for easily making parses from strings
Parser<std::string_view> operator""_p(const char *text, size_t size) { return literal(std::string_view(text, size)); }
} // namespace Parsers
Loading
Loading