diff options
author | 2015-05-27 13:47:22 +0200 | |
---|---|---|
committer | 2015-05-27 23:18:44 +0200 | |
commit | cef370aa13953c3bcfa185c818c76812c34f13fc (patch) | |
tree | 6ecc90526c03f1e2411328ac2e3d635f9b952922 /src/emu/netlist/plib/pparser.h | |
parent | e9fe1e74c46f40379bcdc472b97c4aef4d3a91e6 (diff) |
Moved all files in src/emu/netlist starting with p into plib folder.
This is a first step to ease synchronisation with a stand alone, e.g.
outside mame, netlist implementation. More signed/unsigned cleanups and
started work on generic truthtable devices. (nw)
Diffstat (limited to 'src/emu/netlist/plib/pparser.h')
-rw-r--r-- | src/emu/netlist/plib/pparser.h | 178 |
1 files changed, 178 insertions, 0 deletions
diff --git a/src/emu/netlist/plib/pparser.h b/src/emu/netlist/plib/pparser.h new file mode 100644 index 00000000000..b21b06659cc --- /dev/null +++ b/src/emu/netlist/plib/pparser.h @@ -0,0 +1,178 @@ +// license:GPL-2.0+ +// copyright-holders:Couriersud +/* + * pparser.h + * + */ + +#ifndef PPARSER_H_ +#define PPARSER_H_ + +#include "pconfig.h" +#include "../nl_config.h" // FIXME +#include "../nl_util.h" + +class ptokenizer +{ + NETLIST_PREVENT_COPYING(ptokenizer) +public: + virtual ~ptokenizer() {} + + ptokenizer() + : m_line(1), m_line_ptr(NULL), m_px(NULL), 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_line; } + pstring currentline_str(); + + /* tokenizer stuff follows ... */ + + token_t get_token(); + pstring get_string(); + pstring get_identifier(); + + 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 s) { m_number_chars = s; } + 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); + m_string = '"'; + } + + token_t get_token_internal(); + void error(const char *format, ...) ATTR_PRINTF(2,3); + +protected: + void reset(const char *p) { m_px = p; m_line = 1; m_line_ptr = p; } + virtual void verror(pstring msg, int line_num, pstring line) = 0; + +private: + void skipeol(); + + unsigned char getc(); + void ungetc(); + bool eof() { return *m_px == 0; } + + int m_line; + const char * m_line_ptr; + const char * m_px; + + /* tokenizer stuff follows ... */ + + pstring m_identifier_chars; + pstring m_number_chars; + plist_t<pstring> m_tokens; + pstring m_whitespace; + char 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 +{ + NETLIST_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() {} + + pstring process(const pstring &contents); + +protected: + + 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: + + plist_t<define_t> m_defines; + pstring_list_t m_expr_sep; +}; + +#endif /* PPARSER_H_ */ |