WIP - multi-variable assigment. experimental convertion from := to set/set-r done
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
parent
c5606262b9
commit
eb6e0484af
@ -161,8 +161,9 @@ static char* synerrstr[] =
|
|||||||
"unbalanced key/value pair",
|
"unbalanced key/value pair",
|
||||||
"unbalanced parenthesis/brace/bracket",
|
"unbalanced parenthesis/brace/bracket",
|
||||||
"unexpected semicolon",
|
"unexpected semicolon",
|
||||||
"block expression expected"
|
"block expression expected",
|
||||||
"block expression disallowed"
|
"block expression disallowed",
|
||||||
|
"invalid lvalue"
|
||||||
};
|
};
|
||||||
|
|
||||||
/* --------------------------------------------------------------------------
|
/* --------------------------------------------------------------------------
|
||||||
|
@ -166,7 +166,8 @@ enum hcl_synerrnum_t
|
|||||||
HCL_SYNERR_UNBALPBB, /* unbalanced parenthesis/brace/bracket */
|
HCL_SYNERR_UNBALPBB, /* unbalanced parenthesis/brace/bracket */
|
||||||
HCL_SYNERR_SEMICOLON, /* unexpected semicolon */
|
HCL_SYNERR_SEMICOLON, /* unexpected semicolon */
|
||||||
HCL_SYNERR_BLOCK, /* block expression expected */
|
HCL_SYNERR_BLOCK, /* block expression expected */
|
||||||
HCL_SYNERR_BLOCKBANNED /* block expression disallowed */
|
HCL_SYNERR_BLOCKBANNED, /* block expression disallowed */
|
||||||
|
HCL_SYNERR_LVALUE /* invalid lvalue */
|
||||||
};
|
};
|
||||||
typedef enum hcl_synerrnum_t hcl_synerrnum_t;
|
typedef enum hcl_synerrnum_t hcl_synerrnum_t;
|
||||||
|
|
||||||
|
37
lib/read.c
37
lib/read.c
@ -572,36 +572,40 @@ static HCL_INLINE hcl_cnode_t* leave_list (hcl_t* hcl, hcl_loc_t* list_loc, int*
|
|||||||
if (concode == HCL_CONCODE_ALIST)
|
if (concode == HCL_CONCODE_ALIST)
|
||||||
{
|
{
|
||||||
/* tranform (var := val) to (set var val) */
|
/* tranform (var := val) to (set var val) */
|
||||||
hcl_cnode_t* sym, * newhead, * rval;
|
hcl_cnode_t* sym, * newhead, * lval;
|
||||||
hcl_oocs_t fake_tok, * fake_tok_ptr = HCL_NULL;
|
hcl_oocs_t fake_tok, * fake_tok_ptr = HCL_NULL;
|
||||||
|
|
||||||
rval = HCL_CNODE_CONS_CAR(head);
|
lval = HCL_CNODE_CONS_CAR(head);
|
||||||
if (rval && HCL_CNODE_IS_CONS(rval) && HCL_CNODE_CONS_CONCODE(rval) == HCL_CONCODE_ARRAY)
|
if (lval && HCL_CNODE_IS_ELIST(lval))
|
||||||
{
|
{
|
||||||
hcl_cnode_t* tmp, * lval;
|
/* invalid lvalue */
|
||||||
|
hcl_setsynerr (hcl, HCL_SYNERR_LVALUE, HCL_CNODE_GET_LOC(lval), HCL_CNODE_GET_TOK(lval));
|
||||||
|
if (head) hcl_freecnode (hcl, head);
|
||||||
|
return HCL_NULL;
|
||||||
|
}
|
||||||
|
else if (lval && HCL_CNODE_IS_CONS(lval) && HCL_CNODE_CONS_CONCODE(lval) == HCL_CONCODE_ARRAY)
|
||||||
|
{
|
||||||
|
hcl_cnode_t* tmp, * rval;
|
||||||
|
|
||||||
fake_tok.ptr = vocas[VOCA_SYM_SET_R].str;
|
fake_tok.ptr = vocas[VOCA_SYM_SET_R].str;
|
||||||
fake_tok.len = vocas[VOCA_SYM_SET_R].len;
|
fake_tok.len = vocas[VOCA_SYM_SET_R].len;
|
||||||
fake_tok_ptr = &fake_tok;
|
fake_tok_ptr = &fake_tok;
|
||||||
|
|
||||||
/* move the array item up to the main list */
|
/* move the array item up to the main list and join the original lval to the end of it */
|
||||||
/* TODO: check ELIST separately??? */
|
rval = HCL_CNODE_CONS_CDR(head);
|
||||||
lval = HCL_CNODE_CONS_CDR(lval);
|
|
||||||
HCL_CNODE_CONS_CAR(head) = HCL_CNODE_CONS_CAR(rval);
|
hcl_freesinglecnode (hcl, head);
|
||||||
hcl_dumpcnode(hcl, tmp, 1);
|
head = lval;
|
||||||
hcl_dumpcnode(hcl, rval, 1);
|
|
||||||
for (tmp = rval; tmp && HCL_CNODE_IS_CONS(tmp); tmp = HCL_CNODE_CONS_CDR(tmp))
|
/* TODO: check in advance if array items are all symbols... */
|
||||||
|
for (tmp = lval; tmp && HCL_CNODE_IS_CONS(tmp); tmp = HCL_CNODE_CONS_CDR(tmp))
|
||||||
{
|
{
|
||||||
if (!HCL_CNODE_CONS_CDR(tmp))
|
if (!HCL_CNODE_CONS_CDR(tmp))
|
||||||
{
|
{
|
||||||
// HCL_CNODE_CONS_CDR(tmp) = lval;
|
HCL_CNODE_CONS_CDR(tmp) = rval;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
hcl_dumpcnode(hcl, rval, 1);
|
|
||||||
|
|
||||||
hcl_freesinglecnode (hcl, rval);
|
|
||||||
hcl_dumpcnode(hcl, head, 1);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -621,6 +625,7 @@ static HCL_INLINE hcl_cnode_t* leave_list (hcl_t* hcl, hcl_loc_t* list_loc, int*
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* create a new head joined with set or set-r */
|
||||||
newhead = hcl_makecnodecons(hcl, 0, &loc, fake_tok_ptr, sym, head);
|
newhead = hcl_makecnodecons(hcl, 0, &loc, fake_tok_ptr, sym, head);
|
||||||
if (HCL_UNLIKELY(!newhead))
|
if (HCL_UNLIKELY(!newhead))
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user