enhanced the reader to perform sanity check on a tuple in advance

This commit is contained in:
hyung-hwan 2024-07-13 17:40:27 +09:00
parent 0d5907b726
commit 7754d7c7e9
3 changed files with 16 additions and 9 deletions

View File

@ -940,10 +940,12 @@ static int chain_to_list (hcl_t* hcl, hcl_cnode_t* obj, hcl_loc_t* loc)
{ {
hcl_rstl_t* rstl; hcl_rstl_t* rstl;
int flagv; int flagv;
int list_concode;
HCL_ASSERT (hcl, hcl->c->r.st != HCL_NULL); HCL_ASSERT (hcl, hcl->c->r.st != HCL_NULL);
rstl = hcl->c->r.st; rstl = hcl->c->r.st;
flagv = rstl->flagv; flagv = rstl->flagv;
list_concode = (hcl_concode_t)LIST_FLAG_GET_CONCODE(flagv);
if (flagv & CLOSED) if (flagv & CLOSED)
{ {
@ -972,15 +974,13 @@ static int chain_to_list (hcl_t* hcl, hcl_cnode_t* obj, hcl_loc_t* loc)
if (HCL_CNODE_IS_CONS(obj) && HCL_CNODE_CONS_CONCODE(obj) != HCL_CONCODE_QLIST) if (HCL_CNODE_IS_CONS(obj) && HCL_CNODE_CONS_CONCODE(obj) != HCL_CONCODE_QLIST)
{ {
hcl_cnode_t* shell; hcl_cnode_t* shell;
/* if the last element is another non-data list /* if the last element is another non-data list
* for example, #( 1 2 . [ 3 4 5 ]) * for example, #( 1 2 . #[ 3 4 5 ])
* use a shell node to wrap the actual object list node head * use a shell node to wrap the actual object list node head
* for the compiler. * for the compiler.
*/ */
shell = hcl_makecnodeshell(hcl, 0, HCL_CNODE_GET_LOC(obj), obj); shell = hcl_makecnodeshell(hcl, 0, HCL_CNODE_GET_LOC(obj), obj);
if (HCL_UNLIKELY(!shell)) return -1; if (HCL_UNLIKELY(!shell)) return -1;
tail->u.cons.cdr = shell; tail->u.cons.cdr = shell;
} }
else else
@ -1022,6 +1022,14 @@ static int chain_to_list (hcl_t* hcl, hcl_cnode_t* obj, hcl_loc_t* loc)
fake_tok_ptr = &fake_tok; fake_tok_ptr = &fake_tok;
} }
if (list_concode == HCL_CONCODE_TUPLE && !HCL_CNODE_IS_SYMBOL_PLAIN(obj) && concode != HCL_CONCODE_TUPLE)
{
/* a tuple must contain some simple symbol names or nested tuples only */
/* TODO: filter out binop symbols */
hcl_setsynerrbfmt (hcl, HCL_SYNERR_VARNAME, HCL_CNODE_GET_LOC(obj), HCL_CNODE_GET_TOK(obj), "invalid name - not symbol in tuple");
return -1;
}
cons = hcl_makecnodecons(hcl, 0, (loc? loc: HCL_CNODE_GET_LOC(obj)), fake_tok_ptr, obj, HCL_NULL); cons = hcl_makecnodecons(hcl, 0, (loc? loc: HCL_CNODE_GET_LOC(obj)), fake_tok_ptr, obj, HCL_NULL);
if (HCL_UNLIKELY(!cons)) return -1; if (HCL_UNLIKELY(!cons)) return -1;

View File

@ -52,7 +52,7 @@ a := #{
(printf "hello\n") (printf "hello\n")
);; );;
k := [10 ; 20 ]; ##ERROR: syntax error - unexpected semicolon k := #[10 ; 20 ]; ##ERROR: syntax error - unexpected semicolon
} }

View File

@ -31,7 +31,7 @@ defun String length() { ##ERROR: syntax error - no argument list
--- ---
class A [ 10 ] { ##ERROR: syntax error - not variable name - 10 class A [ 10 ] { ##ERROR: syntax error - invalid name - not symbol in tuple - 10
} }
--- ---
@ -47,7 +47,6 @@ class A [ [ [a] ] ] { ##ERROR: syntax error - not variable name
class A [ a + ] { ##ERROR: syntax error - prohibited binary operator - + class A [ a + ] { ##ERROR: syntax error - prohibited binary operator - +
} }
## TODO: This check is supposed to fail. + must be treated as a binop symbol ---
##--- class A [ + ] { ##ERROR: syntax error - prohibited binary operator - +
##class A [ + ] { ## ERROR: syntax error - prohibited binary operator - + }
##}