From 628846ff1660c94ac3b96cbab50ac4aaa36523b8 Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Mon, 31 May 2021 16:20:18 +0000 Subject: [PATCH] implementing defclass --- hcl/lib/comp.c | 67 +++++++++++++++++++++++++------------------------- 1 file changed, 34 insertions(+), 33 deletions(-) diff --git a/hcl/lib/comp.c b/hcl/lib/comp.c index 8dc2b94..f57980d 100644 --- a/hcl/lib/comp.c +++ b/hcl/lib/comp.c @@ -1589,18 +1589,17 @@ static HCL_INLINE int compile_else (hcl_t* hcl) /* ========================================================================= */ -static int next_require_symbol (hcl_t* hcl, hcl_cnode_t* obj, hcl_cnode_t* prev, hcl_cnode_t* container, hcl_synerrnum_t errnum, const hcl_bch_t* bmsg) +static int check_if_plain_cnode (hcl_t* hcl, hcl_cnode_t* obj, hcl_cnode_t* prev, hcl_cnode_t* container, hcl_synerrnum_t errnum, const hcl_bch_t* bname) { - obj = HCL_CNODE_CONS_CDR(obj); if (!obj) { - hcl_setsynerrbfmt (hcl, errnum, HCL_CNODE_GET_LOC(prev), HCL_NULL, "%hs in %.*js", bmsg, HCL_CNODE_GET_TOKLEN(container), HCL_CNODE_GET_TOKPTR(container)); + hcl_setsynerrbfmt (hcl, errnum, HCL_CNODE_GET_LOC(prev), HCL_NULL, "no %hs in %.*js", bname, HCL_CNODE_GET_TOKLEN(container), HCL_CNODE_GET_TOKPTR(container)); return -1; } else if (!HCL_CNODE_IS_CONS(obj)) { - hcl_setsynerrbfmt (hcl, HCL_SYNERR_DOTBANNED, HCL_CNODE_GET_LOC(prev), HCL_CNODE_GET_TOK(obj), "redundant cdr in superclass in %.*js", HCL_CNODE_GET_TOKLEN(container), HCL_CNODE_GET_TOKPTR(container)); + hcl_setsynerrbfmt (hcl, HCL_SYNERR_DOTBANNED, HCL_CNODE_GET_LOC(prev), HCL_CNODE_GET_TOK(obj), "redundant cdr where %.*js is expected in %.*js", bname, HCL_CNODE_GET_TOKLEN(container), HCL_CNODE_GET_TOKPTR(container)); return -1; } @@ -1632,17 +1631,18 @@ static int compile_defclass (hcl_t* hcl, hcl_cnode_t* src) ) */ - hcl_cnode_t* cmd, * obj, * args; - hcl_cnode_t* defun_name, * class_name; + hcl_cnode_t* cmd, * obj, * tmp; + hcl_cnode_t* class_name, * superclass_name; cmd = HCL_CNODE_CONS_CAR(src); obj = HCL_CNODE_CONS_CDR(src); - HCL_ASSERT (hcl, HCL_CNODE_IS_SYMBOL_SYNCODED(cmd, HCL_SYNCODE_DEFUN)); - - if (check(hcl, obj, src, cmd, HCL_SYNERR_VARNAME, "no class name") <= -1) return -1; + HCL_ASSERT (hcl, HCL_CNODE_IS_SYMBOL_SYNCODED(cmd, HCL_SYNCODE_DEFCLASS)); + class_name = HCL_NULL; + superclass_name = HCL_NULL; + if (check_if_plain_cnode(hcl, obj, src, cmd, HCL_SYNERR_VARNAME, "class name") <= -1) return -1; class_name = HCL_CNODE_CONS_CAR(obj); if (HCL_CNODE_IS_SYMBOL(class_name)) { @@ -1652,15 +1652,10 @@ static int compile_defclass (hcl_t* hcl, hcl_cnode_t* src) hcl_setsynerrbfmt (hcl, HCL_SYNERR_BANNEDVARNAME, HCL_CNODE_GET_LOC(class_name), HCL_CNODE_GET_TOK(class_name), "special symbol not to be used as a class name"); return -1; } - obj = HCL_CNODE_CONS_CDR(obj); } - else - { - /* no class name specified */ - class_name = HCL_NULL; - } +printf ("00000000000000\n"); if (obj) { /* superclass */ @@ -1668,32 +1663,38 @@ static int compile_defclass (hcl_t* hcl, hcl_cnode_t* src) if (HCL_CNODE_IS_ELLIPSIS(tmp)) { obj = HCL_CNODE_CONS_CDR(obj); - if (!obj) + if (check_if_plain_cnode(hcl, obj, tmp, cmd, HCL_SYNERR_VARNAME, "superclass name") <= -1) return -1; + superclass_name = HCL_CNODE_CONS_CAR(obj); + if (HCL_CNODE_IS_SYMBOL(superclass_name)) { - hcl_setsynerrbfmt (hcl, HCL_SYNERR_ARGNAMELIST, HCL_CNODE_GET_LOC(tmp), HCL_NULL, "no superclass in %.*js", HCL_CNODE_GET_TOKLEN(cmd), HCL_CNODE_GET_TOKPTR(cmd)); + if (HCL_CNODE_SYMBOL_SYNCODE(class_name)) /*|| HCL_OBJ_GET_FLAGS_KERNEL(class_name) >= 1) */ + { + hcl_setsynerrbfmt (hcl, HCL_SYNERR_BANNEDVARNAME, HCL_CNODE_GET_LOC(class_name), HCL_CNODE_GET_TOK(class_name), "special symbol not to be used as a superclass name"); + return -1; + } + obj = HCL_CNODE_CONS_CDR(obj); + } + else + { + hcl_setsynerrbfmt (hcl, HCL_SYNERR_VARNAME, HCL_CNODE_GET_LOC(class_name), HCL_CNODE_GET_TOK(class_name), "non-symbol not to be used as a superclass name"); return -1; } - else if (!HCL_CNODE_IS_CONS(obj)) - { - hcl_setsynerrbfmt (hcl, HCL_SYNERR_DOTBANNED, HCL_CNODE_GET_LOC(tmp), HCL_CNODE_GET_TOK(obj), "redundant cdr in superclass in %.*js", HCL_CNODE_GET_TOKLEN(cmd), HCL_CNODE_GET_TOKPTR(cmd)); - return -1; - } - } } +printf ("1111111111111111111\n"); - if (!obj) + while (obj) { - hcl_setsynerrbfmt (hcl, HCL_SYNERR_ARGNAMELIST, HCL_CNODE_GET_LOC(src), HCL_NULL, "no argument list in %.*js", HCL_CNODE_GET_TOKLEN(cmd), HCL_CNODE_GET_TOKPTR(cmd)); - return -1; - } - else if (!HCL_CNODE_IS_CONS(obj)) - { - hcl_setsynerrbfmt (hcl, HCL_SYNERR_DOTBANNED, HCL_CNODE_GET_LOC(obj), HCL_CNODE_GET_TOK(obj), "redundant cdr in argument list in %.*js", HCL_CNODE_GET_TOKLEN(cmd), HCL_CNODE_GET_TOKPTR(cmd)); - return -1; - } - HCL_CNODE_CONS_CAR(obj); + /* instance variables and/or class variables */ + hcl_cnode_t* vars; + if (check_if_plain_cnode(hcl, obj, src, cmd, HCL_SYNERR_VARNAME, "variable list") <= -1) return -1; + if (!HCL_CNODE_IS_CONS_CONCODED(obj, HCL_CONCODE_VLIST)) break; + vars = HCL_CNODE_CONS_CAR(obj); + +printf ("22222222222\n"); + obj = HCL_CNODE_CONS_CDR(obj); + } return 0; }