Added ability to define multiple functions (without parameters) and
[zilutils.git] / zilasm / parser.h
index c708f4d3bf75b5a3b0037b6d9a9eaafda1a3776d..e867439cc72561507a49ecc6e9197270781dd4a5 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * parser.h -- part of ZilUtils/ZilAsm
  *
- * Copyright (C) 2016 Jason Self <j@jxself.org>
+ * Copyright (C) 2016, 2019, 2020 Jason Self <j@jxself.org>
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU Affero General Public License as
 #ifndef ZILASM_PARSER
 #define ZILASM_PARSER 1
 
-int parse_file(const char *filename);
 
-#endif  /* ifndef ZILASM_PARSER */
+struct Instruction
+{
+  Byte *pCodes;
+  int size;
+};
+
+#define MAX_NUMBER_OF_INSTRUCTIONS 65536
+
+struct Function
+{
+       Function() : index(0), address(0), number_of_local_variables(0)
+       {
+       }
+
+       unsigned index;
+       unsigned address;
+       unsigned number_of_local_variables;
+};
+
+
+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 <string, Function> m_functions;
+       vector<unsigned> 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<string> 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
+{
+       string current_directory;
+       string current_file_name;
+};
+
+extern stack<Parsing_Context> g_parsing_contexts;
+//extern unsigned g_currentLineNumber;
+//extern bool g_haveErrors;
+
+#endif /* ifndef ZILASM_PARSER */