diff --git a/lib/comp.c b/lib/comp.c index f2a4328..fe22593 100644 --- a/lib/comp.c +++ b/lib/comp.c @@ -220,15 +220,13 @@ static int add_temporary_variable (hak_t* hak, const hak_cnode_t* var, hak_oow_t { if (tgt) { - hak_setsynerrbfmt( - hak, HAK_SYNERR_VARNAMEDUP, HAK_CNODE_GET_LOC(var), HAK_NULL, + hak_setsynerrbfmt(hak, HAK_SYNERR_VARNAMEDUP, HAK_CNODE_GET_LOC(var), HAK_NULL, "duplicate %hs name '%.*js' for '%.*js'", desc, name->len, name->ptr, tgt->len, tgt->ptr); } else { - hak_setsynerrbfmt( - hak, HAK_SYNERR_VARNAMEDUP, HAK_CNODE_GET_LOC(var), HAK_NULL, + hak_setsynerrbfmt(hak, HAK_SYNERR_VARNAMEDUP, HAK_CNODE_GET_LOC(var), HAK_NULL, "duplicate %hs name '%.*js'", desc, name->len, name->ptr); } @@ -304,8 +302,7 @@ static int add_class_level_variable (hak_t* hak, hak_oocsc_t* dst, hak_oocsc_t* if (__find_word_in_string((hak_oocs_t*)dst, name, 0, HAK_NULL) >= 0 || (__find_word_in_string((hak_oocs_t*)altdst, name, 0, HAK_NULL) >= 0)) { - hak_setsynerrbfmt( - hak, HAK_SYNERR_VARNAMEDUP, HAK_CNODE_GET_LOC(var), HAK_NULL, + hak_setsynerrbfmt(hak, HAK_SYNERR_VARNAMEDUP, HAK_CNODE_GET_LOC(var), HAK_NULL, "duplicate %hs variable name '%.*js'", desc, name->len, name->ptr); return -1; } @@ -549,8 +546,7 @@ static int check_block_expression_as_body (hak_t* hak, hak_cnode_t* c, const hak HAK_CNODE_IS_ELIST_CONCODED(car, HAK_CONCODE_VLIST))) { no_block: - hak_setsynerrbfmt( - hak, HAK_SYNERR_BLOCK, + hak_setsynerrbfmt(hak, HAK_SYNERR_BLOCK, (car? HAK_CNODE_GET_LOC(car): c? HAK_CNODE_GET_LOC(c): HAK_CNODE_GET_LOC(ctx)), HAK_NULL, "block expression expected as '%.*js' body", HAK_CNODE_GET_TOKLEN(ctx), HAK_CNODE_GET_TOKPTR(ctx) ); @@ -4029,7 +4025,7 @@ static int compile_return (hak_t* hak, hak_cnode_t* src, int ret_from_home) { hak_setsynerrbfmt( hak, HAK_SYNERR_BANNED, HAK_CNODE_GET_LOC(src), HAK_NULL, - "%.*js not compatible with return variables", + "'%.*js' not compatible with return variables", HAK_CNODE_GET_TOKLEN(tmp), HAK_CNODE_GET_TOKPTR(tmp)); return -1; } @@ -4037,7 +4033,9 @@ static int compile_return (hak_t* hak, hak_cnode_t* src, int ret_from_home) /* if a return variable are specified in the current function block, the return statement must not be followed by a return value */ if (obj) { - hak_setsynerrbfmt(hak, HAK_SYNERR_BANNED, HAK_CNODE_GET_LOC(src), HAK_NULL, "use of return value in %.*js not compatible with return variables", HAK_CNODE_GET_TOKLEN(tmp), HAK_CNODE_GET_TOKPTR(tmp)); + hak_setsynerrbfmt(hak, HAK_SYNERR_BANNED, HAK_CNODE_GET_LOC(src), HAK_NULL, + "use of return value in '%.*js' not compatible with return variables", + HAK_CNODE_GET_TOKLEN(tmp), HAK_CNODE_GET_TOKPTR(tmp)); return -1; } @@ -4053,14 +4051,14 @@ static int compile_return (hak_t* hak, hak_cnode_t* src, int ret_from_home) /* 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)); + "no value specified for '%.*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_NULL, - "redundant cdr in %.*js around %.*js", + "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; @@ -4207,12 +4205,16 @@ static int compile_set_r (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; } @@ -4224,7 +4226,10 @@ static int compile_set_r (hak_t* hak, hak_cnode_t* src) if (!HAK_CNODE_IS_SYMBOL(var)) { if (nvars > 0) break; - 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; } @@ -4245,7 +4250,10 @@ static int compile_set_r (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; } @@ -4254,7 +4262,10 @@ static int compile_set_r (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_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(obj), HAK_CNODE_GET_TOKPTR(obj)); return -1; } @@ -4275,7 +4286,8 @@ static int compile_set_r (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; } @@ -4341,12 +4353,16 @@ static int compile_try (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 %.*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 expression specified 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; } @@ -4430,12 +4446,16 @@ static HAK_INLINE int compile_catch (hak_t* hak) if (!obj) { /* TODO: change error code */ - hak_setsynerrbfmt(hak, HAK_SYNERR_VARNAME, HAK_CNODE_GET_LOC(src), HAK_NULL, "no exception variable for '%.*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 exception variable for '%.*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; } @@ -4585,7 +4605,10 @@ static int compile_throw (hak_t* hak, hak_cnode_t* src) 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; } @@ -4595,7 +4618,10 @@ static int compile_throw (hak_t* hak, hak_cnode_t* src) 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_setsynerrbfmt(hak, HAK_SYNERR_ARGCOUNT, HAK_CNODE_GET_LOC(obj), HAK_NULL, + "excessive argument 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; } @@ -4804,9 +4830,8 @@ static int compile_cons_alist_expression (hak_t* hak, hak_cnode_t* cmd) { 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; } @@ -4857,11 +4882,9 @@ static int compile_cons_alist_expression (hak_t* hak, hak_cnode_t* cmd) /* not found */ 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; - } PUSH_SUBCFRAME(hak, COP_EMIT_SET, var); /* set doesn't evaluate the variable name */ @@ -4918,12 +4941,14 @@ static int compile_cons_xlist_expression (hak_t* hak, hak_cnode_t* obj, int nret if (compile_if(hak, obj) <= -1) return -1; goto done; - case HAK_CNODE_ELIF: - hak_setsynerrbfmt(hak, HAK_SYNERR_ELSE, HAK_CNODE_GET_LOC(car), HAK_CNODE_GET_TOK(car), "elif without if"); + case HAK_CNODE_ELIF: /* elif without if */ + hak_setsynerrbfmt(hak, HAK_SYNERR_ELIF, HAK_CNODE_GET_LOC(car), HAK_NULL, + "%.*js without if", HAK_CNODE_GET_TOKLEN(car), HAK_CNODE_GET_TOKPTR(car)); return -1; - case HAK_CNODE_ELSE: - hak_setsynerrbfmt(hak, HAK_SYNERR_ELIF, HAK_CNODE_GET_LOC(car), HAK_CNODE_GET_TOK(car), "else without if"); + case HAK_CNODE_ELSE: /* else without if */ + hak_setsynerrbfmt(hak, HAK_SYNERR_ELSE, HAK_CNODE_GET_LOC(car), HAK_NULL, + "%.*js without if", HAK_CNODE_GET_TOKLEN(car), HAK_CNODE_GET_TOKPTR(car)); return -1; case HAK_CNODE_THROW: @@ -4934,8 +4959,9 @@ static int compile_cons_xlist_expression (hak_t* hak, hak_cnode_t* obj, int nret if (compile_try(hak, obj) <= -1) return -1; goto done; - case HAK_CNODE_CATCH: - hak_setsynerrbfmt(hak, HAK_SYNERR_CATCH, HAK_CNODE_GET_LOC(car), HAK_CNODE_GET_TOK(car), "catch without try"); + case HAK_CNODE_CATCH: /* catch without try */ + hak_setsynerrbfmt(hak, HAK_SYNERR_CATCH, HAK_CNODE_GET_LOC(car), HAK_NULL, + "%.*js without try", HAK_CNODE_GET_TOKLEN(car), HAK_CNODE_GET_TOKPTR(car)); return -1; case HAK_CNODE_BREAK: @@ -5028,14 +5054,16 @@ static int compile_cons_xlist_expression (hak_t* hak, hak_cnode_t* obj, int nret if (!HAK_CNODE_IS_CONS(cdr)) { /* (funname . 10) */ - hak_setsynerrbfmt(hak, HAK_SYNERR_DOTBANNED, HAK_CNODE_GET_LOC(cdr), HAK_CNODE_GET_TOK(cdr), "redundant cdr in function call"); + hak_setsynerrbfmt(hak, HAK_SYNERR_DOTBANNED, HAK_CNODE_GET_LOC(cdr), HAK_NULL, + "redundant cdr in function call around '%.*js'", HAK_CNODE_GET_TOKLEN(cdr), HAK_CNODE_GET_TOKPTR(cdr)); return -1; } nargs = hak_countcnodecons(hak, cdr); if (nargs > MAX_CODE_PARAM) { - hak_setsynerrbfmt(hak, HAK_SYNERR_ARGFLOOD, HAK_CNODE_GET_LOC(cdr), HAK_NULL, "too many(%zd) parameters in function call", nargs); + hak_setsynerrbfmt(hak, HAK_SYNERR_ARGFLOOD, HAK_CNODE_GET_LOC(cdr), HAK_NULL, + "too many(%zd) parameters in function call", nargs); return -1; } } @@ -5121,13 +5149,16 @@ static int compile_cons_mlist_expression (hak_t* hak, hak_cnode_t* obj, hak_ooi_ cdr = HAK_CNODE_CONS_CDR(obj); if (!cdr) { - hak_setsynerrbfmt(hak, HAK_SYNERR_CALLABLE, HAK_CNODE_GET_LOC(car), HAK_CNODE_GET_TOK(car), "missing message"); + /* thie part may never be reached as the reader ensures this doesn't happen */ + hak_setsynerrbfmt(hak, HAK_SYNERR_CALLABLE, HAK_CNODE_GET_LOC(car), HAK_NULL, + "missing message for '%.*js'", HAK_CNODE_GET_TOKLEN(car), HAK_CNODE_GET_TOKPTR(car)); return -1; } if (!HAK_CNODE_IS_CONS(cdr)) { /* ( . 10) */ - hak_setsynerrbfmt(hak, HAK_SYNERR_DOTBANNED, HAK_CNODE_GET_LOC(cdr), HAK_CNODE_GET_TOK(cdr), "redundant cdr in message send"); + hak_setsynerrbfmt(hak, HAK_SYNERR_DOTBANNED, HAK_CNODE_GET_LOC(cdr), HAK_NULL, + "redundant cdr in message send around '%.*js'", HAK_CNODE_GET_TOKLEN(cdr), HAK_CNODE_GET_TOKPTR(cdr)); return -1; } car = HAK_CNODE_CONS_CAR(cdr); @@ -5830,9 +5861,6 @@ redo: case HAK_CNODE_DBLCOLONS: case HAK_CNODE_COLON: default: - /* - hak_setsynerrbfmt(hak, HAK_SYNERR_INTERN, HAK_CNODE_GET_LOC(oprnd), HAK_CNODE_GET_TOK(oprnd), "internal error - unexpected object type %d", HAK_CNODE_GET_TYPE(oprnd)); - */ hak_setsynerrbfmt(hak, HAK_SYNERR_BANNED, HAK_CNODE_GET_LOC(oprnd), HAK_NULL, "'%.*js' prohibited in this context", HAK_CNODE_GET_TOKLEN(oprnd), HAK_CNODE_GET_TOKPTR(oprnd)); @@ -6739,8 +6767,7 @@ static HAK_INLINE int post_fun (hak_t* hak) { /* something wrong - this must not happen because the reader must prevent this * but if it happens, it is a syntax error */ - hak_setsynerrbfmt( - hak, HAK_SYNERR_BANNED, HAK_CNODE_GET_LOC(class_name), HAK_NULL, + hak_setsynerrbfmt(hak, HAK_SYNERR_BANNED, HAK_CNODE_GET_LOC(class_name), HAK_NULL, "class name '%.*js' prohibited class initialization context", HAK_CNODE_GET_TOKLEN(class_name), HAK_CNODE_GET_TOKPTR(class_name)); return -1; diff --git a/lib/hak-prv.h b/lib/hak-prv.h index a587918..a0ee30b 100644 --- a/lib/hak-prv.h +++ b/lib/hak-prv.h @@ -302,6 +302,7 @@ enum hak_tok_type_t HAK_TOK_SMPTRLIT, HAK_TOK_ERRLIT, + /* these keyword enumerators must match the mapping order in kw_to_cnode_type() in read.c */ HAK_TOK_NIL, HAK_TOK_TRUE, HAK_TOK_FALSE, @@ -331,6 +332,7 @@ enum hak_tok_type_t #endif HAK_TOK_SET, HAK_TOK_SET_R, + /* end of keyword enumerators */ HAK_TOK_BINOP, HAK_TOK_IDENT, diff --git a/lib/read.c b/lib/read.c index 2461c1c..528cd7b 100644 --- a/lib/read.c +++ b/lib/read.c @@ -717,15 +717,24 @@ static HAK_INLINE hak_cnode_t* leave_list (hak_t* hak, hak_loc_t* list_loc, int* /* no item after , : := or various binary operators */ if (concode == HAK_CONCODE_MLIST) { - hak_setsynerrbfmt(hak, HAK_SYNERR_CALLABLE, TOKEN_LOC(hak), HAK_NULL, "missing message after receiver"); + hak_cnode_t* tmp; + tmp = HAK_CNODE_CONS_CAR(tail); + hak_setsynerrbfmt(hak, HAK_SYNERR_CALLABLE, TOKEN_LOC(hak), HAK_NULL, + "missing message for '%.*js'", HAK_CNODE_GET_TOKLEN(tmp), HAK_CNODE_GET_TOKPTR(tmp)); } else if (concode == HAK_CONCODE_ALIST) { - hak_setsynerrbfmt(hak, HAK_SYNERR_RVALUE, TOKEN_LOC(hak), HAK_NULL, "missing rvalue after :="); + hak_cnode_t* tmp; + tmp = HAK_CNODE_CONS_CAR(tail); + hak_setsynerrbfmt(hak, HAK_SYNERR_RVALUE, TOKEN_LOC(hak), HAK_NULL, + "missing rvalue for '%.*js'", HAK_CNODE_GET_TOKLEN(tmp), HAK_CNODE_GET_TOKPTR(tmp)); } else if (concode == HAK_CONCODE_BLIST) { - hak_setsynerrbfmt(hak, HAK_SYNERR_NOVALUE, TOKEN_LOC(hak), HAK_NULL, "missing expression after binary selector"); + hak_cnode_t* tmp; + tmp = HAK_CNODE_CONS_CAR(tail); + hak_setsynerrbfmt(hak, HAK_SYNERR_NOVALUE, TOKEN_LOC(hak), HAK_NULL, + "missing expression after binary selector '%.*js'", HAK_CNODE_GET_TOKLEN(tmp), HAK_CNODE_GET_TOKPTR(tmp)); } else { @@ -1547,6 +1556,7 @@ static int auto_forge_xlist_if_at_block_beginning (hak_t* hak, hak_frd_t* frd) static hak_cnode_type_t kw_to_cnode_type (int tok_type) { + /* this must match the keyword token enumerator order in hak_tok_type_t() in hak-prv.h */ static hak_cnode_type_t mapping[] = { HAK_CNODE_NIL, HAK_CNODE_TRUE, diff --git a/t/call-5001.err b/t/call-5001.err index 0fd94f1..3bd86a4 100644 --- a/t/call-5001.err +++ b/t/call-5001.err @@ -1,3 +1,7 @@ +return ##ERROR: syntax error - no value specified for 'return' + +--- + return 1 2 ##ERROR: syntax error - excessive argument to 'return' around '2' --- @@ -61,6 +65,14 @@ if (< 20 30) else { ##ERROR: syntax error - block expression expected as 'if' bo } +--- + +elif (< 20 30) { } ##ERROR: syntax error - elif without if + +--- + +else (< 20 30) { } ##ERROR: syntax error - else without if + --- catch (e) {} ##ERROR: syntax error - catch without try diff --git a/t/class-5001.err b/t/class-5001.err index 6f62fcd..5d138fb 100644 --- a/t/class-5001.err +++ b/t/class-5001.err @@ -101,6 +101,12 @@ class B { --- +class B { + self.x := 20 ##ERROR: syntax error - unknown class-level variable name 'self.x' +} + +--- + class B { var x y }; @@ -113,7 +119,7 @@ class X: B { set a 100; set self.b (* t 2); - set self.c (fun(b) { ##ERROR: syntax error - unknown class-level variable name + set self.c (fun(b) { ##ERROR: syntax error - unknown class-level variable name 'self.c' printf "xxxx [%d]\n" b; }); return self; diff --git a/t/feed-5001.err b/t/feed-5001.err index 446a6e6..26f3fea 100644 --- a/t/feed-5001.err +++ b/t/feed-5001.err @@ -205,6 +205,10 @@ abc.? := 20 ##ERROR: syntax error - wrong multi-segment identifier 'abc.?' --- +aaa := ##ERROR: syntax error - missing rvalue for 'aaa' + +--- + throw ##ERROR: syntax error - no value or expression after 'throw' --- diff --git a/t/mlist-5001.err b/t/mlist-5001.err index af7dced..86f84ed 100644 --- a/t/mlist-5001.err +++ b/t/mlist-5001.err @@ -1 +1,5 @@ -(1:) ##ERROR: syntax error - missing message after receiver +(1:) ##ERROR: syntax error - missing message for '1' + +--- + +a + ##ERROR: syntax error - no operand after binary selector '+'