Better handling for the lexer name

This commit is contained in:
Robin Jadoul 2016-05-27 17:19:46 +02:00
parent ff815036fb
commit a6cf6b7372
2 changed files with 42 additions and 4 deletions

View File

@ -4,15 +4,32 @@
#include <iostream> #include <iostream>
#include <fstream> #include <fstream>
namespace {
/**
* Filter only valid identifier chars: alphanumeric, and not starting with a digit
*/
std::string clean(std::string in) {
std::string s;
for (char c : in) {
if ((s.length() && std::isalnum(c)) || std::isalpha(c))
s += c;
}
return s;
}
}
namespace lxs { namespace lxs {
Driver::Driver(std::unique_ptr<BackendManager> backends, std::istream& inputfile, std::string outputdir, std::string language, std::string lexername) : Driver::Driver(std::unique_ptr<BackendManager> backends, std::istream& inputfile, std::string outputdir, std::string language, std::string lexername) :
m_backends(std::move(backends)), m_backends(std::move(backends)),
m_inputfile(inputfile), m_inputfile(inputfile),
m_outputdir(outputdir), m_outputdir(outputdir),
m_language(language), m_language(language),
m_lexername(lexername) m_lexername(clean(lexername))
{ {
//TODO clean lexername if (!m_lexername.length()) {
std::cerr << "No valid lexer name possible" << std::endl;
exit(1);
}
} }
Driver::~Driver() Driver::~Driver()

View File

@ -29,14 +29,35 @@ int main(int argc, char** argv) {
return 1; return 1;
} }
#ifdef _WIN32
const char PATHSEP = '\\';
#else
const char PATHSEP = '/';
#endif
std::string lexername = options["lexername"]; std::string lexername = options["lexername"];
//FIXME: this really needs some more work...
if (!lexername.length()) { if (!lexername.length()) { //The option is empty
if (args[0].length() >= 4 && args[0].substr(args[0].length() - 4, 4) == ".lxs") { if (args[0].length() >= 4 && args[0].substr(args[0].length() - 4, 4) == ".lxs") {
lexername = args[0].substr(0, args[0].length() - 4); //Drop the .lxs lexername = args[0].substr(0, args[0].length() - 4); //Drop the .lxs
} else { } else {
lexername = args[0]; lexername = args[0];
} }
std::size_t pos;
// '/' can be used on most platforms (even windows)
pos = lexername.find_last_of('/');
if (pos != lexername.npos) {
lexername = lexername.substr(pos + 1);
}
// strip platform specific as well
pos = lexername.find_last_of(PATHSEP);
if (pos != lexername.npos) {
lexername = lexername.substr(pos + 1);
}
} }
std::unique_ptr<lxs::BackendManager> backends(new lxs::BackendManager()); std::unique_ptr<lxs::BackendManager> backends(new lxs::BackendManager());