#pragma once #include "minicc.h" #include "bnf.h" #include #include #include namespace Lex { class Lexer { // constructor input const BNF& m_bnf; const std::string& m_top; // Graph size_t states{}; // start, ... std::unordered_map>> transitions; //transitions: state -> {state,character}, ...; empty transition is marked by \0 std::vector m_state_types; size_t m_startState; size_t m_endState; // Graph manipulation size_t newState(std::string state_type = ""); void addTransition(size_t state0, size_t state1, char c); std::vector> getSuccessors(size_t state); // Build up automaton, recursively void addPath(size_t state0, size_t state1, std::string s, std::string type); void addPathOrTransition(size_t state0, size_t state1, std::string symbol, std::string type); void addRule(const std::vector& list, size_t list_index_from, size_t list_index_to, size_t state0, size_t state1, const std::string& rule_symbol, std::string type); Token getToken(const std::string& s, Location& location); void skipWhitespace(const std::string& s, Location& location); public: Lexer(const BNF& bnf, const std::string& top); std::vector Lex(const std::string& s); }; } // namespace Lex