diff --git a/lib/comp.c b/lib/comp.c index 56aace9..f2a4328 100644 --- a/lib/comp.c +++ b/lib/comp.c @@ -406,7 +406,8 @@ static int find_variable_backward_with_word (hak_t* hak, const hak_oocs_t* name, { /* instance variables are accessible only in an instance method defintion scope. * it is in class initialization scope */ - hak_setsynerrbfmt(hak, HAK_SYNERR_BANNED, loc, HAK_NULL, "prohibited access to instance variable around '%.*js'", name->len, name->ptr); + hak_setsynerrbfmt(hak, HAK_SYNERR_BANNED, loc, HAK_NULL, + "prohibited access to instance variable around '%.*js'", name->len, name->ptr); return -1; } @@ -416,7 +417,9 @@ static int find_variable_backward_with_word (hak_t* hak, const hak_oocs_t* name, if ((hak->c->funblk.info[--fi].fun_type & 0xFF) == FUN_CM) { /* the function where this variable is defined is a class method or an plain function block within a class method*/ - hak_setsynerrbfmt(hak, HAK_SYNERR_BANNED, loc, HAK_NULL, "prohibited access to instance variable in class method context around '%.*js'", name->len, name->ptr); + hak_setsynerrbfmt(hak, HAK_SYNERR_BANNED, loc, HAK_NULL, + "prohibited access to instance variable in class method context around '%.*js'", + name->len, name->ptr); return -1; } @@ -1726,7 +1729,8 @@ static int check_if_plain_cnode (hak_t* hak, hak_cnode_t* obj, hak_cnode_t* prev { if (!obj) { - hak_setsynerrbfmt(hak, errnum, HAK_CNODE_GET_LOC(prev), HAK_NULL, "no %hs in %.*js", bname, HAK_CNODE_GET_TOKLEN(container), HAK_CNODE_GET_TOKPTR(container)); + hak_setsynerrbfmt(hak, errnum, HAK_CNODE_GET_LOC(prev), HAK_NULL, + "no %hs in %.*js", bname, HAK_CNODE_GET_TOKLEN(container), HAK_CNODE_GET_TOKPTR(container)); return -1; } else if (!HAK_CNODE_IS_CONS(obj)) @@ -1931,12 +1935,13 @@ static int compile_or (hak_t* hak, hak_cnode_t* src) if (!obj) { /* no value */ - hak_setsynerrbfmt(hak, HAK_SYNERR_ARGCOUNT, HAK_CNODE_GET_LOC(src), HAK_NULL, "no expression specified in or"); + hak_setsynerrbfmt(hak, HAK_SYNERR_ARGCOUNT, HAK_CNODE_GET_LOC(src), HAK_NULL, "no expression specified in 'or'"); return -1; } else if (!HAK_CNODE_IS_CONS(obj)) { - hak_setsynerrbfmt(hak, HAK_SYNERR_DOTBANNED, HAK_CNODE_GET_LOC(obj), HAK_CNODE_GET_TOK(obj), "redundant cdr in and"); + hak_setsynerrbfmt(hak, HAK_SYNERR_DOTBANNED, HAK_CNODE_GET_LOC(obj), HAK_NULL, + "redundant cdr in 'or' around '%.*js'", HAK_CNODE_GET_TOKLEN(obj), HAK_CNODE_GET_TOKPTR(obj)); return -1; } @@ -1966,7 +1971,8 @@ static HAK_INLINE int compile_or_p1 (hak_t* hak) obj = cf->operand; if (!HAK_CNODE_IS_CONS(obj)) { - hak_setsynerrbfmt(hak, HAK_SYNERR_DOTBANNED, HAK_CNODE_GET_LOC(obj), HAK_CNODE_GET_TOK(obj), "redundant cdr in or"); + hak_setsynerrbfmt(hak, HAK_SYNERR_DOTBANNED, HAK_CNODE_GET_LOC(obj), HAK_NULL, + "redundant cdr in 'or' around '%.*js'", HAK_CNODE_GET_TOKLEN(obj), HAK_CNODE_GET_TOKPTR(obj)); return -1; } @@ -2032,7 +2038,8 @@ static int compile_plus (hak_t* hak, hak_cnode_t* src) } else if (!HAK_CNODE_IS_CONS(obj)) { - hak_setsynerrbfmt(hak, HAK_SYNERR_DOTBANNED, HAK_CNODE_GET_LOC(obj), HAK_CNODE_GET_TOK(obj), "redundant cdr in plus"); + hak_setsynerrbfmt(hak, HAK_SYNERR_DOTBANNED, HAK_CNODE_GET_LOC(obj), HAK_NULL, + "redundant cdr in plus around '%.*js'", HAK_CNODE_GET_TOKLEN(obj), HAK_CNODE_GET_TOKPTR(obj)); return -1; } @@ -2048,7 +2055,8 @@ static int compile_plus (hak_t* hak, hak_cnode_t* src) } else if (!HAK_CNODE_IS_CONS(obj)) { - hak_setsynerrbfmt(hak, HAK_SYNERR_DOTBANNED, HAK_CNODE_GET_LOC(obj), HAK_CNODE_GET_TOK(obj), "redundant cdr in plus"); + hak_setsynerrbfmt(hak, HAK_SYNERR_DOTBANNED, HAK_CNODE_GET_LOC(obj), HAK_NULL, + "redundant cdr in plus around '%.*js", HAK_CNODE_GET_TOKLEN(obj), HAK_CNODE_GET_TOKPTR(obj)); return -1; } @@ -2057,7 +2065,8 @@ static int compile_plus (hak_t* hak, hak_cnode_t* src) if (obj) { - hak_setsynerrbfmt(hak, HAK_SYNERR_DOTBANNED, HAK_CNODE_GET_LOC(obj), HAK_CNODE_GET_TOK(obj), "redundant cdr in plus"); + hak_setsynerrbfmt(hak, HAK_SYNERR_DOTBANNED, HAK_CNODE_GET_LOC(obj), HAK_NULL, + "redundant cdr in plus around '%.*js", HAK_CNODE_GET_TOKLEN(obj), HAK_CNODE_GET_TOKPTR(obj)); return -1; } @@ -2098,11 +2107,15 @@ static int compile_break (hak_t* hak, hak_cnode_t* src) { if (HAK_CNODE_IS_CONS(obj)) { - hak_setsynerrbfmt(hak, HAK_SYNERR_ARGCOUNT, HAK_CNODE_GET_LOC(obj), HAK_NULL, "redundant argument in %.*js", HAK_CNODE_GET_TOKLEN(cmd), HAK_CNODE_GET_TOKPTR(cmd)); + hak_setsynerrbfmt(hak, HAK_SYNERR_ARGCOUNT, HAK_CNODE_GET_LOC(obj), HAK_NULL, + "redundant argument in %.*js", HAK_CNODE_GET_TOKLEN(cmd), HAK_CNODE_GET_TOKPTR(cmd)); } else { - hak_setsynerrbfmt(hak, HAK_SYNERR_DOTBANNED, HAK_CNODE_GET_LOC(obj), HAK_CNODE_GET_TOK(obj), "redundant cdr in %.*js", HAK_CNODE_GET_TOKLEN(cmd), HAK_CNODE_GET_TOKPTR(cmd)); + hak_setsynerrbfmt(hak, HAK_SYNERR_DOTBANNED, HAK_CNODE_GET_LOC(obj), HAK_NULL, + "redundant cdr in %.*js around '%.*js'", + HAK_CNODE_GET_TOKLEN(cmd), HAK_CNODE_GET_TOKPTR(cmd), + HAK_CNODE_GET_TOKLEN(obj), HAK_CNODE_GET_TOKPTR(obj)); } return -1; } @@ -2126,8 +2139,7 @@ static int compile_break (hak_t* hak, hak_cnode_t* src) } } - hak_setsynerrbfmt( - hak, HAK_SYNERR_BREAK, HAK_CNODE_GET_LOC(src), HAK_NULL, + hak_setsynerrbfmt(hak, HAK_SYNERR_BREAK, HAK_CNODE_GET_LOC(src), HAK_NULL, "%.*js outside loop", HAK_CNODE_GET_TOKLEN(cmd), HAK_CNODE_GET_TOKPTR(cmd)); return -1; @@ -2166,8 +2178,7 @@ inside_loop: /* this part must no be reached. if a loop control block is found, * there must exist a COP_POST_UNTIL_BODY or COP_POST_WHILE_BODY frame */ - hak_setsynerrbfmt( - hak, HAK_SYNERR_INTERN, HAK_CNODE_GET_LOC(src), HAK_NULL, + hak_setsynerrbfmt(hak, HAK_SYNERR_INTERN, HAK_CNODE_GET_LOC(src), HAK_NULL, "internal error in compiling %.*js", HAK_CNODE_GET_TOKLEN(cmd), HAK_CNODE_GET_TOKPTR(cmd)); return -1; } @@ -2213,11 +2224,15 @@ static int compile_continue (hak_t* hak, hak_cnode_t* src) { if (HAK_CNODE_IS_CONS(obj)) { - hak_setsynerrbfmt(hak, HAK_SYNERR_ARGCOUNT, HAK_CNODE_GET_LOC(obj), HAK_NULL, "redundant argument in %.*js", HAK_CNODE_GET_TOKLEN(cmd), HAK_CNODE_GET_TOKPTR(cmd)); + hak_setsynerrbfmt(hak, HAK_SYNERR_ARGCOUNT, HAK_CNODE_GET_LOC(obj), HAK_NULL, + "redundant argument in %.*js", HAK_CNODE_GET_TOKLEN(cmd), HAK_CNODE_GET_TOKPTR(cmd)); } else { - hak_setsynerrbfmt(hak, HAK_SYNERR_DOTBANNED, HAK_CNODE_GET_LOC(obj), HAK_CNODE_GET_TOK(obj), "redundant cdr in %.*js", HAK_CNODE_GET_TOKLEN(cmd), HAK_CNODE_GET_TOKPTR(cmd)); + hak_setsynerrbfmt(hak, HAK_SYNERR_DOTBANNED, HAK_CNODE_GET_LOC(obj), HAK_NULL, + "redundant cdr in %.*js around %.*js", + HAK_CNODE_GET_TOKLEN(cmd), HAK_CNODE_GET_TOKPTR(cmd), + HAK_CNODE_GET_TOKLEN(obj), HAK_CNODE_GET_TOKPTR(obj)); } return -1; } @@ -2301,9 +2316,10 @@ static int compile_expression_block (hak_t* hak, hak_cnode_t* src, const hak_bch obj = HAK_CNODE_CONS_CDR(src); /* expression list after it */ if (obj && !HAK_CNODE_IS_CONS(obj)) { - hak_setsynerrbfmt( - hak, HAK_SYNERR_DOTBANNED, HAK_CNODE_GET_LOC(obj), HAK_CNODE_GET_TOK(obj), - "redundant cdr in %.*js", HAK_CNODE_GET_TOKLEN(cmd), HAK_CNODE_GET_TOKPTR(cmd)); + hak_setsynerrbfmt(hak, HAK_SYNERR_DOTBANNED, HAK_CNODE_GET_LOC(obj), HAK_NULL, + "redundant cdr in %.*js around %.*js", + HAK_CNODE_GET_TOKLEN(cmd), HAK_CNODE_GET_TOKPTR(cmd), + HAK_CNODE_GET_TOKLEN(obj), HAK_CNODE_GET_TOKPTR(obj)); return -1; } } @@ -2312,8 +2328,7 @@ static int compile_expression_block (hak_t* hak, hak_cnode_t* src, const hak_bch { if (is_in_class_init_scope(hak)) { - hak_setsynerrbfmt( - hak, HAK_SYNERR_VARDCLBANNED, HAK_CNODE_GET_LOC(obj), HAK_NULL, + hak_setsynerrbfmt(hak, HAK_SYNERR_VARDCLBANNED, HAK_CNODE_GET_LOC(obj), HAK_NULL, "variable declaration disallowed in class init scope"); return -1; } @@ -2461,12 +2476,16 @@ static int compile_if (hak_t* hak, hak_cnode_t* src) if (!obj) { /* no value */ - hak_setsynerrbfmt(hak, HAK_SYNERR_ARGCOUNT, HAK_CNODE_GET_LOC(src), HAK_NULL, "no conditional expression after '%.*js'", HAK_CNODE_GET_TOKLEN(cmd), HAK_CNODE_GET_TOKPTR(cmd)); + hak_setsynerrbfmt(hak, HAK_SYNERR_ARGCOUNT, HAK_CNODE_GET_LOC(src), HAK_NULL, + "no conditional expression after '%.*js'", HAK_CNODE_GET_TOKLEN(cmd), HAK_CNODE_GET_TOKPTR(cmd)); return -1; } else if (!HAK_CNODE_IS_CONS(obj)) { - hak_setsynerrbfmt(hak, HAK_SYNERR_DOTBANNED, HAK_CNODE_GET_LOC(obj), HAK_CNODE_GET_TOK(obj), "redundant cdr in %.*js", HAK_CNODE_GET_TOKLEN(cmd), HAK_CNODE_GET_TOKPTR(cmd)); + hak_setsynerrbfmt(hak, HAK_SYNERR_DOTBANNED, HAK_CNODE_GET_LOC(obj), HAK_NULL, + "redundant cdr in %.*js around %.*js", + HAK_CNODE_GET_TOKLEN(cmd), HAK_CNODE_GET_TOKPTR(cmd), + HAK_CNODE_GET_TOKLEN(obj), HAK_CNODE_GET_TOKPTR(obj)); return -1; } @@ -2562,12 +2581,16 @@ static HAK_INLINE int compile_elif (hak_t* hak) if (!obj) { /* no value */ - hak_setsynerrbfmt(hak, HAK_SYNERR_ARGCOUNT, HAK_CNODE_GET_LOC(src), HAK_NULL, "no conditional expression after '%.*js'", HAK_CNODE_GET_TOKLEN(cmd), HAK_CNODE_GET_TOKPTR(cmd)); + hak_setsynerrbfmt(hak, HAK_SYNERR_ARGCOUNT, HAK_CNODE_GET_LOC(src), HAK_NULL, + "no conditional expression after '%.*js'", HAK_CNODE_GET_TOKLEN(cmd), HAK_CNODE_GET_TOKPTR(cmd)); return -1; } else if (!HAK_CNODE_IS_CONS(obj)) { - hak_setsynerrbfmt(hak, HAK_SYNERR_DOTBANNED, HAK_CNODE_GET_LOC(obj), HAK_CNODE_GET_TOK(obj), "redundant cdr in %.*js", HAK_CNODE_GET_TOKLEN(cmd), HAK_CNODE_GET_TOKPTR(cmd)); + hak_setsynerrbfmt(hak, HAK_SYNERR_DOTBANNED, HAK_CNODE_GET_LOC(obj), HAK_NULL, + "redundant cdr in %.*js around %.*js", + HAK_CNODE_GET_TOKLEN(cmd), HAK_CNODE_GET_TOKPTR(cmd), + HAK_CNODE_GET_TOKLEN(obj), HAK_CNODE_GET_TOKPTR(obj)); return -1; } @@ -2602,7 +2625,10 @@ static HAK_INLINE int compile_else (hak_t* hak) if (obj && !HAK_CNODE_IS_CONS(obj)) { - hak_setsynerrbfmt(hak, HAK_SYNERR_DOTBANNED, HAK_CNODE_GET_LOC(obj), HAK_CNODE_GET_TOK(obj), "redundant cdr in %.*js", HAK_CNODE_GET_TOKLEN(cmd), HAK_CNODE_GET_TOKPTR(cmd)); + hak_setsynerrbfmt(hak, HAK_SYNERR_DOTBANNED, HAK_CNODE_GET_LOC(obj), HAK_NULL, + "redundant cdr in %.*js around %.*js", + HAK_CNODE_GET_TOKLEN(cmd), HAK_CNODE_GET_TOKPTR(cmd), + HAK_CNODE_GET_TOKLEN(obj), HAK_CNODE_GET_TOKPTR(obj)); return -1; } @@ -3629,8 +3655,10 @@ static int compile_fun (hak_t* hak, hak_cnode_t* src) if (!HAK_CNODE_IS_CONS(dcl)) { - hak_setsynerrbfmt(hak, HAK_SYNERR_DOTBANNED, HAK_CNODE_GET_LOC(dcl), HAK_CNODE_GET_TOK(dcl), - "redundant cdr in argument list in %.*js", HAK_CNODE_GET_TOKLEN(cmd), HAK_CNODE_GET_TOKPTR(cmd)); + hak_setsynerrbfmt(hak, HAK_SYNERR_DOTBANNED, HAK_CNODE_GET_LOC(dcl), HAK_NULL, + "redundant cdr in argument list in %.*js around %.*js", + HAK_CNODE_GET_TOKLEN(cmd), HAK_CNODE_GET_TOKPTR(cmd), + HAK_CNODE_GET_TOKLEN(dcl), HAK_CNODE_GET_TOKPTR(dcl)); return -1; } } @@ -4024,13 +4052,17 @@ static int compile_return (hak_t* hak, hak_cnode_t* src, int ret_from_home) /* TODO: should i allow (return)? does it return the last value on the stack? */ /* no value */ hak_cnode_t* tmp = HAK_CNODE_CONS_CAR(src); - hak_setsynerrbfmt(hak, HAK_SYNERR_ARGCOUNT, HAK_CNODE_GET_LOC(src), HAK_NULL, "no value specified in %.*js", HAK_CNODE_GET_TOKLEN(tmp), HAK_CNODE_GET_TOKPTR(tmp)); + hak_setsynerrbfmt(hak, HAK_SYNERR_ARGCOUNT, HAK_CNODE_GET_LOC(src), HAK_NULL, + "no value specified in %.*js", HAK_CNODE_GET_TOKLEN(tmp), HAK_CNODE_GET_TOKPTR(tmp)); return -1; } else if (!HAK_CNODE_IS_CONS(obj)) { hak_cnode_t* tmp = HAK_CNODE_CONS_CAR(src); - hak_setsynerrbfmt(hak, HAK_SYNERR_DOTBANNED, HAK_CNODE_GET_LOC(obj), HAK_CNODE_GET_TOK(obj), "redundant cdr in %.*js", HAK_CNODE_GET_TOKLEN(tmp), HAK_CNODE_GET_TOKPTR(tmp)); + hak_setsynerrbfmt(hak, HAK_SYNERR_DOTBANNED, HAK_CNODE_GET_LOC(obj), HAK_NULL, + "redundant cdr in %.*js around %.*js", + HAK_CNODE_GET_TOKLEN(tmp), HAK_CNODE_GET_TOKPTR(tmp), + HAK_CNODE_GET_TOKLEN(obj), HAK_CNODE_GET_TOKPTR(obj)); return -1; } @@ -4040,7 +4072,11 @@ static int compile_return (hak_t* hak, hak_cnode_t* src, int ret_from_home) if (obj) { hak_cnode_t* tmp = HAK_CNODE_CONS_CAR(src); - hak_setsynerrbfmt(hak, HAK_SYNERR_ARGCOUNT, HAK_CNODE_GET_LOC(obj), HAK_CNODE_GET_TOK(obj), "more than 1 argument in %.*js", HAK_CNODE_GET_TOKLEN(tmp), HAK_CNODE_GET_TOKPTR(tmp)); + hak_cnode_t* next = HAK_CNODE_CONS_CAR(obj); + hak_setsynerrbfmt(hak, HAK_SYNERR_ARGCOUNT, HAK_CNODE_GET_LOC(obj), HAK_NULL, + "excessive argument to '%.*js' around '%.*js'", + HAK_CNODE_GET_TOKLEN(tmp), HAK_CNODE_GET_TOKPTR(tmp), + HAK_CNODE_GET_TOKLEN(next), HAK_CNODE_GET_TOKPTR(next)); return -1; } @@ -4069,19 +4105,26 @@ static int compile_set (hak_t* hak, hak_cnode_t* src) if (!obj) { - hak_setsynerrbfmt(hak, HAK_SYNERR_VARNAME, HAK_CNODE_GET_LOC(src), HAK_NULL, "no variable name in %.*js", HAK_CNODE_GET_TOKLEN(cmd), HAK_CNODE_GET_TOKPTR(cmd)); + hak_setsynerrbfmt(hak, HAK_SYNERR_VARNAME, HAK_CNODE_GET_LOC(src), HAK_NULL, + "no variable name in %.*js", HAK_CNODE_GET_TOKLEN(cmd), HAK_CNODE_GET_TOKPTR(cmd)); return -1; } else if (!HAK_CNODE_IS_CONS(obj)) { - hak_setsynerrbfmt(hak, HAK_SYNERR_DOTBANNED, HAK_CNODE_GET_LOC(obj), HAK_CNODE_GET_TOK(obj), "redundant cdr in %.*js", HAK_CNODE_GET_TOKLEN(cmd), HAK_CNODE_GET_TOKPTR(cmd)); + hak_setsynerrbfmt(hak, HAK_SYNERR_DOTBANNED, HAK_CNODE_GET_LOC(obj), HAK_NULL, + "redundant cdr in %.*js around %.*js", + HAK_CNODE_GET_TOKLEN(cmd), HAK_CNODE_GET_TOKPTR(cmd), + HAK_CNODE_GET_TOKLEN(obj), HAK_CNODE_GET_TOKPTR(obj)); return -1; } var = HAK_CNODE_CONS_CAR(obj); if (!HAK_CNODE_IS_SYMBOL(var) && !HAK_CNODE_IS_DSYMBOL_CLA(var)) { - hak_setsynerrbfmt(hak, HAK_SYNERR_VARNAME, HAK_CNODE_GET_LOC(var), HAK_CNODE_GET_TOK(var), "variable name not symbol in %.*js", HAK_CNODE_GET_TOKLEN(cmd), HAK_CNODE_GET_TOKPTR(cmd)); + hak_setsynerrbfmt(hak, HAK_SYNERR_VARNAME, HAK_CNODE_GET_LOC(var), HAK_NULL, + "variable name not symbol in %.*js around %.*js", + HAK_CNODE_GET_TOKLEN(cmd), HAK_CNODE_GET_TOKPTR(cmd), + HAK_CNODE_GET_TOKLEN(var), HAK_CNODE_GET_TOKPTR(var)); return -1; } @@ -4097,7 +4140,10 @@ static int compile_set (hak_t* hak, hak_cnode_t* src) } else if (!HAK_CNODE_IS_CONS(obj)) { - hak_setsynerrbfmt(hak, HAK_SYNERR_DOTBANNED, HAK_CNODE_GET_LOC(obj), HAK_CNODE_GET_TOK(obj), "redundant cdr in %.*js", HAK_CNODE_GET_TOKLEN(cmd), HAK_CNODE_GET_TOKPTR(cmd)); + hak_setsynerrbfmt(hak, HAK_SYNERR_DOTBANNED, HAK_CNODE_GET_LOC(obj), HAK_NULL, + "redundant cdr in %.*js around %.*js", + HAK_CNODE_GET_TOKLEN(cmd), HAK_CNODE_GET_TOKPTR(cmd), + HAK_CNODE_GET_TOKLEN(obj), HAK_CNODE_GET_TOKPTR(obj)); return -1; } @@ -4106,7 +4152,11 @@ static int compile_set (hak_t* hak, hak_cnode_t* src) obj = HAK_CNODE_CONS_CDR(obj); if (obj) { - hak_setsynerrbfmt(hak, HAK_SYNERR_ARGCOUNT, HAK_CNODE_GET_LOC(obj), HAK_CNODE_GET_TOK(obj), "too many arguments to %.*js", HAK_CNODE_GET_TOKLEN(cmd), HAK_CNODE_GET_TOKPTR(cmd)); + hak_cnode_t* next = HAK_CNODE_CONS_CAR(obj); + hak_setsynerrbfmt(hak, HAK_SYNERR_ARGCOUNT, HAK_CNODE_GET_LOC(obj), HAK_NULL, + "too many arguments to '%.*js' around '%.*js'", + HAK_CNODE_GET_TOKLEN(cmd), HAK_CNODE_GET_TOKPTR(cmd), + HAK_CNODE_GET_TOKLEN(next), HAK_CNODE_GET_TOKPTR(next)); return -1; } @@ -4119,7 +4169,9 @@ static int compile_set (hak_t* hak, hak_cnode_t* src) { if (HAK_CNODE_IS_DSYMBOL_CLA(var)) { - hak_setsynerrbfmt(hak, HAK_SYNERR_VARNAMEUNKNOWN, HAK_CNODE_GET_LOC(var), HAK_CNODE_GET_TOK(var), "unknown class-level variable name", HAK_CNODE_GET_TOKLEN(var), HAK_CNODE_GET_TOKPTR(var)); + hak_setsynerrbfmt(hak, HAK_SYNERR_VARNAMEUNKNOWN, HAK_CNODE_GET_LOC(var), HAK_NULL, + "unknown class-level variable name '%.*js'", + HAK_CNODE_GET_TOKLEN(var), HAK_CNODE_GET_TOKPTR(var)); return -1; } diff --git a/lib/err.c b/lib/err.c index 5e7ac82..5bd9ddd 100644 --- a/lib/err.c +++ b/lib/err.c @@ -699,7 +699,7 @@ void hak_getsynerru (hak_t* hak, hak_synerru_t* synerr) if (s->loc.file) { wcslen = HAK_COUNTOF(hak->errmsg.xerrlocfile); - hak_conv_bcstr_to_ucstr_with_cmgr(s->loc.file, &mbslen, hak->errmsg.xerrlocfile, &wcslen, hak->_cmgr); + hak_conv_bcstr_to_ucstr_with_cmgr(s->loc.file, &mbslen, hak->errmsg.xerrlocfile, &wcslen, hak->_cmgr, 1); synerr->loc.file = hak->errmsg.xerrlocfile; /* this can be truncated and is transient */ } #endif diff --git a/lib/read.c b/lib/read.c index b55b11b..2461c1c 100644 --- a/lib/read.c +++ b/lib/read.c @@ -2027,13 +2027,15 @@ static int feed_process_token (hak_t* hak) { /* the auto-created xlist can't be terminated with the regular closing symbol * it must end with the semicolon */ - hak_setsynerr(hak, HAK_SYNERR_UNBALPBB, TOKEN_LOC(hak), TOKEN_NAME(hak)); + hak_setsynerrbfmt(hak, HAK_SYNERR_UNBALPBB, TOKEN_LOC(hak), HAK_NULL, + "unbalanced parenthesis/brace/bracket around '%.*js'", TOKEN_NAME_LEN(hak), TOKEN_NAME_PTR(hak)); goto oops; } if (cons_info[concode].closer != TOKEN_TYPE(hak)) { - hak_setsynerr(hak, cons_info[concode].synerr, TOKEN_LOC(hak), TOKEN_NAME(hak)); + hak_setsynerrbfmt(hak, cons_info[concode].synerr, TOKEN_LOC(hak), HAK_NULL, + "invalid closer token around '%.*js'", TOKEN_NAME_LEN(hak), TOKEN_NAME_PTR(hak)); goto oops; } #if 0 @@ -2056,7 +2058,7 @@ static int feed_process_token (hak_t* hak) * with no opening(left) parenthesis, which is * indicated by frd->level<=0. */ - hak_setsynerr(hak, HAK_SYNERR_LPAREN, TOKEN_LOC(hak), TOKEN_NAME(hak)); + hak_setsynerrbfmt(hak, HAK_SYNERR_LPAREN, TOKEN_LOC(hak), HAK_NULL, "( expected around '%.*js'", TOKEN_NAME_LEN(hak), TOKEN_NAME_PTR(hak)); goto oops; } #endif @@ -2114,22 +2116,29 @@ static int feed_process_token (hak_t* hak) frd->obj = hak_makecnodedblcolons(hak, 0, TOKEN_LOC(hak), TOKEN_NAME(hak)); goto auto_xlist; - case HAK_TOK_SMPTRLIT: + case HAK_TOK_SMPTRLIT: /* 0pXXXX */ { hak_oow_t i; hak_oow_t v = 0; + hak_ooch_t tc; - /* 0pNNNN */ HAK_ASSERT(hak, TOKEN_NAME_LEN(hak) >= 3); + + tc = TOKEN_NAME_CHAR(hak, 0); + if (tc != '0') goto illegal_smptr_literal; /* most likely + or - */ + for (i = 2; i < TOKEN_NAME_LEN(hak); i++) { - HAK_ASSERT(hak, is_xdigit_char(TOKEN_NAME_CHAR(hak, i))); - v = v * 16 + HAK_CHAR_TO_NUM(TOKEN_NAME_CHAR(hak, i), 16); + tc = TOKEN_NAME_CHAR(hak, i); + HAK_ASSERT(hak, is_xdigit_char(tc)); + v = v * 16 + HAK_CHAR_TO_NUM(tc, 16); } if (!HAK_IN_SMPTR_RANGE(v)) { - hak_setsynerr(hak, HAK_SYNERR_SMPTRLIT, TOKEN_LOC(hak), TOKEN_NAME(hak)); + illegal_smptr_literal: + hak_setsynerrbfmt(hak, HAK_SYNERR_SMPTRLIT, TOKEN_LOC(hak), HAK_NULL, + "illegal smptr literal '%.*js'", TOKEN_NAME_LEN(hak), TOKEN_NAME_PTR(hak)); goto oops; } @@ -2137,20 +2146,28 @@ static int feed_process_token (hak_t* hak) goto auto_xlist; } - case HAK_TOK_ERRLIT: + case HAK_TOK_ERRLIT: /* 0eNNNN */ { hak_oow_t i; hak_ooi_t v = 0; + hak_ooch_t tc; HAK_ASSERT(hak, TOKEN_NAME_LEN(hak) >= 3); + + tc = TOKEN_NAME_CHAR(hak, 0); + if (tc != '0') goto illegal_error_literal; /* most likely + or - */ + for (i = 2; i < TOKEN_NAME_LEN(hak); i++) { - HAK_ASSERT(hak, is_digit_char(TOKEN_NAME_CHAR(hak, i))); - v = v * 10 + HAK_CHAR_TO_NUM(TOKEN_NAME_CHAR(hak, i), 10); + tc = TOKEN_NAME_CHAR(hak, i); + HAK_ASSERT(hak, is_digit_char(tc)); + v = v * 10 + HAK_CHAR_TO_NUM(tc, 10); if (v > HAK_ERROR_MAX) { - hak_setsynerr(hak, HAK_SYNERR_ERRLIT, TOKEN_LOC(hak), TOKEN_NAME(hak)); + illegal_error_literal: + hak_setsynerrbfmt(hak, HAK_SYNERR_ERRLIT, TOKEN_LOC(hak), HAK_NULL, + "illegal erorr literal '%.*js'", TOKEN_NAME_LEN(hak), TOKEN_NAME_PTR(hak)); goto oops; } } diff --git a/lib/x-client.c b/lib/x-client.c index 78693c3..cedc605 100644 --- a/lib/x-client.c +++ b/lib/x-client.c @@ -332,7 +332,7 @@ const hak_bch_t* hak_client_geterrbmsg (hak_client_t* client) msg = (client->errmsg.len <= 0)? hak_errnum_to_errstr(client->errnum): client->errmsg.buf; mbslen = HAK_COUNTOF(client->errmsg.xerrmsg); - hak_conv_ucstr_to_bcstr_with_cmgr (msg, &wcslen, client->errmsg.xerrmsg, &mbslen, client->_cmgr); + hak_conv_ucstr_to_bcstr_with_cmgr(msg, &wcslen, client->errmsg.xerrmsg, &mbslen, client->_cmgr); return client->errmsg.xerrmsg; #endif @@ -347,7 +347,7 @@ const hak_uch_t* hak_client_geterrumsg (hak_client_t* client) msg = (client->errmsg.len <= 0)? hak_errnum_to_errstr(client->errnum): client->errmsg.buf; wcslen = HAK_COUNTOF(client->errmsg.xerrmsg); - hak_conv_bcstr_to_ucstr_with_cmgr (msg, &mbslen, client->errmsg.xerrmsg, &wcslen, client->_cmgr, 1); + hak_conv_bcstr_to_ucstr_with_cmgr(msg, &mbslen, client->errmsg.xerrmsg, &wcslen, client->_cmgr, 1); return client->errmsg.xerrmsg; #else diff --git a/t/call-5001.err b/t/call-5001.err index df56eef..0fd94f1 100644 --- a/t/call-5001.err +++ b/t/call-5001.err @@ -1,3 +1,12 @@ +return 1 2 ##ERROR: syntax error - excessive argument to 'return' around '2' + +--- + +## TODO: improve the return to show the actual parenthensis like around '(' +return 1 (+ 1 2) ##ERROR: syntax error - excessive argument to 'return' around '' + +--- + ## the expression begins with a dictionary expression. ## it is not a function name and can'be be invoked. #{100:1, 200: 3}; ##ERROR: syntax error - invalid callable diff --git a/t/feed-5001.err b/t/feed-5001.err index 864fc8d..446a6e6 100644 --- a/t/feed-5001.err +++ b/t/feed-5001.err @@ -2,6 +2,22 @@ $?a ##ERROR: syntax error - invalid dollar-prefixed identifier '$?a' --- +-0e00 ##ERROR: syntax error - illegal erorr literal '-0e00' + +--- + ++0e11 ##ERROR: syntax error - illegal erorr literal '+0e11' + +--- + +-0p00 ##ERROR: syntax error - illegal smptr literal '-0p00' + +--- + ++0p11 ##ERROR: syntax error - illegal smptr literal '+0p11' + +--- + $include ##ERROR: syntax error - '$include' target not specified ---