wip - writing part of compile_fun() in comp.c
Some checks failed
continuous-integration/drone/push Build is failing

This commit is contained in:
hyung-hwan 2024-09-29 14:02:38 +09:00
parent 5be537b16d
commit 29af1562fc
3 changed files with 55 additions and 12 deletions

View File

@ -2836,12 +2836,13 @@ static int compile_fun (hcl_t* hcl, hcl_cnode_t* src)
HCL_ASSERT (hcl, HCL_CNODE_IS_SYMBOL_SYNCODED(cmd, HCL_SYNCODE_FUN) || HCL_ASSERT (hcl, HCL_CNODE_IS_SYMBOL_SYNCODED(cmd, HCL_SYNCODE_FUN) ||
HCL_CNODE_IS_TYPED(cmd, HCL_CNODE_FUN)); HCL_CNODE_IS_TYPED(cmd, HCL_CNODE_FUN));
#if 0 if (obj)
if (obj /*&& HCL_CNODE_IS_CONS(obj)*/)
{ {
hcl_cnode_t* tmp, * next; hcl_cnode_t* tmp, * next;
HCL_ASERT (hcl, HCL_CNODE_IS_CONS(obj)); /* the reader ensures that the cdr field of a cons cell points to the next cell.
* and only the field of the last cons cell is NULL. */
HCL_ASSERT (hcl, HCL_CNODE_IS_CONS(obj));
/* fun (arg..) /* fun (arg..)
* fun name (arg..) * fun name (arg..)
@ -2859,7 +2860,15 @@ static int compile_fun (hcl_t* hcl, hcl_cnode_t* src)
fun_name = tmp; fun_name = tmp;
next = HCL_CNODE_CONS_CDR(next); next = HCL_CNODE_CONS_CDR(next);
if (!next) goto no_arg_list; if (!next)
{
hcl_setsynerrbfmt (
hcl, HCL_SYNERR_FUN, HCL_CNODE_GET_LOC(cmd), HCL_NULL,
"'%.*js' name '%.*js' not followed by ( or :",
HCL_CNODE_GET_TOKLEN(cmd), HCL_CNODE_GET_TOKPTR(cmd),
HCL_CNODE_GET_TOKLEN(fun_name), HCL_CNODE_GET_TOKPTR(fun_name));
return -1;
}
tmp = HCL_CNODE_CONS_CAR(next); tmp = HCL_CNODE_CONS_CAR(next);
if (HCL_CNODE_IS_COLON(tmp)) if (HCL_CNODE_IS_COLON(tmp))
@ -2869,10 +2878,26 @@ static int compile_fun (hcl_t* hcl, hcl_cnode_t* src)
class_name = fun_name; class_name = fun_name;
next = HCL_CNODE_CONS_CDR(next); next = HCL_CNODE_CONS_CDR(next);
if (!next) goto no_function_name; if (!next)
{
hcl_setsynerrbfmt (
hcl, HCL_SYNERR_FUN, HCL_CNODE_GET_LOC(cmd), HCL_NULL,
"no '%.*js' name after class name '%.*js' and :",
HCL_CNODE_GET_TOKLEN(cmd), HCL_CNODE_GET_TOKPTR(cmd),
HCL_CNODE_GET_TOKLEN(class_name), HCL_CNODE_GET_TOKPTR(class_name));
return -1;
}
tmp = HCL_CNODE_CONS_CAR(next); tmp = HCL_CNODE_CONS_CAR(next);
if (!HCL_CNODE_IS_SYMBOL_PLAIN(tmp)) error... if (!HCL_CNODE_IS_SYMBOL_PLAIN(tmp))
{
hcl_setsynerrbfmt (
hcl, HCL_SYNERR_FUN, HCL_CNODE_GET_LOC(cmd), HCL_NULL,
"invalid '%.*js' name '%.*js' after class name and :",
HCL_CNODE_GET_TOKLEN(cmd), HCL_CNODE_GET_TOKPTR(cmd),
HCL_CNODE_GET_TOKLEN(tmp), HCL_CNODE_GET_TOKPTR(tmp));
return -1;
}
fun_name = tmp; fun_name = tmp;
} }
} }
@ -2880,7 +2905,15 @@ static int compile_fun (hcl_t* hcl, hcl_cnode_t* src)
{ {
/* 'fun' followed by attribute or argument list */ /* 'fun' followed by attribute or argument list */
next = HCL_CNODE_CONS_CDR(next); next = HCL_CNODE_CONS_CDR(next);
if (!next) goto no_body_or_no_name... if (!next)
{
hcl_setsynerrbfmt (
hcl, HCL_SYNERR_FUN, HCL_CNODE_GET_LOC(cmd), HCL_NULL,
"'%.*js' not defined with body",
HCL_CNODE_GET_TOKLEN(cmd), HCL_CNODE_GET_TOKPTR(cmd),
HCL_CNODE_GET_TOKLEN(tmp), HCL_CNODE_GET_TOKPTR(tmp));
return -1;
}
tmp = HCL_CNODE_CONS_CAR(next); tmp = HCL_CNODE_CONS_CAR(next);
if (HCL_CNODE_IS_SYMBOL_PLAIN(tmp)) if (HCL_CNODE_IS_SYMBOL_PLAIN(tmp))
@ -2892,19 +2925,27 @@ static int compile_fun (hcl_t* hcl, hcl_cnode_t* src)
{ {
/* fun(#attr..) (arg..) */ /* fun(#attr..) (arg..) */
} }
/* fall down to handle the function body */
} }
else else
{ {
/* ERROR: */ hcl_setsynerrbfmt (
/* invalid token after fun */ hcl, HCL_SYNERR_FUN, HCL_CNODE_GET_LOC(cmd), HCL_NULL,
"'%.*js' not followed by name or (, but followed by '%.*js'",
HCL_CNODE_GET_TOKLEN(cmd), HCL_CNODE_GET_TOKPTR(cmd),
HCL_CNODE_GET_TOKLEN(tmp), HCL_CNODE_GET_TOKPTR(tmp));
return -1;
} }
} }
else else
{ {
/* error */ hcl_setsynerrbfmt (
/* nothing after `fun` */ hcl, HCL_SYNERR_FUN, HCL_CNODE_GET_LOC(cmd), HCL_NULL,
"'%.*js' not followed by name or (",
HCL_CNODE_GET_TOKLEN(cmd), HCL_CNODE_GET_TOKPTR(cmd));
return -1;
} }
#endif
if (obj && HCL_CNODE_IS_CONS(obj)) if (obj && HCL_CNODE_IS_CONS(obj))
{ {

View File

@ -155,6 +155,7 @@ static const char* synerrstr[] =
"disallowed argument name", "disallowed argument name",
"disallowed", "disallowed",
"invalid function definition",
"elif without if", "elif without if",
"else without if", "else without if",
"catch without try", "catch without try",

View File

@ -159,6 +159,7 @@ enum hcl_synerrnum_t
HCL_SYNERR_BANNEDARGNAME, /* disallowed argument name */ HCL_SYNERR_BANNEDARGNAME, /* disallowed argument name */
HCL_SYNERR_BANNED, /* prohibited */ HCL_SYNERR_BANNED, /* prohibited */
HCL_SYNERR_FUN, /* invalid function definition */
HCL_SYNERR_ELIF, /* elif without if */ HCL_SYNERR_ELIF, /* elif without if */
HCL_SYNERR_ELSE, /* else without if */ HCL_SYNERR_ELSE, /* else without if */
HCL_SYNERR_CATCH, /* catch outside try */ HCL_SYNERR_CATCH, /* catch outside try */