/*
* Copyright (c) 2011 Jiri Svoboda
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* - 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.
* - The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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 STREE_T_H_
#define STREE_T_H_
#include "bigint_t.h"
#include "list_t.h"
#include "builtin_t.h"
/*
* Arithmetic expressions
*/
struct stree_expr;
/** Identifier */
typedef struct {
int sid;
struct cspan *cspan;
} stree_ident_t;
/** Name reference */
typedef struct {
/** Expression backlink */
struct stree_expr *expr;
stree_ident_t *name;
} stree_nameref_t;
/** Boolean literal */
typedef struct {
bool_t value;
} stree_lit_bool_t;
/** Character literal */
typedef struct {
bigint_t value;
} stree_lit_char_t;
/** Integer literal */
typedef struct {
bigint_t value;
} stree_lit_int_t;
/** Reference literal (there is only one: @c nil). */
typedef struct {
} stree_lit_ref_t;
/** String literal */
typedef struct {
char *value;
} stree_lit_string_t;
typedef enum {
ltc_bool,
ltc_char,
ltc_int,
ltc_ref,
ltc_string
} literal_class_t;
/** Literal */
typedef struct {
/** Expression backlink */
struct stree_expr *expr;
literal_class_t ltc;
union {
stree_lit_bool_t lit_bool;
stree_lit_char_t lit_char;
stree_lit_int_t lit_int;
stree_lit_ref_t lit_ref;
stree_lit_string_t lit_string;
} u;
} stree_literal_t;
/** Reference to currently active object. */
typedef struct {
/** Expression backlink */
struct stree_expr *expr;
} stree_self_ref_t;
/** Binary operation class */
typedef enum {
bo_equal,
bo_notequal,
bo_lt,
bo_gt,
bo_lt_equal,
bo_gt_equal,
bo_plus,
bo_minus,
bo_mult,
bo_and,
bo_or
} binop_class_t;
/** Unary operation class */
typedef enum {
uo_plus,
uo_minus,
uo_not
} unop_class_t;
/** Binary operation */
typedef struct {
/** Expression backlink */
struct stree_expr *expr;
/** Binary operation class */
binop_class_t bc;
/** Arguments */
struct stree_expr *arg1, *arg2;
} stree_binop_t;
/** Unary operation */
typedef struct {
/** Expression backlink */
struct stree_expr *expr;
/** Operation class */
unop_class_t uc;
/** Argument */
struct stree_expr *arg;
} stree_unop_t;
/** New operation */
typedef struct {
/** Expression backlink */
struct stree_expr *expr;
/** Type of object to construct. */
struct stree_texpr *texpr;
/** Constructor arguments */
list_t ctor_args; /* of stree_expr_t */
} stree_new_t;
/** Member access operation */
typedef struct {
/** Expression backlink */
struct stree_expr *expr;
/** Argument */
struct stree_expr *arg;
/** Name of member being accessed. */
stree_ident_t *member_name;
} stree_access_t;
/** Function call operation */
typedef struct {
/** Expression backlink */
struct stree_expr *expr;
/** Function */
struct stree_expr *fun;
/** Arguments */
list_t args; /* of stree_expr_t */
} stree_call_t;
typedef enum {
ac_set,
ac_increase
} assign_class_t;
/** Assignment */
typedef struct {
/** Expression backlink */
struct stree_expr *expr;
assign_class_t ac;
struct stree_expr *dest, *src;
} stree_assign_t;
/** Indexing operation */
typedef struct {
/** Expression backlink */
struct stree_expr *expr;
/** Base */
struct stree_expr *base;
/** Arguments (indices) */
list_t args; /* of stree_expr_t */
} stree_index_t;
/** @c as conversion operation */
typedef struct {
/** Expression backlink */
struct stree_expr *expr;
/** Expression to convert */
struct stree_expr *arg;
/** Destination type of conversion. */
struct stree_texpr *dtype;
} stree_as_t;
/** Boxing of primitive type (pseudo)
*
* This pseudo-node is used internally to box a value of primitive type.
* It is implicitly inserted by stype_convert(). It does not correspond
* to a an explicit program construct.
*/
typedef struct {
/** Expression backlink */
struct stree_expr *expr;
/* Primitive type expression */
struct stree_expr *arg;
} stree_box_t;
/** Arithmetic expression class */
typedef enum {
ec_nameref,
ec_literal,
ec_self_ref,
ec_binop,
ec_unop,
ec_new,
ec_access,
ec_call,
ec_assign,
ec_index,
ec_as,
ec_box
} expr_class_t;
/** Arithmetic expression */
typedef struct stree_expr {
expr_class_t ec;
/** Type of this expression or @c NULL if not typed yet */
struct tdata_item *titem;
/** Coordinate span */
struct cspan *cspan;
union {
stree_nameref_t *nameref;
stree_literal_t *literal;
stree_self_ref_t *self_ref;
stree_binop_t *binop;
stree_unop_t *unop;
stree_new_t *new_op;
stree_access_t *access;
stree_call_t *call;
stree_index_t *index;
stree_assign_t *assign;
stree_as_t *as_op;
stree_box_t *box;
} u;
} stree_expr_t;
/*
* Type expressions
*/
struct stree_texpr;
/** Type literal class */
typedef enum {
tlc_bool,
tlc_char,
tlc_int,
tlc_resource,
tlc_string
} tliteral_class_t;
/** Type literal */
typedef struct {
/** Type expression backlink */
struct stree_texpr *texpr;
tliteral_class_t tlc;
} stree_tliteral_t;
/** Type name reference */
typedef struct {
/** Type expression backlink */
struct stree_texpr *texpr;
stree_ident_t *name;
} stree_tnameref_t;
/** Type member access operation */
typedef struct {
/** Type expression backlink */
struct stree_texpr *texpr;
/** Argument */
struct stree_texpr *arg;
/** Name of member being accessed. */
stree_ident_t *member_name;
} stree_taccess_t;
/** Type application operation */
typedef struct {
/** Type expression backlink */
struct stree_texpr *texpr;
/* Base type */
struct stree_texpr *gtype;
/** (Formal) type arguments */
list_t targs; /* of stree_texpr_t */
} stree_tapply_t;
/** Type index operation */
typedef struct {
/** Type expression backlink */
struct stree_texpr *texpr;
/** Base type */
struct stree_texpr *base_type;
/**
* Number of arguments (rank). Needed when only rank is specified
* and @c args are not used.
*/
int n_args;
/** Arguments (extents) */
list_t args; /* of stree_expr_t */
} stree_tindex_t;
/** Type expression class */
typedef enum {
tc_tliteral,
tc_tnameref,
tc_taccess,
tc_tapply,
tc_tindex
} texpr_class_t;
/** Type expression */
typedef struct stree_texpr {
texpr_class_t tc;
/** Coordinate span */
struct cspan *cspan;
union {
stree_tliteral_t *tliteral;
stree_tnameref_t *tnameref;
stree_taccess_t *taccess;
stree_tapply_t *tapply;
stree_tindex_t *tindex;
} u;
} stree_texpr_t;
/*
* Statements, class members and module members.
*/
/** Statement block */
typedef struct stree_block {
/** List of statements in the block */
list_t stats; /* of stree_stat_t */
} stree_block_t;
/** Variable declaration */
typedef struct {
stree_ident_t *name;
stree_texpr_t *type;
/** Type of this variable or @c NULL if not typed yet */
struct tdata_item *titem;
} stree_vdecl_t;
/** @c except clause */
typedef struct {
stree_ident_t *evar;
stree_texpr_t *etype;
stree_block_t *block;
/** Evaluated etype or @c NULL if not typed yet */
struct tdata_item *titem;
} stree_except_t;
/** @c if or @c elif clause */
typedef struct {
stree_expr_t *cond;
stree_block_t *block;
} stree_if_clause_t;
/** If statement */
typedef struct {
/** If and elif clauses */
list_t if_clauses; /* of stree_if_clause_t */
/** Else block */
stree_block_t *else_block;
} stree_if_t;
/** @c when clause */
typedef struct {
/** List of expressions -- cases -- for this clause */
list_t exprs; /* of stree_expr_t */
stree_block_t *block;
} stree_when_t;
/** Switch statement */
typedef struct {
/** Switch expression */
stree_expr_t *expr;
/** When clauses */
list_t when_clauses; /* of stree_when_t */
/** Else block */
stree_block_t *else_block;
} stree_switch_t;
/** While statement */
typedef struct {
stree_expr_t *cond;
stree_block_t *body;
} stree_while_t;
/** For statement */
typedef struct {
stree_block_t *body;
} stree_for_t;
/** Raise statement */
typedef struct {
stree_expr_t *expr;
} stree_raise_t;
/** Break statement */
typedef struct {
} stree_break_t;
/** Return statement */
typedef struct {
stree_expr_t *expr;
} stree_return_t;
/** Expression statement */
typedef struct {
stree_expr_t *expr;
} stree_exps_t;
/** With-try-except-finally (WEF) statement */
typedef struct {
stree_block_t *with_block;
list_t except_clauses; /* of stree_except_t */
stree_block_t *finally_block;
} stree_wef_t;
/** Statement class */
typedef enum {
st_vdecl,
st_if,
st_switch,
st_while,
st_for,
st_raise,
st_break,
st_return,
st_exps,
st_wef
} stat_class_t;
/** Statement */
typedef struct {
stat_class_t sc;
union {
stree_vdecl_t *vdecl_s;
stree_if_t *if_s;
stree_switch_t *switch_s;
stree_while_t *while_s;
stree_for_t *for_s;
stree_raise_t *raise_s;
stree_break_t *break_s;
stree_return_t *return_s;
stree_exps_t *exp_s;
stree_wef_t *wef_s;
} u;
} stree_stat_t;
/** Argument attribute class */
typedef enum {
/** Packed argument (for variadic functions) */
aac_packed
} arg_attr_class_t;
/** Argument atribute */
typedef struct {
arg_attr_class_t aac;
} stree_arg_attr_t;
/** Formal function parameter */
typedef struct {
/* Argument name */
stree_ident_t *name;
/* Argument type */
stree_texpr_t *type;
/* Attributes */
list_t attr; /* of stree_arg_attr_t */
} stree_proc_arg_t;
/** Function signature.
*
* Formal parameters and return type. This is common to function and delegate
* delcarations.
*/
typedef struct {
/** Formal parameters */
list_t args; /* of stree_proc_arg_t */
/** Variadic argument or @c NULL if none. */
stree_proc_arg_t *varg;
/** Return type */
stree_texpr_t *rtype;
} stree_fun_sig_t;
/** Procedure
*
* Procedure is the common term for a getter, setter or function body.
* A procedure can be invoked. However, the arguments are specified by
* the containing symbol.
*/
typedef struct stree_proc {
/** Symbol (function or property) containing the procedure */
struct stree_symbol *outer_symbol;
/** Main block for regular procedures */
stree_block_t *body;
/** Builtin handler for builtin procedures */
builtin_proc_t bi_handler;
} stree_proc_t;
/** Constructor declaration */
typedef struct stree_ctor {
/** Constructor 'name'. Points to the @c new keyword. */
stree_ident_t *name;
/** Symbol */
struct stree_symbol *symbol;
/** Signature (arguments, return type is always none) */
stree_fun_sig_t *sig;
/** Constructor implementation */
stree_proc_t *proc;
/** Type item describing the constructor */
struct tdata_item *titem;
} stree_ctor_t;
/** Delegate declaration */
typedef struct stree_deleg {
/** Delegate name */
stree_ident_t *name;
/** Symbol */
struct stree_symbol *symbol;
/** Signature (arguments and return type) */
stree_fun_sig_t *sig;
/** Type item describing the delegate */
struct tdata_item *titem;
} stree_deleg_t;
/** Enum member */
typedef struct stree_embr {
/** Enum containing this declaration */
struct stree_enum *outer_enum;
/** Enum member name */
stree_ident_t *name;
} stree_embr_t;
/** Enum declaration */
typedef struct stree_enum {
/** Enum name */
stree_ident_t *name;
/** Symbol */
struct stree_symbol *symbol;
/** List of enum members */
list_t members; /* of stree_embr_t */
/** Type item describing the enum */
struct tdata_item *titem;
} stree_enum_t;
/** Member function declaration */
typedef struct stree_fun {
/** Function name */
stree_ident_t *name;
/** Symbol */
struct stree_symbol *symbol;
/** Signature (arguments and return type) */
stree_fun_sig_t *sig;
/** Function implementation */
stree_proc_t *proc;
/** Type item describing the function */
struct tdata_item *titem;
} stree_fun_t;
/** Member variable declaration */
typedef struct stree_var {
stree_ident_t *name;
struct stree_symbol *symbol;
stree_texpr_t *type;
} stree_var_t;
/** Member property declaration */
typedef struct stree_prop {
stree_ident_t *name;
struct stree_symbol *symbol;
stree_texpr_t *type;
stree_proc_t *getter;
stree_proc_t *setter;
stree_proc_arg_t *setter_arg;
/** Formal parameters (for indexed properties) */
list_t args; /* of stree_proc_arg_t */
/** Variadic argument or @c NULL if none. */
stree_proc_arg_t *varg;
/** Type of the property */
struct tdata_item *titem;
} stree_prop_t;
/**
* Fake identifiers used with symbols that do not really have one.
*/
#define CTOR_IDENT "$ctor"
#define INDEXER_IDENT "$indexer"
typedef enum {
csimbr_csi,
csimbr_ctor,
csimbr_deleg,
csimbr_enum,
csimbr_fun,
csimbr_var,
csimbr_prop
} csimbr_class_t;
/** Class, struct or interface member */
typedef struct {
csimbr_class_t cc;
union {
struct stree_csi *csi;
stree_ctor_t *ctor;
stree_deleg_t *deleg;
stree_enum_t *enum_d;
stree_fun_t *fun;
stree_var_t *var;
stree_prop_t *prop;
} u;
} stree_csimbr_t;
typedef enum {
csi_class,
csi_struct,
csi_interface
} csi_class_t;
/** CSI formal type argument */
typedef struct stree_targ {
stree_ident_t *name;
struct stree_symbol *symbol;
} stree_targ_t;
/** Class, struct or interface declaration */
typedef struct stree_csi {
/** Which of class, struct or interface */
csi_class_t cc;
/** Name of this CSI */
stree_ident_t *name;
/** List of type arguments */
list_t targ; /* of stree_targ_t */
/** Symbol for this CSI */
struct stree_symbol *symbol;
/** Type expressions referencing inherited CSIs. */
list_t inherit; /* of stree_texpr_t */
/** Base CSI. Only available when ancr_state == ws_visited. */
struct stree_csi *base_csi;
/** Types of implemented or accumulated interfaces. */
list_t impl_if_ti; /* of tdata_item_t */
/** Node state for ancr walks. */
walk_state_t ancr_state;
/** List of CSI members */
list_t members; /* of stree_csimbr_t */
} stree_csi_t;
typedef enum {
/* Class, struct or interface declaration */
mc_csi,
/* Enum declaration */
mc_enum
} modm_class_t;
/** Module member */
typedef struct {
modm_class_t mc;
union {
stree_csi_t *csi;
stree_enum_t *enum_d;
} u;
} stree_modm_t;
/** Module */
typedef struct stree_module {
/** List of module members */
list_t members; /* of stree_modm_t */
} stree_module_t;
/** Symbol attribute class */
typedef enum {
/** Builtin symbol (interpreter hook) */
sac_builtin,
/** Static symbol */
sac_static
} symbol_attr_class_t;
/** Symbol atribute */
typedef struct {
symbol_attr_class_t sac;
} stree_symbol_attr_t;
typedef enum {
/** CSI (class, struct or interface) */
sc_csi,
/** Constructor */
sc_ctor,
/** Member delegate */
sc_deleg,
/** Enum */
sc_enum,
/** Member function */
sc_fun,
/** Member variable */
sc_var,
/** Member property */
sc_prop
} symbol_class_t;
/** Symbol
*
* A symbol is a common superclass of different program elements that
* allow us to refer to them, print their fully qualified names, etc.
*/
typedef struct stree_symbol {
symbol_class_t sc;
union {
struct stree_csi *csi;
stree_ctor_t *ctor;
stree_deleg_t *deleg;
stree_enum_t *enum_d;
stree_fun_t *fun;
stree_var_t *var;
stree_prop_t *prop;
} u;
/** Containing CSI */
stree_csi_t *outer_csi;
/** Symbol attributes */
list_t attr; /* of stree_symbol_attr_t */
} stree_symbol_t;
/** Program */
typedef struct stree_program {
/** The one and only module in the program */
stree_module_t *module;
/** Builtin symbols binding. */
struct builtin *builtin;
} stree_program_t;
#endif