{{=@@ @@=}} #pragma once #include "@@{argspec}@@ArgGrammarParser.tab.hh" #include #include @@#any_parameters@@ #include #include @@/any_parameters@@ #include namespace @@{argspec}@@ArgGrammar { enum class FlagArg { @@#argument_tokens@@@@^has_parameters@@@@{clean_token}@@, @@/has_parameters@@@@/argument_tokens@@ };@@#any_parameters@@ enum class ParamArg { @@#argument_tokens@@@@#has_parameters@@@@{clean_token}@@, @@/has_parameters@@@@/argument_tokens@@ };@@/any_parameters@@ class Scanner; class Driver { public: enum class Result { success, completedAction, wrongArgument }; Driver(int argc, char* argv[]); virtual ~Driver(); Result parse(); void addArg(const FlagArg flag);@@#any_parameters@@ void addArg(const ParamArg flag, const std::vector arguments);@@/any_parameters@@ bool getArg(const FlagArg flag) const;@@#any_parameters@@ std::optional> getArg(const ParamArg flag) const;@@/any_parameters@@ void setResult(Result result); const std::set& getFlagArgs() const;@@#any_parameters@@ const std::map>& getParamArgs() const;@@/any_parameters@@ std::ostream& print(std::ostream& oss); char** getArgv(); private: int argc; char** argv; Result result = Result::success; void parseHelper(std::istream& iss); @@{argspec}@@ArgGrammar::Parser* parser = nullptr; @@{argspec}@@ArgGrammar::Scanner* scanner = nullptr; /* * specialised data store */ std::set flagArguments;@@#any_parameters@@ std::map> paramArguments;@@/any_parameters@@ }; } // namespace trueArgGrammar