trimming various syntax error messages

This commit is contained in:
2025-10-15 23:28:14 +09:00
parent e99a4e700b
commit 00f6b70028
6 changed files with 147 additions and 53 deletions

View File

@ -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. /* instance variables are accessible only in an instance method defintion scope.
* it is in class initialization 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; 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) 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*/ /* 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; 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) 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; return -1;
} }
else if (!HAK_CNODE_IS_CONS(obj)) else if (!HAK_CNODE_IS_CONS(obj))
@ -1931,12 +1935,13 @@ static int compile_or (hak_t* hak, hak_cnode_t* src)
if (!obj) if (!obj)
{ {
/* no value */ /* 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; return -1;
} }
else if (!HAK_CNODE_IS_CONS(obj)) 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; return -1;
} }
@ -1966,7 +1971,8 @@ static HAK_INLINE int compile_or_p1 (hak_t* hak)
obj = cf->operand; obj = cf->operand;
if (!HAK_CNODE_IS_CONS(obj)) 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; return -1;
} }
@ -2032,7 +2038,8 @@ static int compile_plus (hak_t* hak, hak_cnode_t* src)
} }
else if (!HAK_CNODE_IS_CONS(obj)) 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; return -1;
} }
@ -2048,7 +2055,8 @@ static int compile_plus (hak_t* hak, hak_cnode_t* src)
} }
else if (!HAK_CNODE_IS_CONS(obj)) 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; return -1;
} }
@ -2057,7 +2065,8 @@ static int compile_plus (hak_t* hak, hak_cnode_t* src)
if (obj) 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; return -1;
} }
@ -2098,11 +2107,15 @@ static int compile_break (hak_t* hak, hak_cnode_t* src)
{ {
if (HAK_CNODE_IS_CONS(obj)) 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 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; return -1;
} }
@ -2126,8 +2139,7 @@ static int compile_break (hak_t* hak, hak_cnode_t* src)
} }
} }
hak_setsynerrbfmt( hak_setsynerrbfmt(hak, HAK_SYNERR_BREAK, HAK_CNODE_GET_LOC(src), HAK_NULL,
hak, HAK_SYNERR_BREAK, HAK_CNODE_GET_LOC(src), HAK_NULL,
"%.*js outside loop", HAK_CNODE_GET_TOKLEN(cmd), HAK_CNODE_GET_TOKPTR(cmd)); "%.*js outside loop", HAK_CNODE_GET_TOKLEN(cmd), HAK_CNODE_GET_TOKPTR(cmd));
return -1; return -1;
@ -2166,8 +2178,7 @@ inside_loop:
/* this part must no be reached. if a loop control block is found, /* 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 */ * there must exist a COP_POST_UNTIL_BODY or COP_POST_WHILE_BODY frame */
hak_setsynerrbfmt( hak_setsynerrbfmt(hak, HAK_SYNERR_INTERN, HAK_CNODE_GET_LOC(src), HAK_NULL,
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)); "internal error in compiling %.*js", HAK_CNODE_GET_TOKLEN(cmd), HAK_CNODE_GET_TOKPTR(cmd));
return -1; return -1;
} }
@ -2213,11 +2224,15 @@ static int compile_continue (hak_t* hak, hak_cnode_t* src)
{ {
if (HAK_CNODE_IS_CONS(obj)) 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 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; 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 */ obj = HAK_CNODE_CONS_CDR(src); /* expression list after it */
if (obj && !HAK_CNODE_IS_CONS(obj)) if (obj && !HAK_CNODE_IS_CONS(obj))
{ {
hak_setsynerrbfmt( hak_setsynerrbfmt(hak, HAK_SYNERR_DOTBANNED, HAK_CNODE_GET_LOC(obj), HAK_NULL,
hak, HAK_SYNERR_DOTBANNED, HAK_CNODE_GET_LOC(obj), HAK_CNODE_GET_TOK(obj), "redundant cdr in %.*js around %.*js",
"redundant cdr in %.*js", HAK_CNODE_GET_TOKLEN(cmd), HAK_CNODE_GET_TOKPTR(cmd)); HAK_CNODE_GET_TOKLEN(cmd), HAK_CNODE_GET_TOKPTR(cmd),
HAK_CNODE_GET_TOKLEN(obj), HAK_CNODE_GET_TOKPTR(obj));
return -1; 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)) if (is_in_class_init_scope(hak))
{ {
hak_setsynerrbfmt( hak_setsynerrbfmt(hak, HAK_SYNERR_VARDCLBANNED, HAK_CNODE_GET_LOC(obj), HAK_NULL,
hak, HAK_SYNERR_VARDCLBANNED, HAK_CNODE_GET_LOC(obj), HAK_NULL,
"variable declaration disallowed in class init scope"); "variable declaration disallowed in class init scope");
return -1; return -1;
} }
@ -2461,12 +2476,16 @@ static int compile_if (hak_t* hak, hak_cnode_t* src)
if (!obj) if (!obj)
{ {
/* no value */ /* 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; return -1;
} }
else if (!HAK_CNODE_IS_CONS(obj)) 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; return -1;
} }
@ -2562,12 +2581,16 @@ static HAK_INLINE int compile_elif (hak_t* hak)
if (!obj) if (!obj)
{ {
/* no value */ /* 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; return -1;
} }
else if (!HAK_CNODE_IS_CONS(obj)) 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; return -1;
} }
@ -2602,7 +2625,10 @@ static HAK_INLINE int compile_else (hak_t* hak)
if (obj && !HAK_CNODE_IS_CONS(obj)) 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; return -1;
} }
@ -3629,8 +3655,10 @@ static int compile_fun (hak_t* hak, hak_cnode_t* src)
if (!HAK_CNODE_IS_CONS(dcl)) if (!HAK_CNODE_IS_CONS(dcl))
{ {
hak_setsynerrbfmt(hak, HAK_SYNERR_DOTBANNED, HAK_CNODE_GET_LOC(dcl), HAK_CNODE_GET_TOK(dcl), hak_setsynerrbfmt(hak, HAK_SYNERR_DOTBANNED, HAK_CNODE_GET_LOC(dcl), HAK_NULL,
"redundant cdr in argument list in %.*js", HAK_CNODE_GET_TOKLEN(cmd), HAK_CNODE_GET_TOKPTR(cmd)); "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; 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? */ /* TODO: should i allow (return)? does it return the last value on the stack? */
/* no value */ /* no value */
hak_cnode_t* tmp = HAK_CNODE_CONS_CAR(src); 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; return -1;
} }
else if (!HAK_CNODE_IS_CONS(obj)) else if (!HAK_CNODE_IS_CONS(obj))
{ {
hak_cnode_t* tmp = HAK_CNODE_CONS_CAR(src); 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; return -1;
} }
@ -4040,7 +4072,11 @@ static int compile_return (hak_t* hak, hak_cnode_t* src, int ret_from_home)
if (obj) if (obj)
{ {
hak_cnode_t* tmp = HAK_CNODE_CONS_CAR(src); 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; return -1;
} }
@ -4069,19 +4105,26 @@ static int compile_set (hak_t* hak, hak_cnode_t* src)
if (!obj) 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; return -1;
} }
else if (!HAK_CNODE_IS_CONS(obj)) 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; return -1;
} }
var = HAK_CNODE_CONS_CAR(obj); var = HAK_CNODE_CONS_CAR(obj);
if (!HAK_CNODE_IS_SYMBOL(var) && !HAK_CNODE_IS_DSYMBOL_CLA(var)) 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; return -1;
} }
@ -4097,7 +4140,10 @@ static int compile_set (hak_t* hak, hak_cnode_t* src)
} }
else if (!HAK_CNODE_IS_CONS(obj)) 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; return -1;
} }
@ -4106,7 +4152,11 @@ static int compile_set (hak_t* hak, hak_cnode_t* src)
obj = HAK_CNODE_CONS_CDR(obj); obj = HAK_CNODE_CONS_CDR(obj);
if (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; return -1;
} }
@ -4119,7 +4169,9 @@ static int compile_set (hak_t* hak, hak_cnode_t* src)
{ {
if (HAK_CNODE_IS_DSYMBOL_CLA(var)) 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; return -1;
} }

View File

@ -699,7 +699,7 @@ void hak_getsynerru (hak_t* hak, hak_synerru_t* synerr)
if (s->loc.file) if (s->loc.file)
{ {
wcslen = HAK_COUNTOF(hak->errmsg.xerrlocfile); 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 */ synerr->loc.file = hak->errmsg.xerrlocfile; /* this can be truncated and is transient */
} }
#endif #endif

View File

@ -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 /* the auto-created xlist can't be terminated with the regular closing symbol
* it must end with the semicolon */ * 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; goto oops;
} }
if (cons_info[concode].closer != TOKEN_TYPE(hak)) 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; goto oops;
} }
#if 0 #if 0
@ -2056,7 +2058,7 @@ static int feed_process_token (hak_t* hak)
* with no opening(left) parenthesis, which is * with no opening(left) parenthesis, which is
* indicated by frd->level<=0. * 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; goto oops;
} }
#endif #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)); frd->obj = hak_makecnodedblcolons(hak, 0, TOKEN_LOC(hak), TOKEN_NAME(hak));
goto auto_xlist; goto auto_xlist;
case HAK_TOK_SMPTRLIT: case HAK_TOK_SMPTRLIT: /* 0pXXXX */
{ {
hak_oow_t i; hak_oow_t i;
hak_oow_t v = 0; hak_oow_t v = 0;
hak_ooch_t tc;
/* 0pNNNN */
HAK_ASSERT(hak, TOKEN_NAME_LEN(hak) >= 3); 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++) for (i = 2; i < TOKEN_NAME_LEN(hak); i++)
{ {
HAK_ASSERT(hak, is_xdigit_char(TOKEN_NAME_CHAR(hak, i))); tc = TOKEN_NAME_CHAR(hak, i);
v = v * 16 + HAK_CHAR_TO_NUM(TOKEN_NAME_CHAR(hak, i), 16); HAK_ASSERT(hak, is_xdigit_char(tc));
v = v * 16 + HAK_CHAR_TO_NUM(tc, 16);
} }
if (!HAK_IN_SMPTR_RANGE(v)) 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; goto oops;
} }
@ -2137,20 +2146,28 @@ static int feed_process_token (hak_t* hak)
goto auto_xlist; goto auto_xlist;
} }
case HAK_TOK_ERRLIT: case HAK_TOK_ERRLIT: /* 0eNNNN */
{ {
hak_oow_t i; hak_oow_t i;
hak_ooi_t v = 0; hak_ooi_t v = 0;
hak_ooch_t tc;
HAK_ASSERT(hak, TOKEN_NAME_LEN(hak) >= 3); 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++) for (i = 2; i < TOKEN_NAME_LEN(hak); i++)
{ {
HAK_ASSERT(hak, is_digit_char(TOKEN_NAME_CHAR(hak, i))); tc = TOKEN_NAME_CHAR(hak, i);
v = v * 10 + HAK_CHAR_TO_NUM(TOKEN_NAME_CHAR(hak, i), 10); HAK_ASSERT(hak, is_digit_char(tc));
v = v * 10 + HAK_CHAR_TO_NUM(tc, 10);
if (v > HAK_ERROR_MAX) 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; goto oops;
} }
} }

View File

@ -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; msg = (client->errmsg.len <= 0)? hak_errnum_to_errstr(client->errnum): client->errmsg.buf;
mbslen = HAK_COUNTOF(client->errmsg.xerrmsg); 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; return client->errmsg.xerrmsg;
#endif #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; msg = (client->errmsg.len <= 0)? hak_errnum_to_errstr(client->errnum): client->errmsg.buf;
wcslen = HAK_COUNTOF(client->errmsg.xerrmsg); 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; return client->errmsg.xerrmsg;
#else #else

View File

@ -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. ## the expression begins with a dictionary expression.
## it is not a function name and can'be be invoked. ## it is not a function name and can'be be invoked.
#{100:1, 200: 3}; ##ERROR: syntax error - invalid callable #{100:1, 200: 3}; ##ERROR: syntax error - invalid callable

View File

@ -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 $include ##ERROR: syntax error - '$include' target not specified
--- ---