some 'do' experiment
Some checks failed
continuous-integration/drone/push Build is failing

This commit is contained in:
hyung-hwan 2023-11-28 20:47:23 +09:00
parent 9f4bf7485d
commit 57629478a1
4 changed files with 28 additions and 1 deletions

View File

@ -25,6 +25,13 @@ A HCL program is composed of expressions.
- until - until
- while - while
### do
```
do;
do 10;
do { | k | set k 20; printf "k=%d\n" k };
```
## Literals ## Literals
- integer - integer

View File

@ -24,6 +24,10 @@
#include "hcl-prv.h" #include "hcl-prv.h"
/* limit the `do` expression to have not more than 1 expression and
* no variable declaration if not enclosed in parentheses */
#define LANG_LIMIT_DO
enum enum
{ {
VAR_NAMED, VAR_NAMED,
@ -1707,7 +1711,6 @@ static HCL_INLINE int compile_or_p2 (hcl_t* hcl)
/* ========================================================================= */ /* ========================================================================= */
/* EXPERIMENT WITH BINOP */ /* EXPERIMENT WITH BINOP */
static int compile_plus (hcl_t* hcl, hcl_cnode_t* src) static int compile_plus (hcl_t* hcl, hcl_cnode_t* src)
{ {
@ -2004,6 +2007,7 @@ static int compile_expression_block (hcl_t* hcl, hcl_cnode_t* src, const hcl_bch
return -1; return -1;
} }
#if defined(LANG_LIMIT_DO) /* this limitation doesn't seem really useful? or make it #pragma based? */
if (!(flags & CEB_IS_BLOCK) && (flags & CEB_AUTO_FORGED)) if (!(flags & CEB_IS_BLOCK) && (flags & CEB_AUTO_FORGED))
{ {
/* `do` not explicitly enclosed in (). /* `do` not explicitly enclosed in ().
@ -2016,6 +2020,7 @@ static int compile_expression_block (hcl_t* hcl, hcl_cnode_t* src, const hcl_bch
"variable declaration disallowed in %hs context", ctxname); "variable declaration disallowed in %hs context", ctxname);
return -1; return -1;
} }
#endif
} }
tvslen = hcl->c->tv.s.len; tvslen = hcl->c->tv.s.len;
@ -2033,6 +2038,19 @@ static int compile_expression_block (hcl_t* hcl, hcl_cnode_t* src, const hcl_bch
} }
} }
#if defined(LANG_LIMIT_DO)
if (!(flags & CEB_IS_BLOCK) && (flags & CEB_AUTO_FORGED))
{
if (obj && HCL_CNODE_IS_CONS(obj) && hcl_countcnodecons(hcl, obj) != 1)
{
hcl_setsynerrbfmt (
hcl, HCL_SYNERR_VARDCLBANNED, HCL_CNODE_GET_LOC(obj), HCL_NULL,
"more than one expression after %hs", ctxname);
return -1;
}
}
#endif
fbi = &hcl->c->fnblk.info[hcl->c->fnblk.depth]; fbi = &hcl->c->fnblk.info[hcl->c->fnblk.depth];
fbi->tmprlen = hcl->c->tv.s.len; fbi->tmprlen = hcl->c->tv.s.len;
fbi->tmprcnt = hcl->c->tv.wcount; fbi->tmprcnt = hcl->c->tv.wcount;

View File

@ -10,6 +10,7 @@ check_SCRIPTS = \
check_ERRORS = \ check_ERRORS = \
do-01.err \ do-01.err \
do-02.err \
feed-01.err \ feed-01.err \
var-01.err \ var-01.err \
var-02.err \ var-02.err \

View File

@ -481,6 +481,7 @@ check_SCRIPTS = \
check_ERRORS = \ check_ERRORS = \
do-01.err \ do-01.err \
do-02.err \
feed-01.err \ feed-01.err \
var-01.err \ var-01.err \
var-02.err \ var-02.err \