added a new keyword @nil

This commit is contained in:
hyung-hwan 2020-11-10 02:56:29 +00:00
parent 93aa76e104
commit 7ab601303c
7 changed files with 100 additions and 51 deletions

View File

@ -399,7 +399,7 @@ enum hawk_nde_type_t
/* expression */ /* expression */
/* if you change the following values including their order, /* if you change the following values including their order,
* you should change __evaluator of __eval_expression * you should change __evaluator of eval_expression0()
* in run.c accordingly */ * in run.c accordingly */
HAWK_NDE_GRP, HAWK_NDE_GRP,
HAWK_NDE_ASS, HAWK_NDE_ASS,
@ -416,6 +416,7 @@ enum hawk_nde_type_t
HAWK_NDE_STR, HAWK_NDE_STR,
HAWK_NDE_MBS, HAWK_NDE_MBS,
HAWK_NDE_REX, HAWK_NDE_REX,
HAWK_NDE_XNIL,
HAWK_NDE_FUN, HAWK_NDE_FUN,
/* keep this order for the following items otherwise, you may have /* keep this order for the following items otherwise, you may have

View File

@ -35,6 +35,7 @@ enum hawk_kwid_t
HAWK_KWID_XINCLUDE, HAWK_KWID_XINCLUDE,
HAWK_KWID_XINCLUDE_ONCE, HAWK_KWID_XINCLUDE_ONCE,
HAWK_KWID_XLOCAL, HAWK_KWID_XLOCAL,
HAWK_KWID_XNIL,
HAWK_KWID_XPRAGMA, HAWK_KWID_XPRAGMA,
HAWK_KWID_XRESET, HAWK_KWID_XRESET,
HAWK_KWID_BEGIN, HAWK_KWID_BEGIN,

View File

@ -178,6 +178,7 @@ enum tok_t
TOK_STR, TOK_STR,
TOK_MBS, TOK_MBS,
TOK_REX, TOK_REX,
TOK_XNIL,
__TOKEN_COUNT__ __TOKEN_COUNT__
}; };
@ -281,13 +282,14 @@ struct kwent_t
static kwent_t kwtab[] = static kwent_t kwtab[] =
{ {
/* keep this table in sync with the kw_t enums in <parse.h>. /* keep this table in sync with the kw_t enums in "parse-prv.h".
* also keep it sorted by the first field for binary search */ * also keep it sorted by the first field for binary search */
{ { HAWK_T("@abort"), 6 }, TOK_XABORT, 0 }, { { HAWK_T("@abort"), 6 }, TOK_XABORT, 0 },
{ { HAWK_T("@global"), 7 }, TOK_XGLOBAL, 0 }, { { HAWK_T("@global"), 7 }, TOK_XGLOBAL, 0 },
{ { HAWK_T("@include"), 8 }, TOK_XINCLUDE, 0 }, { { HAWK_T("@include"), 8 }, TOK_XINCLUDE, 0 },
{ { HAWK_T("@include_once"), 13 }, TOK_XINCLUDE_ONCE, 0 }, { { HAWK_T("@include_once"), 13 }, TOK_XINCLUDE_ONCE, 0 },
{ { HAWK_T("@local"), 6 }, TOK_XLOCAL, 0 }, { { HAWK_T("@local"), 6 }, TOK_XLOCAL, 0 },
{ { HAWK_T("@nil"), 4 }, TOK_XNIL, 0 },
{ { HAWK_T("@pragma"), 7 }, TOK_XPRAGMA, 0 }, { { HAWK_T("@pragma"), 7 }, TOK_XPRAGMA, 0 },
{ { HAWK_T("@reset"), 6 }, TOK_XRESET, 0 }, { { HAWK_T("@reset"), 6 }, TOK_XRESET, 0 },
{ { HAWK_T("BEGIN"), 5 }, TOK_BEGIN, HAWK_PABLOCK }, { { HAWK_T("BEGIN"), 5 }, TOK_BEGIN, HAWK_PABLOCK },
@ -1566,7 +1568,7 @@ static hawk_nde_t* parse_function (hawk_t* hawk)
hawk_arr_clear (hawk->parse.params); hawk_arr_clear (hawk->parse.params);
fun = (hawk_fun_t*)hawk_callocmem(hawk, HAWK_SIZEOF(*fun)); fun = (hawk_fun_t*)hawk_callocmem(hawk, HAWK_SIZEOF(*fun));
if (fun == HAWK_NULL) if (HAWK_UNLIKELY(!fun))
{ {
ADJERR_LOC (hawk, &hawk->tok.loc); ADJERR_LOC (hawk, &hawk->tok.loc);
goto oops; goto oops;
@ -1579,7 +1581,7 @@ static hawk_nde_t* parse_function (hawk_t* hawk)
fun->body = body; fun->body = body;
pair = hawk_htb_insert(hawk->tree.funs, name.ptr, name.len, fun, 0); pair = hawk_htb_insert(hawk->tree.funs, name.ptr, name.len, fun, 0);
if (pair == HAWK_NULL) if (HAWK_UNLIKELY(!pair))
{ {
/* if hawk_htb_insert() fails for other reasons than memory /* if hawk_htb_insert() fails for other reasons than memory
* shortage, there should be implementaion errors as duplicate * shortage, there should be implementaion errors as duplicate
@ -1616,8 +1618,8 @@ static hawk_nde_t* parse_begin (hawk_t* hawk)
HAWK_ASSERT (MATCH(hawk,TOK_LBRACE)); HAWK_ASSERT (MATCH(hawk,TOK_LBRACE));
if (get_token(hawk) <= -1) return HAWK_NULL; if (get_token(hawk) <= -1) return HAWK_NULL;
nde = parse_block_dc (hawk, &xloc, 1); nde = parse_block_dc(hawk, &xloc, 1);
if (nde == HAWK_NULL) return HAWK_NULL; if (HAWK_UNLIKELY(!nde)) return HAWK_NULL;
if (hawk->tree.begin == HAWK_NULL) if (hawk->tree.begin == HAWK_NULL)
{ {
@ -1642,8 +1644,8 @@ static hawk_nde_t* parse_end (hawk_t* hawk)
HAWK_ASSERT (MATCH(hawk,TOK_LBRACE)); HAWK_ASSERT (MATCH(hawk,TOK_LBRACE));
if (get_token(hawk) <= -1) return HAWK_NULL; if (get_token(hawk) <= -1) return HAWK_NULL;
nde = parse_block_dc (hawk, &xloc, 1); nde = parse_block_dc(hawk, &xloc, 1);
if (nde == HAWK_NULL) return HAWK_NULL; if (HAWK_UNLIKELY(!nde)) return HAWK_NULL;
if (hawk->tree.end == HAWK_NULL) if (hawk->tree.end == HAWK_NULL)
{ {
@ -1658,8 +1660,7 @@ static hawk_nde_t* parse_end (hawk_t* hawk)
return nde; return nde;
} }
static hawk_chain_t* parse_action_block ( static hawk_chain_t* parse_action_block (hawk_t* hawk, hawk_nde_t* ptn, int blockless)
hawk_t* hawk, hawk_nde_t* ptn, int blockless)
{ {
hawk_nde_t* nde; hawk_nde_t* nde;
hawk_chain_t* chain; hawk_chain_t* chain;
@ -1672,11 +1673,11 @@ static hawk_chain_t* parse_action_block (
HAWK_ASSERT (MATCH(hawk,TOK_LBRACE)); HAWK_ASSERT (MATCH(hawk,TOK_LBRACE));
if (get_token(hawk) <= -1) return HAWK_NULL; if (get_token(hawk) <= -1) return HAWK_NULL;
nde = parse_block_dc(hawk, &xloc, 1); nde = parse_block_dc(hawk, &xloc, 1);
if (nde == HAWK_NULL) return HAWK_NULL; if (HAWK_UNLIKELY(!nde)) return HAWK_NULL;
} }
chain = (hawk_chain_t*)hawk_callocmem(hawk, HAWK_SIZEOF(*chain)); chain = (hawk_chain_t*)hawk_callocmem(hawk, HAWK_SIZEOF(*chain));
if (chain == HAWK_NULL) if (HAWK_UNLIKELY(!chain))
{ {
hawk_clrpt (hawk, nde); hawk_clrpt (hawk, nde);
ADJERR_LOC (hawk, &xloc); ADJERR_LOC (hawk, &xloc);
@ -1749,13 +1750,13 @@ static hawk_nde_t* parse_block (hawk_t* hawk, const hawk_loc_t* xloc, int istop)
/* @local ... */ /* @local ... */
if (get_token(hawk) <= -1) if (get_token(hawk) <= -1)
{ {
hawk_arr_delete (hawk->parse.lcls, nlcls, HAWK_ARR_SIZE(hawk->parse.lcls)-nlcls); hawk_arr_delete (hawk->parse.lcls, nlcls, HAWK_ARR_SIZE(hawk->parse.lcls) - nlcls);
return HAWK_NULL; return HAWK_NULL;
} }
if (collect_locals (hawk, nlcls, istop) == HAWK_NULL) if (collect_locals(hawk, nlcls, istop) == HAWK_NULL)
{ {
hawk_arr_delete (hawk->parse.lcls, nlcls, HAWK_ARR_SIZE(hawk->parse.lcls)-nlcls); hawk_arr_delete (hawk->parse.lcls, nlcls, HAWK_ARR_SIZE(hawk->parse.lcls) - nlcls);
return HAWK_NULL; return HAWK_NULL;
} }
} }
@ -1776,10 +1777,8 @@ static hawk_nde_t* parse_block (hawk_t* hawk, const hawk_loc_t* xloc, int istop)
/* if EOF is met before the right brace, this is an error */ /* if EOF is met before the right brace, this is an error */
if (MATCH(hawk,TOK_EOF)) if (MATCH(hawk,TOK_EOF))
{ {
hawk_arr_delete ( hawk_arr_delete (hawk->parse.lcls, nlcls, HAWK_ARR_SIZE(hawk->parse.lcls) - nlcls);
hawk->parse.lcls, nlcls, if (head) hawk_clrpt (hawk, head);
HAWK_ARR_SIZE(hawk->parse.lcls) - nlcls);
if (head != HAWK_NULL) hawk_clrpt (hawk, head);
hawk_seterrnum (hawk, &hawk->tok.loc, HAWK_EEOF); hawk_seterrnum (hawk, &hawk->tok.loc, HAWK_EEOF);
return HAWK_NULL; return HAWK_NULL;
} }
@ -1789,10 +1788,8 @@ static hawk_nde_t* parse_block (hawk_t* hawk, const hawk_loc_t* xloc, int istop)
{ {
if (get_token(hawk) <= -1) if (get_token(hawk) <= -1)
{ {
hawk_arr_delete ( hawk_arr_delete (hawk->parse.lcls, nlcls, HAWK_ARR_SIZE(hawk->parse.lcls)-nlcls);
hawk->parse.lcls, nlcls, if (head) hawk_clrpt (hawk, head);
HAWK_ARR_SIZE(hawk->parse.lcls)-nlcls);
if (head != HAWK_NULL) hawk_clrpt (hawk, head);
return HAWK_NULL; return HAWK_NULL;
} }
@ -1827,14 +1824,12 @@ static hawk_nde_t* parse_block (hawk_t* hawk, const hawk_loc_t* xloc, int istop)
{ {
hawk_loc_t sloc; hawk_loc_t sloc;
sloc = hawk->tok.loc; sloc = hawk->tok.loc;
nde = parse_statement (hawk, &sloc); nde = parse_statement(hawk, &sloc);
} }
if (HAWK_UNLIKELY(!nde)) if (HAWK_UNLIKELY(!nde))
{ {
hawk_arr_delete ( hawk_arr_delete (hawk->parse.lcls, nlcls, HAWK_ARR_SIZE(hawk->parse.lcls)-nlcls);
hawk->parse.lcls, nlcls,
HAWK_ARR_SIZE(hawk->parse.lcls)-nlcls);
if (head) hawk_clrpt (hawk, head); if (head) hawk_clrpt (hawk, head);
return HAWK_NULL; return HAWK_NULL;
} }
@ -1846,8 +1841,7 @@ static hawk_nde_t* parse_block (hawk_t* hawk, const hawk_loc_t* xloc, int istop)
hawk_clrpt (hawk, nde); hawk_clrpt (hawk, nde);
continue; continue;
} }
if (nde->type == HAWK_NDE_BLK && if (nde->type == HAWK_NDE_BLK && ((hawk_nde_blk_t*)nde)->body == HAWK_NULL)
((hawk_nde_blk_t*)nde)->body == HAWK_NULL)
{ {
hawk_clrpt (hawk, nde); hawk_clrpt (hawk, nde);
continue; continue;
@ -1871,7 +1865,7 @@ static hawk_nde_t* parse_block (hawk_t* hawk, const hawk_loc_t* xloc, int istop)
tmp = HAWK_ARR_SIZE(hawk->parse.lcls); tmp = HAWK_ARR_SIZE(hawk->parse.lcls);
if (tmp > hawk->parse.nlcls_max) hawk->parse.nlcls_max = tmp; if (tmp > hawk->parse.nlcls_max) hawk->parse.nlcls_max = tmp;
/* remove all lcls to move it up to the top level */ /* remove all lcls to move them up to the top level */
hawk_arr_delete (hawk->parse.lcls, nlcls, tmp - nlcls); hawk_arr_delete (hawk->parse.lcls, nlcls, tmp - nlcls);
/* adjust the number of lcls for a block without any statements */ /* adjust the number of lcls for a block without any statements */
@ -1904,6 +1898,7 @@ static hawk_nde_t* parse_block_dc (hawk_t* hawk, const hawk_loc_t* xloc, int ist
{ {
hawk_nde_t* nde; hawk_nde_t* nde;
/* perform the depth check before calling parse_block() */
if (hawk->opt.depth.s.block_parse > 0 && if (hawk->opt.depth.s.block_parse > 0 &&
hawk->parse.depth.block >= hawk->opt.depth.s.block_parse) hawk->parse.depth.block >= hawk->opt.depth.s.block_parse)
{ {
@ -3015,11 +3010,9 @@ static hawk_nde_t* parse_delete (hawk_t* hawk, const hawk_loc_t* xloc)
hawk_nde_type_t type; hawk_nde_type_t type;
int inparen = 0; int inparen = 0;
HAWK_ASSERT (hawk->ptok.type == TOK_DELETE || HAWK_ASSERT (hawk->ptok.type == TOK_DELETE || hawk->ptok.type == TOK_XRESET);
hawk->ptok.type == TOK_XRESET);
type = (hawk->ptok.type == TOK_DELETE)? type = (hawk->ptok.type == TOK_DELETE)? HAWK_NDE_DELETE: HAWK_NDE_RESET;
HAWK_NDE_DELETE: HAWK_NDE_RESET;
if (MATCH(hawk,TOK_LPAREN)) if (MATCH(hawk,TOK_LPAREN))
{ {
@ -3455,7 +3448,7 @@ static hawk_nde_t* parse_statement (hawk_t* hawk, const hawk_loc_t* xloc)
tloc = hawk->ptok.loc; tloc = hawk->ptok.loc;
if (get_token(hawk) <= -1) return HAWK_NULL; if (get_token(hawk) <= -1) return HAWK_NULL;
nde = parse_block_dc (hawk, &tloc, 0); nde = parse_block_dc(hawk, &tloc, 0);
} }
else else
{ {
@ -4532,8 +4525,8 @@ static hawk_nde_t* parse_increment (hawk_t* hawk, const hawk_loc_t* xloc)
} }
ploc = hawk->tok.loc; ploc = hawk->tok.loc;
left = parse_primary (hawk, &ploc); left = parse_primary(hawk, &ploc);
if (left == HAWK_NULL) return HAWK_NULL; if (HAWK_UNLIKELY(!left)) return HAWK_NULL;
/* check for postfix increment operator */ /* check for postfix increment operator */
opcode2 = MATCH(hawk,TOK_PLUSPLUS)? HAWK_INCOP_PLUS: opcode2 = MATCH(hawk,TOK_PLUSPLUS)? HAWK_INCOP_PLUS:
@ -5076,6 +5069,31 @@ oops:
return HAWK_NULL; return HAWK_NULL;
} }
static hawk_nde_t* parse_primary_xnil (hawk_t* hawk, const hawk_loc_t* xloc)
{
hawk_nde_xnil_t* nde;
nde = (hawk_nde_xnil_t*)hawk_callocmem(hawk, HAWK_SIZEOF(*nde));
if (HAWK_UNLIKELY(!nde))
{
ADJERR_LOC (hawk, xloc);
return HAWK_NULL;
}
nde->type = HAWK_NDE_XNIL;
nde->loc = *xloc;
if (get_token(hawk) <= -1) goto oops;
return (hawk_nde_t*)nde;
oops:
HAWK_ASSERT (nde != HAWK_NULL);
hawk_freemem (hawk, nde);
return HAWK_NULL;
}
static hawk_nde_t* parse_primary_nopipe (hawk_t* hawk, const hawk_loc_t* xloc) static hawk_nde_t* parse_primary_nopipe (hawk_t* hawk, const hawk_loc_t* xloc)
{ {
switch (hawk->tok.type) switch (hawk->tok.type)
@ -5111,6 +5129,10 @@ static hawk_nde_t* parse_primary_nopipe (hawk_t* hawk, const hawk_loc_t* xloc)
case TOK_GETLINE: case TOK_GETLINE:
return parse_primary_getline(hawk, xloc, 0); return parse_primary_getline(hawk, xloc, 0);
case TOK_XNIL:
return parse_primary_xnil(hawk, xloc);
default: default:
{ {
hawk_tok_t* xtok; hawk_tok_t* xtok;

View File

@ -162,6 +162,7 @@ static hawk_val_t* eval_flt (hawk_rtx_t* rtx, hawk_nde_t* nde);
static hawk_val_t* eval_str (hawk_rtx_t* rtx, hawk_nde_t* nde); static hawk_val_t* eval_str (hawk_rtx_t* rtx, hawk_nde_t* nde);
static hawk_val_t* eval_mbs (hawk_rtx_t* rtx, hawk_nde_t* nde); static hawk_val_t* eval_mbs (hawk_rtx_t* rtx, hawk_nde_t* nde);
static hawk_val_t* eval_rex (hawk_rtx_t* rtx, hawk_nde_t* nde); static hawk_val_t* eval_rex (hawk_rtx_t* rtx, hawk_nde_t* nde);
static hawk_val_t* eval_xnil (hawk_rtx_t* rtx, hawk_nde_t* nde);
static hawk_val_t* eval_fun (hawk_rtx_t* rtx, hawk_nde_t* nde); static hawk_val_t* eval_fun (hawk_rtx_t* rtx, hawk_nde_t* nde);
static hawk_val_t* eval_named (hawk_rtx_t* rtx, hawk_nde_t* nde); static hawk_val_t* eval_named (hawk_rtx_t* rtx, hawk_nde_t* nde);
static hawk_val_t* eval_gbl (hawk_rtx_t* rtx, hawk_nde_t* nde); static hawk_val_t* eval_gbl (hawk_rtx_t* rtx, hawk_nde_t* nde);
@ -3621,6 +3622,7 @@ static hawk_val_t* eval_expression0 (hawk_rtx_t* rtx, hawk_nde_t* nde)
eval_str, eval_str,
eval_mbs, eval_mbs,
eval_rex, eval_rex,
eval_xnil,
eval_fun, eval_fun,
eval_named, eval_named,
eval_gbl, eval_gbl,
@ -6892,7 +6894,7 @@ static hawk_val_t* eval_int (hawk_rtx_t* rtx, hawk_nde_t* nde)
{ {
hawk_val_t* val; hawk_val_t* val;
val = hawk_rtx_makeintval(rtx, ((hawk_nde_int_t*)nde)->val); val = hawk_rtx_makeintval(rtx, ((hawk_nde_int_t*)nde)->val);
if (val == HAWK_NULL) ADJERR_LOC (rtx, &nde->loc); if (HAWK_UNLIKELY(!val)) ADJERR_LOC (rtx, &nde->loc);
else if (HAWK_VTR_IS_POINTER(val)) ((hawk_val_int_t*)val)->nde = nde; else if (HAWK_VTR_IS_POINTER(val)) ((hawk_val_int_t*)val)->nde = nde;
return val; return val;
} }
@ -6901,7 +6903,7 @@ static hawk_val_t* eval_flt (hawk_rtx_t* rtx, hawk_nde_t* nde)
{ {
hawk_val_t* val; hawk_val_t* val;
val = hawk_rtx_makefltval(rtx, ((hawk_nde_flt_t*)nde)->val); val = hawk_rtx_makefltval(rtx, ((hawk_nde_flt_t*)nde)->val);
if (val == HAWK_NULL) ADJERR_LOC (rtx, &nde->loc); if (HAWK_UNLIKELY(!val)) ADJERR_LOC (rtx, &nde->loc);
else ((hawk_val_flt_t*)val)->nde = nde; else ((hawk_val_flt_t*)val)->nde = nde;
return val; return val;
} }
@ -6910,7 +6912,7 @@ static hawk_val_t* eval_str (hawk_rtx_t* rtx, hawk_nde_t* nde)
{ {
hawk_val_t* val; hawk_val_t* val;
val = hawk_rtx_makestrvalwithoochars(rtx, ((hawk_nde_str_t*)nde)->ptr, ((hawk_nde_str_t*)nde)->len); val = hawk_rtx_makestrvalwithoochars(rtx, ((hawk_nde_str_t*)nde)->ptr, ((hawk_nde_str_t*)nde)->len);
if (val == HAWK_NULL) ADJERR_LOC (rtx, &nde->loc); if (HAWK_UNLIKELY(!val)) ADJERR_LOC (rtx, &nde->loc);
return val; return val;
} }
@ -6918,7 +6920,7 @@ static hawk_val_t* eval_mbs (hawk_rtx_t* rtx, hawk_nde_t* nde)
{ {
hawk_val_t* val; hawk_val_t* val;
val = hawk_rtx_makembsvalwithbchars(rtx, ((hawk_nde_mbs_t*)nde)->ptr, ((hawk_nde_mbs_t*)nde)->len); val = hawk_rtx_makembsvalwithbchars(rtx, ((hawk_nde_mbs_t*)nde)->ptr, ((hawk_nde_mbs_t*)nde)->len);
if (val == HAWK_NULL) ADJERR_LOC (rtx, &nde->loc); if (HAWK_UNLIKELY(!val)) ADJERR_LOC (rtx, &nde->loc);
return val; return val;
} }
@ -6926,7 +6928,15 @@ static hawk_val_t* eval_rex (hawk_rtx_t* rtx, hawk_nde_t* nde)
{ {
hawk_val_t* val; hawk_val_t* val;
val = hawk_rtx_makerexval(rtx, &((hawk_nde_rex_t*)nde)->str, ((hawk_nde_rex_t*)nde)->code); val = hawk_rtx_makerexval(rtx, &((hawk_nde_rex_t*)nde)->str, ((hawk_nde_rex_t*)nde)->code);
if (val == HAWK_NULL) ADJERR_LOC (rtx, &nde->loc); if (HAWK_UNLIKELY(!val)) ADJERR_LOC (rtx, &nde->loc);
return val;
}
static hawk_val_t* eval_xnil (hawk_rtx_t* rtx, hawk_nde_t* nde)
{
hawk_val_t* val;
val = hawk_rtx_makenilval(rtx);
if (HAWK_UNLIKELY(!val)) ADJERR_LOC (rtx, &nde->loc);
return val; return val;
} }
@ -6958,7 +6968,7 @@ static hawk_val_t* eval_fun (hawk_rtx_t* rtx, hawk_nde_t* nde)
} }
val = hawk_rtx_makefunval(rtx, fun); val = hawk_rtx_makefunval(rtx, fun);
if (!val) ADJERR_LOC (rtx, &nde->loc); if (HAWK_UNLIKELY(!val)) ADJERR_LOC (rtx, &nde->loc);
return val; return val;
} }

View File

@ -63,6 +63,7 @@ typedef struct hawk_nde_str_t hawk_nde_str_t;
typedef struct hawk_nde_mbs_t hawk_nde_mbs_t; typedef struct hawk_nde_mbs_t hawk_nde_mbs_t;
typedef struct hawk_nde_rex_t hawk_nde_rex_t; typedef struct hawk_nde_rex_t hawk_nde_rex_t;
typedef struct hawk_nde_fun_t hawk_nde_fun_t; typedef struct hawk_nde_fun_t hawk_nde_fun_t;
typedef struct hawk_nde_xnil_t hawk_nde_xnil_t;
typedef struct hawk_nde_var_t hawk_nde_var_t; typedef struct hawk_nde_var_t hawk_nde_var_t;
typedef struct hawk_nde_fncall_t hawk_nde_fncall_t; typedef struct hawk_nde_fncall_t hawk_nde_fncall_t;
@ -174,6 +175,11 @@ struct hawk_nde_rex_t
hawk_tre_t* code[2]; /* [0]: case sensitive, [1]: case insensitive */ hawk_tre_t* code[2]; /* [0]: case sensitive, [1]: case insensitive */
}; };
struct hawk_nde_xnil_t
{
HAWK_NDE_HDR;
};
/* HAWK_NDE_FUN - function as a value */ /* HAWK_NDE_FUN - function as a value */
struct hawk_nde_fun_t struct hawk_nde_fun_t
{ {

View File

@ -498,6 +498,12 @@ static int print_expr (hawk_t* hawk, hawk_nde_t* nde)
break; break;
} }
case HAWK_NDE_XNIL:
{
PUT_SRCSTR (hawk, HAWK_T("@nil"));
break;
}
case HAWK_NDE_FUN: case HAWK_NDE_FUN:
{ {
PUT_SRCSTRN (hawk, PUT_SRCSTRN (hawk,
@ -715,9 +721,7 @@ static int print_expr (hawk_t* hawk, hawk_nde_t* nde)
PUT_SRCSTR (hawk, HAWK_T("(")); PUT_SRCSTR (hawk, HAWK_T("("));
if (px->in != HAWK_NULL && if (px->in && (px->in_type == HAWK_IN_PIPE || px->in_type == HAWK_IN_RWPIPE))
(px->in_type == HAWK_IN_PIPE ||
px->in_type == HAWK_IN_RWPIPE))
{ {
PRINT_EXPR (hawk, px->in); PRINT_EXPR (hawk, px->in);
PUT_SRCSTR (hawk, HAWK_T(" ")); PUT_SRCSTR (hawk, HAWK_T(" "));
@ -727,14 +731,13 @@ static int print_expr (hawk_t* hawk, hawk_nde_t* nde)
hawk_getkwname (hawk, (px->mbs? HAWK_KWID_GETBLINE: HAWK_KWID_GETLINE), &kw); hawk_getkwname (hawk, (px->mbs? HAWK_KWID_GETBLINE: HAWK_KWID_GETLINE), &kw);
PUT_SRCSTRN (hawk, kw.ptr, kw.len); PUT_SRCSTRN (hawk, kw.ptr, kw.len);
if (px->var != HAWK_NULL) if (px->var)
{ {
PUT_SRCSTR (hawk, HAWK_T(" ")); PUT_SRCSTR (hawk, HAWK_T(" "));
PRINT_EXPR (hawk, px->var); PRINT_EXPR (hawk, px->var);
} }
if (px->in != HAWK_NULL && if (px->in && px->in_type == HAWK_IN_FILE)
px->in_type == HAWK_IN_FILE)
{ {
PUT_SRCSTR (hawk, HAWK_T(" ")); PUT_SRCSTR (hawk, HAWK_T(" "));
PUT_SRCSTR (hawk, getline_inop_str[px->in_type]); PUT_SRCSTR (hawk, getline_inop_str[px->in_type]);
@ -750,7 +753,7 @@ static int print_expr (hawk_t* hawk, hawk_nde_t* nde)
case HAWK_NDE_PRINTF: case HAWK_NDE_PRINTF:
{ {
PUT_SRCSTR (hawk, HAWK_T("(")); PUT_SRCSTR (hawk, HAWK_T("("));
if (print_printx (hawk, (hawk_nde_print_t*)nde) <= -1) return -1; if (print_printx(hawk, (hawk_nde_print_t*)nde) <= -1) return -1;
PUT_SRCSTR (hawk, HAWK_T(")")); PUT_SRCSTR (hawk, HAWK_T(")"));
break; break;
} }
@ -1385,6 +1388,12 @@ void hawk_clrpt (hawk_t* hawk, hawk_nde_t* tree)
break; break;
} }
case HAWK_NDE_XNIL:
{
hawk_freemem (hawk, p);
break;
}
case HAWK_NDE_FUN: case HAWK_NDE_FUN:
{ {
hawk_freemem (hawk, ((hawk_nde_fun_t*)p)->name.ptr); hawk_freemem (hawk, ((hawk_nde_fun_t*)p)->name.ptr);

View File

@ -244,7 +244,7 @@ function main()
{ {
@local bool, b, c; @local bool, b, c;
@reset(c); c = @nil;
bool = ((b = 1) in c); bool = ((b = 1) in c);
ensure (bool, 0, @SCRIPTNAME, @SCRIPTLINE); ensure (bool, 0, @SCRIPTNAME, @SCRIPTLINE);
ensure (b, 1, @SCRIPTNAME, @SCRIPTLINE); ensure (b, 1, @SCRIPTNAME, @SCRIPTLINE);