diff options
Diffstat (limited to 'src/lib/netlist/plib/pparser.h')
-rw-r--r-- | src/lib/netlist/plib/pparser.h | 198 |
1 files changed, 198 insertions, 0 deletions
diff --git a/src/lib/netlist/plib/pparser.h b/src/lib/netlist/plib/pparser.h new file mode 100644 index 00000000000..34dfdbfcff3 --- /dev/null +++ b/src/lib/netlist/plib/pparser.h @@ -0,0 +1,198 @@ +// license:GPL-2.0+ +// copyright-holders:Couriersud +/* + * pparser.h + * + */ + +#ifndef PPARSER_H_ +#define PPARSER_H_ + +#include "pconfig.h" +#include "pstring.h" +#include "plists.h" +#include "pstream.h" + +class ptokenizer +{ + P_PREVENT_COPYING(ptokenizer) +public: + virtual ~ptokenizer() {} + + ptokenizer(pistream &strm) + : m_strm(strm), m_lineno(1), m_px(0), m_string('"') + {} + + enum token_type + { + IDENTIFIER, + NUMBER, + TOKEN, + STRING, + COMMENT, + UNKNOWN, + ENDOFFILE + }; + + struct token_id_t + { + public: + token_id_t() : m_id(-2) {} + token_id_t(const int id) : m_id(id) {} + int id() const { return m_id; } + private: + int m_id; + }; + + struct token_t + { + token_t(token_type type) + { + m_type = type; + m_id = token_id_t(-1); + m_token =""; + } + token_t(token_type type, const pstring &str) + { + m_type = type; + m_id = token_id_t(-1); + m_token = str; + } + token_t(const token_id_t id, const pstring &str) + { + m_type = TOKEN; + m_id = id; + m_token = str; + } + + bool is(const token_id_t &tok_id) const { return m_id.id() == tok_id.id(); } + bool is_not(const token_id_t &tok_id) const { return !is(tok_id); } + + bool is_type(const token_type type) const { return m_type == type; } + + pstring str() const { return m_token; } + + private: + token_type m_type; + token_id_t m_id; + pstring m_token; + }; + + + int currentline_no() { return m_lineno; } + pstring currentline_str(); + + /* tokenizer stuff follows ... */ + + token_t get_token(); + pstring get_string(); + pstring get_identifier(); + pstring get_identifier_or_number(); + double get_number_double(); + long get_number_long(); + + 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(pstring token) + { + m_tokens.add(token); + return token_id_t(m_tokens.size() - 1); + } + + 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(char 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); + } + + token_t get_token_internal(); + void error(const pstring &errs); + +protected: + virtual void verror(const pstring &msg, int line_num, const pstring &line) = 0; + +private: + void skipeol(); + + pstring::code_t getc(); + void ungetc(); + + bool eof() { return m_strm.eof(); } + + pistream &m_strm; + + int m_lineno; + pstring m_cur_line; + unsigned m_px; + + /* tokenizer stuff follows ... */ + + pstring m_identifier_chars; + pstring m_number_chars; + pstring m_number_chars_start; + plist_t<pstring> m_tokens; + pstring m_whitespace; + pstring::code_t m_string; + + token_id_t m_tok_comment_start; + token_id_t m_tok_comment_end; + token_id_t m_tok_line_comment; +}; + + +class ppreprocessor +{ + P_PREVENT_COPYING(ppreprocessor) +public: + + struct define_t + { + define_t() { }; + define_t(const pstring &name, const pstring &replace) + : m_name(name), m_replace(replace) + {} + pstring m_name; + pstring m_replace; + }; + + ppreprocessor(); + virtual ~ppreprocessor() {} + + template<class ISTR, class OSTR> + OSTR &process(ISTR &istrm, OSTR &ostrm) + { + return dynamic_cast<OSTR &>(process_i(istrm, ostrm)); + } + +protected: + + postream &process_i(pistream &istrm, postream &ostrm); + + double expr(const pstring_list_t &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: + + pstring process_line(const pstring &line); + + phashmap_t<pstring, define_t> m_defines; + pstring_list_t m_expr_sep; + + //pstringbuffer m_ret; + UINT32 m_ifflag; // 31 if levels + int m_level; + int m_lineno; +}; + +#endif /* PPARSER_H_ */ |