diff options
Diffstat (limited to 'src/lib/netlist/plib/pparser.h')
-rw-r--r-- | src/lib/netlist/plib/pparser.h | 107 |
1 files changed, 24 insertions, 83 deletions
diff --git a/src/lib/netlist/plib/pparser.h b/src/lib/netlist/plib/pparser.h index 1eca20e99ad..7ec517255c8 100644 --- a/src/lib/netlist/plib/pparser.h +++ b/src/lib/netlist/plib/pparser.h @@ -8,27 +8,20 @@ #ifndef PPARSER_H_ #define PPARSER_H_ +#include "pstring.h" #include "plists.h" #include "pstream.h" -#include "pstring.h" -#include <cstdint> #include <unordered_map> - +#include <cstdint> namespace plib { -class ptokenizer +class ptokenizer : nocopyassignmove { public: - template <typename T> - ptokenizer(T &&strm) // NOLINT(misc-forwarding-reference-overload, bugprone-forwarding-reference-overload) - : m_strm(std::forward<T>(strm)), m_lineno(0), m_cur_line(""), m_px(m_cur_line.begin()), m_unget(0), m_string('"') - { - } - - COPYASSIGNMOVE(ptokenizer, delete) + explicit ptokenizer(plib::putf8_reader &strm); - virtual ~ptokenizer() = default; + virtual ~ptokenizer(); enum token_type { @@ -98,23 +91,22 @@ public: void require_token(const token_id_t &token_num); void require_token(const token_t &tok, const token_id_t &token_num); - token_id_t register_token(const pstring &token) + token_id_t register_token(pstring token) { token_id_t ret(m_tokens.size()); m_tokens.emplace(token, ret); return ret; } - ptokenizer & identifier_chars(pstring s) { m_identifier_chars = std::move(s); return *this; } - ptokenizer & number_chars(pstring st, pstring rem) { m_number_chars_start = std::move(st); m_number_chars = std::move(rem); return *this; } - ptokenizer & string_char(pstring::value_type c) { m_string = c; return *this; } - ptokenizer & whitespace(pstring s) { m_whitespace = std::move(s); return *this; } - ptokenizer & comment(const pstring &start, const pstring &end, const pstring &line) + void set_identifier_chars(pstring s) { m_identifier_chars = s; } + void set_number_chars(pstring st, pstring rem) { m_number_chars_start = st; m_number_chars = rem; } + void set_string_char(pstring::code_t c) { m_string = c; } + void set_whitespace(pstring s) { m_whitespace = s; } + void set_comment(pstring start, pstring end, pstring line) { m_tok_comment_start = register_token(start); m_tok_comment_end = register_token(end); m_tok_line_comment = register_token(line); - return *this; } token_t get_token_internal(); @@ -126,17 +118,17 @@ protected: private: void skipeol(); - pstring::value_type getc(); - void ungetc(pstring::value_type c); + pstring::code_t getc(); + void ungetc(pstring::code_t c); bool eof() { return m_strm.eof(); } - putf8_reader m_strm; + putf8_reader &m_strm; int m_lineno; pstring m_cur_line; pstring::const_iterator m_px; - pstring::value_type m_unget; + pstring::code_t m_unget; /* tokenizer stuff follows ... */ @@ -145,7 +137,7 @@ private: pstring m_number_chars_start; std::unordered_map<pstring, token_id_t> m_tokens; pstring m_whitespace; - pstring::value_type m_string; + pstring::code_t m_string; token_id_t m_tok_comment_start; token_id_t m_tok_comment_end; @@ -153,7 +145,7 @@ private: }; -class ppreprocessor : public pistream +class ppreprocessor : plib::nocopyassignmove { public: @@ -166,80 +158,29 @@ public: pstring m_replace; }; - using defines_map_type = std::unordered_map<pstring, define_t>; - - explicit ppreprocessor(defines_map_type *defines = nullptr); - ~ppreprocessor() override = default; - - template <typename T> - ppreprocessor & process(T &&istrm) - { - putf8_reader reader(std::forward<T>(istrm)); - pstring line; - while (reader.readline(line)) - { - m_lineno++; - line = process_line(line); - m_buf += decltype(m_buf)(line.c_str()) + static_cast<char>(10); - } - return *this; - } - - COPYASSIGN(ppreprocessor, delete) - ppreprocessor &operator=(ppreprocessor &&src) = delete; + explicit ppreprocessor(std::vector<define_t> *defines = nullptr); + virtual ~ppreprocessor() {} - - ppreprocessor(ppreprocessor &&s) noexcept - : m_defines(std::move(s.m_defines)) - , m_expr_sep(std::move(s.m_expr_sep)) - , m_ifflag(s.m_ifflag) - , m_level(s.m_level) - , m_lineno(s.m_lineno) - , m_buf(std::move(s.m_buf)) - , m_pos(s.m_pos) - , m_state(s.m_state) - , m_comment(s.m_comment) - { - } + void process(putf8_reader &istrm, putf8_writer &ostrm); protected: - - size_type vread(value_type *buf, const size_type n) override; - void vseek(const pos_type n) override - { - plib::unused_var(n); - /* FIXME throw exception - should be done in base unless implemented */ - } - pos_type vtell() const override { return m_pos; } - - int expr(const std::vector<pstring> &sexpr, std::size_t &start, int prio); + double expr(const std::vector<pstring> &sexpr, std::size_t &start, int prio); define_t *get_define(const pstring &name); pstring replace_macros(const pstring &line); virtual void error(const pstring &err); private: - enum state_e - { - PROCESS, - LINE_CONTINUATION - }; - pstring process_line(pstring line); - pstring process_comments(pstring line); + pstring process_line(const pstring &line); - defines_map_type m_defines; + std::unordered_map<pstring, define_t> m_defines; std::vector<pstring> m_expr_sep; std::uint_least64_t m_ifflag; // 31 if levels int m_level; int m_lineno; - pstring_t<pu8_traits> m_buf; - pos_type m_pos; - state_e m_state; - pstring m_line; - bool m_comment; }; -} // namespace plib +} #endif /* PPARSER_H_ */ |