Namespace the lexer module
Future proofing any name collisions.
This commit is contained in:
@@ -24,9 +24,13 @@ static_assert(NUMBER_OF_OPCODES == 99, "ERROR: Lexer is out of date");
|
|||||||
|
|
||||||
using std::string, std::string_view, std::pair, std::make_pair;
|
using std::string, std::string_view, std::pair, std::make_pair;
|
||||||
|
|
||||||
const auto VALID_SYMBOL = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUV"
|
namespace Lexer
|
||||||
|
{
|
||||||
|
constexpr auto VALID_SYMBOL =
|
||||||
|
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUV"
|
||||||
"WXYZ0123456789-_.:%#$",
|
"WXYZ0123456789-_.:%#$",
|
||||||
VALID_DIGIT = "0123456789", VALID_HEX = "0123456789abcdefABCDEF";
|
VALID_DIGIT = "0123456789",
|
||||||
|
VALID_HEX = "0123456789abcdefABCDEF";
|
||||||
|
|
||||||
bool is_char_in_s(char c, const char *s)
|
bool is_char_in_s(char c, const char *s)
|
||||||
{
|
{
|
||||||
@@ -275,9 +279,9 @@ pair<Token, lerr_t> tokenise_literal_char(string_view &source, size_t &column,
|
|||||||
// Escape sequence
|
// Escape sequence
|
||||||
char escape = '\0';
|
char escape = '\0';
|
||||||
if (source.size() < 4 || source[3] != '\'')
|
if (source.size() < 4 || source[3] != '\'')
|
||||||
return make_pair(t,
|
return make_pair(
|
||||||
lerr_t(lerr_type_t::INVALID_CHAR_LITERAL_ESCAPE_SEQUENCE,
|
t, lerr_t(lerr_type_t::INVALID_CHAR_LITERAL_ESCAPE_SEQUENCE, column,
|
||||||
column, line));
|
line));
|
||||||
switch (source[2])
|
switch (source[2])
|
||||||
{
|
{
|
||||||
case 'n':
|
case 'n':
|
||||||
@@ -294,9 +298,9 @@ pair<Token, lerr_t> tokenise_literal_char(string_view &source, size_t &column,
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
column += 2;
|
column += 2;
|
||||||
return make_pair(t,
|
return make_pair(
|
||||||
lerr_t(lerr_type_t::INVALID_CHAR_LITERAL_ESCAPE_SEQUENCE,
|
t, lerr_t(lerr_type_t::INVALID_CHAR_LITERAL_ESCAPE_SEQUENCE, column,
|
||||||
column, line));
|
line));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
t = Token{Token::Type::LITERAL_CHAR, std::to_string(escape), column};
|
t = Token{Token::Type::LITERAL_CHAR, std::to_string(escape), column};
|
||||||
@@ -334,7 +338,8 @@ lerr_t tokenise_buffer(string_view source, std::vector<Token *> &tokens)
|
|||||||
{
|
{
|
||||||
size_t i;
|
size_t i;
|
||||||
for (i = 0;
|
for (i = 0;
|
||||||
i < source.size() && (isspace(source[i]) || source[i] == '\0'); ++i)
|
i < source.size() && (isspace(source[i]) || source[i] == '\0');
|
||||||
|
++i)
|
||||||
{
|
{
|
||||||
++column;
|
++column;
|
||||||
if (source[i] == '\n')
|
if (source[i] == '\n')
|
||||||
@@ -563,3 +568,4 @@ std::ostream &operator<<(std::ostream &os, lerr_t &lerr)
|
|||||||
lerr_t::lerr_t(lerr_type_t type, size_t col, size_t line)
|
lerr_t::lerr_t(lerr_type_t type, size_t col, size_t line)
|
||||||
: col{col}, line{line}, type{type}
|
: col{col}, line{line}, type{type}
|
||||||
{}
|
{}
|
||||||
|
} // namespace Lexer
|
||||||
|
|||||||
@@ -18,6 +18,8 @@
|
|||||||
#include <tuple>
|
#include <tuple>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
namespace Lexer
|
||||||
|
{
|
||||||
struct Token
|
struct Token
|
||||||
{
|
{
|
||||||
enum class Type
|
enum class Type
|
||||||
@@ -100,5 +102,6 @@ struct lerr_t
|
|||||||
std::ostream &operator<<(std::ostream &, lerr_t &);
|
std::ostream &operator<<(std::ostream &, lerr_t &);
|
||||||
|
|
||||||
lerr_t tokenise_buffer(std::string_view, std::vector<Token *> &);
|
lerr_t tokenise_buffer(std::string_view, std::vector<Token *> &);
|
||||||
|
} // namespace Lexer
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -30,6 +30,8 @@ extern "C"
|
|||||||
using std::cout, std::cerr, std::endl;
|
using std::cout, std::cerr, std::endl;
|
||||||
using std::pair, std::string, std::string_view, std::vector;
|
using std::pair, std::string, std::string_view, std::vector;
|
||||||
|
|
||||||
|
using Lexer::Token, Lexer::lerr_t, Lexer::lerr_type_t;
|
||||||
|
|
||||||
void usage(const char *program_name, FILE *fp)
|
void usage(const char *program_name, FILE *fp)
|
||||||
{
|
{
|
||||||
fprintf(fp,
|
fprintf(fp,
|
||||||
|
|||||||
@@ -18,6 +18,8 @@
|
|||||||
|
|
||||||
using std::pair, std::vector, std::make_pair, std::string, std::string_view;
|
using std::pair, std::vector, std::make_pair, std::string, std::string_view;
|
||||||
|
|
||||||
|
using Lexer::Token, Lexer::lerr_t, Lexer::lerr_type_t;
|
||||||
|
|
||||||
#define VCLEAR(V) \
|
#define VCLEAR(V) \
|
||||||
std::for_each((V).begin(), (V).end(), \
|
std::for_each((V).begin(), (V).end(), \
|
||||||
[](Token *t) \
|
[](Token *t) \
|
||||||
|
|||||||
@@ -30,33 +30,34 @@ enum pp_err_type_t
|
|||||||
|
|
||||||
struct pp_err_t
|
struct pp_err_t
|
||||||
{
|
{
|
||||||
const Token *reference;
|
const Lexer::Token *reference;
|
||||||
pp_err_type_t type;
|
pp_err_type_t type;
|
||||||
lerr_t lerr;
|
Lexer::lerr_t lerr;
|
||||||
|
|
||||||
pp_err_t();
|
pp_err_t();
|
||||||
pp_err_t(pp_err_type_t);
|
pp_err_t(pp_err_type_t);
|
||||||
pp_err_t(pp_err_type_t, const Token *);
|
pp_err_t(pp_err_type_t, const Lexer::Token *);
|
||||||
pp_err_t(pp_err_type_t, const Token *, lerr_t);
|
pp_err_t(pp_err_type_t, const Lexer::Token *, Lexer::lerr_t);
|
||||||
};
|
};
|
||||||
|
|
||||||
std::ostream &operator<<(std::ostream &, pp_err_t &);
|
std::ostream &operator<<(std::ostream &, pp_err_t &);
|
||||||
|
|
||||||
struct pp_unit_t
|
struct pp_unit_t
|
||||||
{
|
{
|
||||||
const Token *const token;
|
const Lexer::Token *const token;
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
std::string_view name;
|
std::string_view name;
|
||||||
std::vector<pp_unit_t> elements;
|
std::vector<pp_unit_t> elements;
|
||||||
} container;
|
} container;
|
||||||
|
|
||||||
pp_unit_t(const Token *const);
|
pp_unit_t(const Lexer::Token *const);
|
||||||
pp_unit_t(std::string_view, std::vector<pp_unit_t>);
|
pp_unit_t(std::string_view, std::vector<pp_unit_t>);
|
||||||
};
|
};
|
||||||
|
|
||||||
std::vector<pp_unit_t> tokens_to_units(const std::vector<Token *> &);
|
std::vector<pp_unit_t> tokens_to_units(const std::vector<Lexer::Token *> &);
|
||||||
pp_err_t preprocess_use(std::vector<pp_unit_t> &);
|
pp_err_t preprocess_use(std::vector<pp_unit_t> &);
|
||||||
pp_err_t preprocesser(const std::vector<Token *> &, std::vector<Token *> &);
|
pp_err_t preprocesser(const std::vector<Lexer::Token *> &,
|
||||||
|
std::vector<Lexer::Token *> &);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user