C style functions can now (optionally) be used (void foo ();)

This commit is contained in:
Bill Currie 2004-02-11 00:36:34 +00:00
parent e2602bc9d5
commit 1fc517f7db
3 changed files with 54 additions and 20 deletions

View file

@ -69,6 +69,8 @@ param_t *copy_params (param_t *params);
struct type_s *parse_params (struct type_s *type, param_t *params); struct type_s *parse_params (struct type_s *type, param_t *params);
void build_scope (function_t *f, struct def_s *func, param_t *params); void build_scope (function_t *f, struct def_s *func, param_t *params);
function_t *new_function (const char *name); function_t *new_function (const char *name);
function_t *build_code_function (function_t *f, struct expr_s *state_expr,
struct expr_s *statements);
function_t *build_builtin_function (struct def_s *def, struct expr_s *bi_val); function_t *build_builtin_function (struct def_s *def, struct expr_s *bi_val);
void build_function (function_t *f); void build_function (function_t *f);
void finish_function (function_t *f); void finish_function (function_t *f);

View file

@ -196,6 +196,20 @@ new_function (const char *name)
return f; return f;
} }
function_t *
build_code_function (function_t *f, expr_t *state_expr, expr_t *statements)
{
build_function (f);
if (state_expr) {
state_expr->next = statements;
emit_function (f, state_expr);
} else {
emit_function (f, statements);
}
finish_function (f);
return f;
}
function_t * function_t *
build_builtin_function (def_t *def, expr_t *bi_val) build_builtin_function (def_t *def, expr_t *bi_val)
{ {

View file

@ -246,6 +246,42 @@ simple_defs
simple_def simple_def
: non_func_type def_list ';' { } : non_func_type def_list ';' { }
| func_type func_defs { } | func_type func_defs { }
| cfunction { }
;
cfunction
: non_func_type NAME function_decl ';'
{
type_t *type;
def_t *def;
type = parse_params ($1, $3);
def = get_def (type, $2, current_scope, current_storage);
}
| non_func_type NAME function_decl '=' '#' fexpr ';'
{
type_t *type;
def_t *def;
type = parse_params ($1, $3);
def = get_def (type, $2, current_scope, current_storage);
$6 = constant_expr ($6);
build_builtin_function (def, $6);
}
| non_func_type NAME function_decl
opt_state_expr
{ $<op>$ = current_storage; }
{
type_t *type;
current_params = $3;
type = parse_params ($1, $3);
$<def>$ = get_def (type, $2, current_scope, current_storage);
}
begin_function statement_block { $<op>$ = $<op>5; } end_function
{
build_code_function ($7, $4, $8);
}
; ;
storage_class storage_class
@ -446,9 +482,6 @@ non_code_func
} }
| /* emtpy */ | /* emtpy */
{ {
if ($<def>0 && !$<def>0->local
&& $<def>0->type->type != ev_func)
def_initialized ($<def>0);
} }
; ;
@ -458,14 +491,7 @@ code_func
{ $<def>$ = $<def>0; } { $<def>$ = $<def>0; }
begin_function statement_block { $<op>$ = $<op>3; } end_function begin_function statement_block { $<op>$ = $<op>3; } end_function
{ {
build_function ($5); build_code_function ($5, $2, $6);
if ($2) {
$2->next = $6;
emit_function ($5, $2);
} else {
emit_function ($5, $6);
}
finish_function ($5);
} }
; ;
@ -1287,15 +1313,7 @@ methoddef
} }
begin_function statement_block { $<op>$ = $<op>5; } end_function begin_function statement_block { $<op>$ = $<op>5; } end_function
{ {
$2->func = $7; $2->func = build_code_function ($7, $4, $8);
build_function ($7);
if ($4) {
$4->next = $8;
emit_function ($7, $4);
} else {
emit_function ($7, $8);
}
finish_function ($7);
} }
| ci methoddecl '=' '#' const ';' | ci methoddecl '=' '#' const ';'
{ {