First usable generator source.
Still issues with usage rules and error reporting, but functional.
This commit is contained in:
80
generator/templates/ArgGrammarDriver.cpp
Normal file
80
generator/templates/ArgGrammarDriver.cpp
Normal 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
|
||||
Reference in New Issue
Block a user