X-Git-Url: https://jxself.org/git/?p=zilutils.git;a=blobdiff_plain;f=zilasm%2Fparser.h;fp=zilasm%2Fparser.h;h=e867439cc72561507a49ecc6e9197270781dd4a5;hp=007d2ffe48e09817d85b9cd51b283a85a064b185;hb=b1f151e1500e1fdadafaab6b13df6e0a8f32136e;hpb=c0f515aab1285fdedb65d4582b42cc59db0c8e26 diff --git a/zilasm/parser.h b/zilasm/parser.h index 007d2ff..e867439 100644 --- a/zilasm/parser.h +++ b/zilasm/parser.h @@ -29,14 +29,72 @@ struct Instruction int size; }; -void init_parser (); +#define MAX_NUMBER_OF_INSTRUCTIONS 65536 -int parse_file();// const char *filename); +struct Function +{ + Function() : index(0), address(0), number_of_local_variables(0) + { + } -extern unsigned g_number_of_instructions; + unsigned index; + unsigned address; + unsigned number_of_local_variables; +}; -#define MAX_NUMBER_OF_INSTRUCTIONS 65536 -extern ZMemblock (*g_codes[MAX_NUMBER_OF_INSTRUCTIONS]); + +class CParser +{ +public: + CParser(); + ~CParser(); + void calculate_function_addresses(); + unsigned get_number_of_instructions(); + ZMemblock **get_codes(); + bool have_errors(); + unsigned output_codes(ZMemblock *zmem_code); + int parse_file(); + void add_function(const char *s); + unsigned m_current_line_number; + unsigned m_current_address; + + + map m_functions; + vector m_function_addresses; + string m_start_function_name; + +private: + unsigned g_number_of_instructions;// = 0; + + + ZMemblock(*g_codes[MAX_NUMBER_OF_INSTRUCTIONS]); + bool g_haveErrors; + CDirectives *m_pdirectives; + vector m_calls; // contains functions names' if current instruction is call/icall or empty string otherwise + + string build_error_message(const char *message); + void checksep(const char *p); + void fatal_error(const char *errmsg); + int parse_line(const char *p); + const char *pass_spaces(const char *p); + int read_instructions_parameter(char *a, string& str); + int read_instructions_parameter2(char *a, string& str); + int tryparse_directive(const char *p); + int tryparse_startup_directive(const char *p); + + int tryparse_name(const char *a); + int tryparse_label(const char *a, const char *b, const char *c); + int tryparse_instruction(const char *a); +}; + +//void init_parser (); + +//int parse_file();// const char *filename); + +//extern unsigned g_number_of_instructions; + + +//extern ZMemblock (*g_codes[MAX_NUMBER_OF_INSTRUCTIONS]); struct Parsing_Context { @@ -45,7 +103,7 @@ struct Parsing_Context }; extern stack g_parsing_contexts; -extern unsigned g_currentLineNumber; -extern bool g_haveErrors; +//extern unsigned g_currentLineNumber; +//extern bool g_haveErrors; #endif /* ifndef ZILASM_PARSER */