First usable generator source.

Still issues with usage rules and error reporting, but functional.
This commit is contained in:
2019-09-28 16:01:40 +01:00
parent 54de004ede
commit 60d0446cf0
24 changed files with 1605 additions and 0 deletions

View File

@@ -0,0 +1,80 @@
{{=@@ @@=}}
#include <cassert>
#include <fstream>
#include "@@{argspec}@@ArgGrammarDriver.hpp"
#include "@@{argspec}@@ArgGrammarScanner.hpp"
namespace @@{argspec}@@ArgGrammar {
Driver::Driver(int argc, char* argv[]) : argc{ argc }, argv{ argv }, scanner{}, parser{} {
assert(argc > 0 && "Arguments must include program invocation");
}
Driver::~Driver() {
delete scanner;
delete parser;
}
Driver::Result Driver::parse() {
if (scanner)
delete scanner;
try {
scanner = new Scanner(argc, argv, *this);
} catch (const std::bad_alloc& ba) {
std::cerr << "Failed to allocate scanner: \"" << ba.what() << "\". Exiting!\n";
exit(EXIT_FAILURE);
}
if (parser)
delete parser;
try {
parser = new Parser(*scanner, *this);
} catch (const std::bad_alloc& ba) {
std::cerr << "Failed to allocate parser: \"" << ba.what() << "\". Exiting!\n";
exit(EXIT_FAILURE);
}
if (parser->parse() != 0) {
std::cerr << "Parsing failure!\n";
}
return result;
}
void Driver::addArg(const FlagArg flag) {
flagArguments.insert(flag);
}@@#any_parameters@@
void Driver::addArg(const ParamArg flag, std::vector<std::string> parameters) {
paramArguments.insert_or_assign(flag, parameters);
}@@/any_parameters@@
bool Driver::getArg(const FlagArg flag) const {
return (flagArguments.find(flag) != flagArguments.end());
}@@#any_parameters@@
std::optional<std::vector<std::string>> Driver::getArg(const ParamArg flag) const {
try {
return std::make_optional(paramArguments.at(flag));
} catch (const std::out_of_range& ignored) {
return std::nullopt;
}
}@@/any_parameters@@
void Driver::setResult(Driver::Result result) {
this->result = result;
}
const std::set<FlagArg>& Driver::getFlagArgs() const {
return flagArguments;
}@@#any_parameters@@
const std::map<ParamArg, std::vector<std::string>>& Driver::getParamArgs() const {
return paramArguments;
}@@/any_parameters@@
char** Driver::getArgv() {
return argv;
}
} // namespace trueArgGrammar