gmqcc/parser.h

85 lines
1.8 KiB
C
Raw Normal View History

#ifndef GMQCC_PARSER_HDR
#define GMQCC_PARSER_HDR
#include "gmqcc.h"
#include "lexer.h"
#include "ast.h"
2015-01-16 01:27:17 +00:00
2015-01-15 23:11:41 +00:00
#include "intrin.h"
2015-01-16 01:27:17 +00:00
#include "fold.h"
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 {
parser_t();
~parser_t();
void remove_ast();
2015-01-15 23:11:41 +00:00
lex_file *lex;
2015-01-15 06:35:56 +00:00
int tok;
2015-01-15 06:35:56 +00:00
bool ast_cleaned;
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;
/* must be deleted first, they reference immediates and values */
2015-01-15 06:35:56 +00:00
std::vector<ast_value *> accessors;
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;
/* 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;
/* A list of hashtables for each scope */
std::vector<ht> variables;
ht htfields;
ht htglobals;
std::vector<ht> typedefs;
/* not to be used directly, we use the hash table */
std::vector<ast_expression*> _locals;
std::vector<size_t> _blocklocals;
std::vector<std::unique_ptr<ast_value>> _typedefs;
std::vector<size_t> _blocktypedefs;
std::vector<lex_ctx_t> _block_ctx;
/* 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;
2015-01-16 01:27:17 +00:00
fold m_fold;
2015-01-15 23:11:41 +00:00
intrin m_intrin;
};
/* parser.c */
char *parser_strdup (const char *str);
ast_expression *parser_find_global(parser_t *parser, const char *name);
#endif