#pragma once #include "Token.h" #include "sapphirepch.h" #include /* Let's redefine TokenStream, as if it wasn't already defined in Token.h*/ typedef std::vector TokenStream; /* The number of data types currently in Sapphire. */ #define TYPE_COUNT 14 /* The Lexer for the Sapphire compiler. A Lexer reads source code from a file, and turns it into a stream of tokens the * compiler can understand. */ class Lexer { private: Location loc; Location prev_loc; int advance(); int rewind(); char current_char; int index; Lexer(const std::string& fname); std::string current_line_text; std::string previous_line_text; std::string current_lexed_text; std::string recalculate_current_line(const std::string& text); Token create_string(); Token create_number(); Token create_identifier(); bool is_in_string(const std::string& string, const char& character); public: /* An array containing Sapphire's current data types. */ static const std::array types; ~Lexer(); /* Lex the given text, turning it into a stream of tokens. */ TokenStream lex(const std::string& text); /* Create a new Lexer and return a pointer to it. */ static std::unique_ptr make_lexer(const std::string& fname); /* If the Lexer is lexing an impòrted file, give it the location in the parent file at which it was imported. */ static void assign_parent_location(std::unique_ptr& lexer, const std::shared_ptr& loc); };