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 *);
50 intrin_func_t *intrinsics; /* vector<intrin_func_t> */
55 #define parser_ctx(p) ((p)->lex->tok.ctx)
63 ast_expression **globals;
64 ast_expression **fields;
65 ast_function **functions;
68 /* must be deleted first, they reference immediates and values */
69 ast_value **accessors;
72 ast_value *reserved_version;
77 ast_function *function;
80 /* All the labels the function defined...
81 * Should they be in ast_function instead?
86 const char **continues;
88 /* A list of hashtables for each scope */
94 /* same as above but for the spelling corrector */
95 correct_trie_t **correct_variables;
96 size_t ***correct_variables_score; /* vector of vector of size_t* */
98 /* not to be used directly, we use the hash table */
99 ast_expression **_locals;
100 size_t *_blocklocals;
101 ast_value **_typedefs;
102 size_t *_blocktypedefs;
103 lex_ctx_t *_block_ctx;
105 /* we store the '=' operator info */
106 const oper_info *assign_op;
109 ast_value *const_vec[3];
114 /* collected information */
115 size_t max_param_count;
123 char *parser_strdup (const char *str);
124 ast_expression *parser_find_global(parser_t *parser, const char *name);
127 fold_t *fold_init (parser_t *);
128 void fold_cleanup (fold_t *);
129 ast_expression *fold_constgen_float (fold_t *, qcfloat_t);
130 ast_expression *fold_constgen_vector(fold_t *, vec3_t);
131 ast_expression *fold_constgen_string(fold_t *, const char *, bool);
132 bool fold_generate (fold_t *, ir_builder *);
133 ast_expression *fold_op (fold_t *, const oper_info *, ast_expression **);
134 ast_expression *fold_intrin (fold_t *, const char *, ast_expression **);
136 ast_expression *fold_superfluous (ast_expression *, ast_expression *, int);
137 int fold_cond_ifthen (ir_value *, ast_function *, ast_ifthen *);
138 int fold_cond_ternary (ir_value *, ast_function *, ast_ternary *);
141 intrin_t *intrin_init (parser_t *parser);
142 void intrin_cleanup (intrin_t *intrin);
143 ast_expression *intrin_fold (intrin_t *intrin, ast_value *, ast_expression **);
144 ast_expression *intrin_func (intrin_t *intrin, const char *name);
145 ast_expression *intrin_debug_typestring(intrin_t *intrin);