From 9f69b006dde3c3fbe19ed3e0275d3b7348f2aa87 Mon Sep 17 00:00:00 2001 From: Roland Reichwein Date: Sun, 15 Mar 2020 18:19:49 +0100 Subject: New lexer --- lexer.h | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) (limited to 'lexer.h') diff --git a/lexer.h b/lexer.h index f9363ef..eb41e3d 100644 --- a/lexer.h +++ b/lexer.h @@ -3,16 +3,42 @@ #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); - //states; // start, ... - //transitions; // state, state, character + 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); + Lexer(const BNF& bnf, const std::string& top); std::vector Lex(const std::string& s); }; -- cgit v1.2.3