}
%type decl_struct {decl_struct*}
+%destructor decl_struct {free_decl_struct($$);}
decl_struct(strct) ::= STRUCT NAME(N) LBRACE struct_args(args) RBRACE. {
strct = init_decl_struct(N->text, args);
+ free(N);
}
%type const_type {const_type*}
+%destructor const_type {free_const_type($$);}
const_type(type_) ::= BOOL(T). {
type_ = init_const_type(T->type, T->text);
free(T);
free(T);
}
%type constant {constant*}
+%destructor constant {free_constant($$);}
constant(constant) ::= CONST const_type(type) NSNAME(T) EQUALS impl_def_val(val) EOS. {
constant = init_constant(type, T->text, val);
free(T);
}
%type decl_typedef {decl_typedef*}
+%destructor decl_typedef {free_decl_typedef($$);}
decl_typedef(def) ::= TYPEDEF decl_type(type) NAME(ALIAS) EOS. {
def = init_decl_typedef(ALIAS->text, type);
free(ALIAS);
}
%type decl {decl*}
+%destructor decl {free_decl($$);}
decl(decl) ::= decl_abi(abi) decl_arg(func) LPAREN decl_args(args) RPAREN EOS. {
decl = init_decl(abi, func, args);
}
%type decl_abi {decl_abi*}
+%destructor decl_abi {free_decl_abi($$);}
decl_abi(abi) ::= NAME(T). {
abi = init_decl_abi(T->text);
free(T);
}
%type decl_var {decl_var*}
+%destructor decl_var {free_decl_var($$);}
decl_var(var) ::= NAME(T). {
var = init_decl_var(T->text, 0, 0);
free(T);
}
%type decl_vars {decl_vars*}
+%destructor decl_vars {free_decl_vars($$);}
decl_vars(vars) ::= decl_var(var). {
vars = init_decl_vars(var);
}
}
%type decl_arg {decl_arg*}
-decl_arg(arg) ::= decl_type(type) decl_var(var). {
- arg = init_decl_arg(type, var);
+%destructor decl_arg {free_decl_arg($$);}
+decl_arg(arg_) ::= decl_type(type) decl_var(var). {
+ arg_ = var->arg = init_decl_arg(type, var);
}
%type decl_args {decl_args*}
+%destructor decl_args {free_decl_args($$);}
decl_args ::= VOID.
decl_args(args) ::= decl_arg(arg). {
args = init_decl_args(arg);
args = add_decl_arg(args_, arg);
}
%type struct_args {decl_args*}
+%destructor struct_args {free_decl_args($$);}
struct_args(args) ::= decl_arg(arg) EOS. {
args = init_decl_args(arg);
}
}
%type decl_type {decl_type*}
+%destructor decl_type {free_decl_type($$);}
decl_type(type_) ::= VOID(T). {
type_ = init_decl_type(T->type, T->text);
free(T);
}
%type impl_func {impl_func*}
+%destructor impl_func {free_impl_func($$);}
impl_func(func) ::= FUNCTION NSNAME(NAME) impl_args(args) COLON impl_type(type). {
func = init_impl_func(NAME->text, args, type, 0);
free(NAME);
}
%type impl_def_val {impl_def_val*}
+%destructor impl_def_val {free_impl_def_val($$);}
impl_def_val(def) ::= NULL(T). {
def = init_impl_def_val(T);
free(T);
}
%type impl_var {impl_var*}
+%destructor impl_var {free_impl_var($$);}
impl_var(var) ::= DOLLAR NAME(T). {
var = init_impl_var(T->text, 0);
free(T);
}
%type impl_arg {impl_arg*}
+%destructor impl_arg {free_impl_arg($$);}
impl_arg(arg) ::= impl_type(type) impl_var(var). {
arg = init_impl_arg(type, var, NULL);
}
}
%type impl_args {impl_args*}
+%destructor impl_args {free_impl_args($$);}
impl_args(args) ::= LPAREN RPAREN. {
args = NULL;
}
args = args_;
}
%type impl_arg_list {impl_args*}
+%destructor impl_arg_list {free_impl_args($$);}
impl_arg_list(args) ::= impl_arg(arg). {
args = init_impl_args(arg);
}
}
%type let_stmt {let_stmt*}
+%destructor let_stmt {free_let_stmt($$);}
let_stmt(let) ::= LET decl_var(var) EOS. {
let = init_let_stmt(var, NULL);
}
}
%type let_value {let_value*}
+%destructor let_value {free_let_value($$);}
let_value(val) ::= CALLOC(F) LPAREN NUMBER(N) COMMA decl_type(t) RPAREN. {
val = init_let_value(
init_let_func(F->type, F->text,
- atol(N->text) * psi_t_size(real_decl_type(t)->type)
+ init_let_calloc(
+ atol(N->text), t
+ )
), NULL, 0
);
- free_decl_type(t);
free(F);
free(N);
}
}
%type let_func {let_func*}
+%destructor let_func {free_let_func($$);}
let_func(func) ::= STRLEN(T). {
- func = init_let_func(T->type, T->text, 0);
+ func = init_let_func(T->type, T->text, NULL);
free(T);
}
let_func(func) ::= STRVAL(T). {
- func = init_let_func(T->type, T->text, 0);
+ func = init_let_func(T->type, T->text, NULL);
free(T);
}
let_func(func) ::= INTVAL(T). {
- func = init_let_func(T->type, T->text, 0);
+ func = init_let_func(T->type, T->text, NULL);
free(T);
}
let_func(func) ::= FLOATVAL(T). {
- func = init_let_func(T->type, T->text, 0);
+ func = init_let_func(T->type, T->text, NULL);
free(T);
}
let_func(func) ::= BOOLVAL(T). {
- func = init_let_func(T->type, T->text, 0);
+ func = init_let_func(T->type, T->text, NULL);
free(T);
}
let_func(func) ::= ARRVAL(T). {
- func = init_let_func(T->type, T->text, 0);
+ func = init_let_func(T->type, T->text, NULL);
free(T);
}
%type set_stmt {set_stmt*}
+%destructor set_stmt {free_set_stmt($$);}
set_stmt(set) ::= SET impl_var(var) EQUALS set_value(val) EOS. {
set = init_set_stmt(var, val);
}
%type set_value {set_value*}
+%destructor set_value {free_set_value($$);}
set_value(val) ::= set_func(func) LPAREN decl_vars(vars) RPAREN. {
val = init_set_value(func, vars);
}
%type set_func {set_func*}
+%destructor set_func {free_set_func($$);}
set_func(func) ::= TO_ARRAY(T). {
func = init_set_func(T->type, T->text);
free(T);
}
%type return_stmt {return_stmt*}
+%destructor return_stmt {free_return_stmt($$);}
return_stmt(ret) ::= RETURN set_func(func) LPAREN decl_var(var) RPAREN EOS. {
ret = init_return_stmt(func, var);
}
%type free_stmt {free_stmt*}
+%destructor free_stmt {free_free_stmt($$);}
free_stmt(free) ::= FREE decl_vars(vars) EOS. {
free = init_free_stmt(vars);
}
%type impl_type {impl_type*}
+%destructor impl_type {free_impl_type($$);}
impl_type(type_) ::= VOID(T). {
type_ = init_impl_type(T->type, T->text);
free(T);