/*
* 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
syntax highlighted by Code2HTML, v. 0.9.1