2 * Copyright (C) 2012, 2013
6 * Permission is hereby granted, free of charge, to any person obtaining a copy of
7 * this software and associated documentation files (the "Software"), to deal in
8 * the Software without restriction, including without limitation the rights to
9 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
10 * of the Software, and to permit persons to whom the Software is furnished to do
11 * so, subject to the following conditions:
13 * The above copyright notice and this permission notice shall be included in all
14 * copies or substantial portions of the Software.
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24 #ifndef GMQCC_PARSER_HDR
25 #define GMQCC_PARSER_HDR
30 typedef struct intrin_s intrin_t;
31 typedef struct parser_s parser_t;
34 struct parser_s *parser;
35 ast_value **imm_float; /* vector<ast_value*> */
36 ast_value **imm_vector; /* vector<ast_value*> */
37 ast_value **imm_string; /* vector<ast_value*> */
38 hash_table_t *imm_string_untranslate; /* map<string, ast_value*> */
39 hash_table_t *imm_string_dotranslate; /* map<string, ast_value*> */
43 ast_expression *(*intrin)(intrin_t *);
49 intrin_func_t *intrinsics; /* vector<intrin_func_t> */
54 #define parser_ctx(p) ((p)->lex->tok.ctx)
62 ast_expression **globals;
63 ast_expression **fields;
64 ast_function **functions;
67 /* must be deleted first, they reference immediates and values */
68 ast_value **accessors;
71 ast_value *reserved_version;
76 ast_function *function;
79 /* All the labels the function defined...
80 * Should they be in ast_function instead?
85 const char **continues;
87 /* A list of hashtables for each scope */
93 /* same as above but for the spelling corrector */
94 correct_trie_t **correct_variables;
95 size_t ***correct_variables_score; /* vector of vector of size_t* */
97 /* not to be used directly, we use the hash table */
98 ast_expression **_locals;
100 ast_value **_typedefs;
101 size_t *_blocktypedefs;
102 lex_ctx_t *_block_ctx;
104 /* we store the '=' operator info */
105 const oper_info *assign_op;
108 ast_value *const_vec[3];
113 /* collected information */
114 size_t max_param_count;
122 char *parser_strdup (const char *str);
123 ast_expression *parser_find_global(parser_t *parser, const char *name);
126 fold_t *fold_init (parser_t *);
127 void fold_cleanup (fold_t *);
128 ast_expression *fold_constgen_float (fold_t *, qcfloat_t);
129 ast_expression *fold_constgen_vector(fold_t *, vec3_t);
130 ast_expression *fold_constgen_string(fold_t *, const char *, bool);
131 bool fold_generate (fold_t *, ir_builder *);
132 ast_expression *fold_op (fold_t *, const oper_info *, ast_expression**);
134 int fold_cond (ir_value *, ast_function *, ast_ifthen *);
137 intrin_t *intrin_init (parser_t *parser);
138 void intrin_cleanup (intrin_t *intrin);
139 ast_expression *intrin_func (intrin_t *intrin, const char *name);
140 ast_expression *intrin_debug_typestring(intrin_t *intrin);