/* * Copyright (c) 2004 - 2006, Nils R. Weller * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef EXPR_H #define EXPR_H struct token; struct type; struct vreg; struct ty_string; struct initializer; struct addr_const { struct decl *dec; long diff; }; struct tyval { struct type *type; struct ty_string *str; void *value; struct addr_const *address; struct initializer *static_init; int alloc; int is_nullptr_const; }; struct initializer { int type; #define INIT_NESTED 1 #define INIT_EXPR 2 #define INIT_NULL 3 #define INIT_STRUCTEXPR 4 void *data; struct initializer *next; }; struct init_with_name { struct initializer *init; char *name; struct decl *dec; struct init_with_name *next; }; struct expr { int op; /* unused (=0) in last node */ int used; int debug; int extype; int is_const; struct token *tok; struct tyval *const_value; struct s_expr *data; /* null if op non-0 */ struct vreg *res; struct type *type; struct scope *stmt_as_expr; struct expr *left; struct expr *right; struct expr *next; struct expr *prev; }; struct parse_tree { struct expr *tree; struct type *type; }; struct expr *alloc_expr(void); struct initializer *alloc_initializer(void); struct initializer *get_init_expr(struct token **tok, int type, struct type *lvalue, int initial); struct expr *parse_expr(struct token **tok, int delim, int delim2, int et); #define EXPR_INIT 1 #define EXPR_CONSTINIT 2 #define EXPR_CONST 3 #define EXPR_NONCONST 4 #define IS_EMPTY_EXPR(e) (e->op == 0 && e->data == NULL) int convert_tyval(struct tyval *left, struct tyval *right); int expr_ends(struct token *t, int delim, int delim2); int eval_const_expr(struct expr *ex); void append_expr(struct expr **head, struct expr **tail, struct expr *); void recover(struct token **tok, int delim, int delim2); void do_conv(struct tyval *, int); #endif