2013-07-31 09:04:19 +00:00
|
|
|
#ifndef GMQCC_PARSER_HDR
|
|
|
|
#define GMQCC_PARSER_HDR
|
|
|
|
#include "gmqcc.h"
|
|
|
|
#include "lexer.h"
|
2015-01-16 01:27:17 +00:00
|
|
|
//#include "ast.h"
|
|
|
|
|
2015-01-15 23:11:41 +00:00
|
|
|
#include "intrin.h"
|
2015-01-16 01:27:17 +00:00
|
|
|
#include "fold.h"
|
2013-07-31 09:04:19 +00:00
|
|
|
|
2015-01-15 04:56:52 +00:00
|
|
|
struct parser_t;
|
|
|
|
|
2013-07-31 16:31:45 +00:00
|
|
|
#define parser_ctx(p) ((p)->lex->tok.ctx)
|
|
|
|
|
2015-01-15 04:56:52 +00:00
|
|
|
struct parser_t {
|
2015-01-15 23:11:41 +00:00
|
|
|
parser_t() { }
|
|
|
|
|
2013-07-31 09:04:19 +00:00
|
|
|
lex_file *lex;
|
2015-01-15 06:35:56 +00:00
|
|
|
int tok;
|
2013-07-31 09:04:19 +00:00
|
|
|
|
2015-01-15 06:35:56 +00:00
|
|
|
bool ast_cleaned;
|
2013-07-31 09:04:19 +00:00
|
|
|
|
2015-01-15 06:35:56 +00:00
|
|
|
std::vector<ast_expression *> globals;
|
|
|
|
std::vector<ast_expression *> fields;
|
|
|
|
std::vector<ast_function *> functions;
|
|
|
|
size_t translated;
|
2013-07-31 09:04:19 +00:00
|
|
|
|
|
|
|
/* must be deleted first, they reference immediates and values */
|
2015-01-15 06:35:56 +00:00
|
|
|
std::vector<ast_value *> accessors;
|
2013-07-31 09:04:19 +00:00
|
|
|
|
|
|
|
ast_value *nil;
|
|
|
|
ast_value *reserved_version;
|
|
|
|
|
|
|
|
size_t crc_globals;
|
|
|
|
size_t crc_fields;
|
|
|
|
|
|
|
|
ast_function *function;
|
2015-01-15 06:35:56 +00:00
|
|
|
ht aliases;
|
2013-07-31 09:04:19 +00:00
|
|
|
|
|
|
|
/* All the labels the function defined...
|
|
|
|
* Should they be in ast_function instead?
|
|
|
|
*/
|
2015-01-15 04:34:43 +00:00
|
|
|
std::vector<ast_label*> labels;
|
|
|
|
std::vector<ast_goto*> gotos;
|
|
|
|
std::vector<const char *> breaks;
|
|
|
|
std::vector<const char *> continues;
|
2013-07-31 09:04:19 +00:00
|
|
|
|
|
|
|
/* A list of hashtables for each scope */
|
|
|
|
ht *variables;
|
|
|
|
ht htfields;
|
|
|
|
ht htglobals;
|
|
|
|
ht *typedefs;
|
|
|
|
|
|
|
|
/* not to be used directly, we use the hash table */
|
|
|
|
ast_expression **_locals;
|
2015-01-15 06:35:56 +00:00
|
|
|
size_t *_blocklocals;
|
|
|
|
ast_value **_typedefs;
|
|
|
|
size_t *_blocktypedefs;
|
|
|
|
lex_ctx_t *_block_ctx;
|
2013-07-31 09:04:19 +00:00
|
|
|
|
|
|
|
/* we store the '=' operator info */
|
|
|
|
const oper_info *assign_op;
|
|
|
|
|
|
|
|
/* magic values */
|
|
|
|
ast_value *const_vec[3];
|
|
|
|
|
|
|
|
/* pragma flags */
|
|
|
|
bool noref;
|
|
|
|
|
|
|
|
/* collected information */
|
2015-01-15 06:35:56 +00:00
|
|
|
size_t max_param_count;
|
2013-07-31 09:04:19 +00:00
|
|
|
|
2015-01-16 01:27:17 +00:00
|
|
|
fold m_fold;
|
2015-01-15 23:11:41 +00:00
|
|
|
intrin m_intrin;
|
2013-08-14 06:02:15 +00:00
|
|
|
};
|
2013-07-31 09:04:19 +00:00
|
|
|
|
|
|
|
|
2013-08-14 06:02:15 +00:00
|
|
|
/* parser.c */
|
|
|
|
char *parser_strdup (const char *str);
|
|
|
|
ast_expression *parser_find_global(parser_t *parser, const char *name);
|
2013-07-31 09:04:19 +00:00
|
|
|
|
|
|
|
#endif
|