X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;ds=sidebyside;f=parser.h;h=eb77effe8e5e046c4f248cc96da39d6be9b054b3;hb=aed893b6b8c0fbace708d95767a1ab7e9a6a520b;hp=08692107b93dcf061cccff5032c095e77ee14cf9;hpb=920dbaf1e09f6dce8cc8dd703ed2bfdec62fae38;p=xonotic%2Fgmqcc.git diff --git a/parser.h b/parser.h index 0869210..eb77eff 100644 --- a/parser.h +++ b/parser.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2012, 2013 + * Copyright (C) 2012, 2013, 2014 * Wolfgang Bumiller * Dale Weiler * @@ -27,6 +27,9 @@ #include "lexer.h" #include "ast.h" +typedef struct intrin_s intrin_t; +typedef struct parser_s parser_t; + typedef struct { struct parser_s *parser; ast_value **imm_float; /* vector */ @@ -36,8 +39,23 @@ typedef struct { hash_table_t *imm_string_dotranslate; /* map */ } fold_t; -#define parser_ctx(p) ((p)->lex->tok.ctx) -typedef struct parser_s { +typedef struct { + ast_expression *(*intrin)(intrin_t *); + const char *name; + const char *alias; + size_t args; +} intrin_func_t; + +struct intrin_s { + intrin_func_t *intrinsics; /* vector */ + ast_expression **generated; /* vector */ + parser_t *parser; + fold_t *fold; +}; + +#define parser_ctx(p) ((p)->lex->tok.ctx) + +struct parser_s { lex_file *lex; int tok; @@ -97,18 +115,34 @@ typedef struct parser_s { /* collected information */ size_t max_param_count; - fold_t *fold; -} parser_t; + fold_t *fold; + intrin_t *intrin; +}; -char *parser_strdup(const char *str); +/* parser.c */ +char *parser_strdup (const char *str); +ast_expression *parser_find_global(parser_t *parser, const char *name); /* fold.c */ fold_t *fold_init (parser_t *); void fold_cleanup (fold_t *); -ast_expression *fold_constgen_float (fold_t *, qcfloat_t); +ast_expression *fold_constgen_float (fold_t *, qcfloat_t, bool); ast_expression *fold_constgen_vector(fold_t *, vec3_t); ast_expression *fold_constgen_string(fold_t *, const char *, bool); bool fold_generate (fold_t *, ir_builder *); -ast_expression *fold_op (fold_t *, const oper_info *, ast_expression**); +ast_expression *fold_op (fold_t *, const oper_info *, ast_expression **); +ast_expression *fold_intrin (fold_t *, const char *, ast_expression **); + +ast_expression *fold_binary (lex_ctx_t ctx, int, ast_expression *, ast_expression *); +int fold_cond_ifthen (ir_value *, ast_function *, ast_ifthen *); +int fold_cond_ternary (ir_value *, ast_function *, ast_ternary *); + +/* intrin.c */ +intrin_t *intrin_init (parser_t *parser); +void intrin_cleanup (intrin_t *intrin); +ast_expression *intrin_fold (intrin_t *intrin, ast_value *, ast_expression **); +ast_expression *intrin_func (intrin_t *intrin, const char *name); +ast_expression *intrin_debug_typestring(intrin_t *intrin); + #endif