started adding an new experimental reader
This commit is contained in:
parent
1b59610444
commit
8c4b56002d
91
lib/read.c
91
lib/read.c
@ -1023,6 +1023,7 @@ retry:
|
|||||||
CLEAR_TOKEN_NAME (hcl);
|
CLEAR_TOKEN_NAME (hcl);
|
||||||
ADD_TOKEN_STR(hcl, vocas[VOCA_EOL].str, vocas[VOCA_EOL].len);
|
ADD_TOKEN_STR(hcl, vocas[VOCA_EOL].str, vocas[VOCA_EOL].len);
|
||||||
hcl->c->tok.loc = hcl->c->lxc.l; /* set token location */
|
hcl->c->tok.loc = hcl->c->lxc.l; /* set token location */
|
||||||
|
goto done;
|
||||||
}
|
}
|
||||||
GET_CHAR (hcl);
|
GET_CHAR (hcl);
|
||||||
}
|
}
|
||||||
@ -1282,6 +1283,7 @@ retry:
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
done:
|
||||||
#if defined(HCL_DEBUG_LEXER)
|
#if defined(HCL_DEBUG_LEXER)
|
||||||
HCL_DEBUG2 (hcl, "TOKEN: [%.*js]\n", (hcl_ooi_t)TOKEN_NAME_LEN(hcl), TOKEN_NAME_PTR(hcl));
|
HCL_DEBUG2 (hcl, "TOKEN: [%.*js]\n", (hcl_ooi_t)TOKEN_NAME_LEN(hcl), TOKEN_NAME_PTR(hcl));
|
||||||
#endif
|
#endif
|
||||||
@ -1608,7 +1610,7 @@ static HCL_INLINE int can_colon_list (hcl_t* hcl)
|
|||||||
|
|
||||||
HCL_ASSERT (hcl, !HCL_IS_NIL(hcl,hcl->c->r.s));
|
HCL_ASSERT (hcl, !HCL_IS_NIL(hcl,hcl->c->r.s));
|
||||||
|
|
||||||
/* mark the state that a dot has appeared in the list */
|
/* mark the state that a colon has appeared in the list */
|
||||||
rsa = (hcl_oop_oop_t)hcl->c->r.s;
|
rsa = (hcl_oop_oop_t)hcl->c->r.s;
|
||||||
HCL_ASSERT (hcl, HCL_OOP_IS_SMOOI(rsa->slot[2]));
|
HCL_ASSERT (hcl, HCL_OOP_IS_SMOOI(rsa->slot[2]));
|
||||||
flagv = HCL_OOP_TO_SMOOI(rsa->slot[2]);
|
flagv = HCL_OOP_TO_SMOOI(rsa->slot[2]);
|
||||||
@ -1625,7 +1627,7 @@ static HCL_INLINE int can_colon_list (hcl_t* hcl)
|
|||||||
count = HCL_OOP_TO_SMOOI(rsa->slot[4]);
|
count = HCL_OOP_TO_SMOOI(rsa->slot[4]);
|
||||||
if (!(count & 1)) return 0;
|
if (!(count & 1)) return 0;
|
||||||
|
|
||||||
flagv |= COMMAED;
|
flagv |= COLONED;
|
||||||
rsa->slot[2] = HCL_SMOOI_TO_OOP(flagv);
|
rsa->slot[2] = HCL_SMOOI_TO_OOP(flagv);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -2185,6 +2187,89 @@ static int read_object (hcl_t* hcl)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int read_object_in_cli_mode (hcl_t* hcl)
|
||||||
|
{
|
||||||
|
int level = 0, array_level = 0, flagv = 0;
|
||||||
|
hcl_oop_t obj;
|
||||||
|
|
||||||
|
flagv = 0;
|
||||||
|
LIST_FLAG_SET_CONCODE (flagv, HCL_CONCODE_XLIST);
|
||||||
|
|
||||||
|
/* push some data to simulate recursion into
|
||||||
|
* a list literal or an array literal */
|
||||||
|
if (enter_list(hcl, flagv) == HCL_NULL) return -1;
|
||||||
|
level++;
|
||||||
|
//if (LIST_FLAG_GET_CONCODE(flagv) == HCL_CONCODE_ARRAY) array_level++;
|
||||||
|
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
redo:
|
||||||
|
switch (TOKEN_TYPE(hcl))
|
||||||
|
{
|
||||||
|
default:
|
||||||
|
hcl_setsynerr (hcl, HCL_SYNERR_ILTOK, TOKEN_LOC(hcl), TOKEN_NAME(hcl));
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
case HCL_IOTOK_EOF:
|
||||||
|
hcl_setsynerr (hcl, HCL_SYNERR_EOF, TOKEN_LOC(hcl), TOKEN_NAME(hcl));
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
case HCL_IOTOK_INCLUDE:
|
||||||
|
/* TODO: should i limit where #include can be specified?
|
||||||
|
* disallow it inside a list literal or an array literal? */
|
||||||
|
GET_TOKEN (hcl);
|
||||||
|
if (TOKEN_TYPE(hcl) != HCL_IOTOK_STRLIT)
|
||||||
|
{
|
||||||
|
hcl_setsynerr (hcl, HCL_SYNERR_STRING, TOKEN_LOC(hcl), TOKEN_NAME(hcl));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (begin_include(hcl) <= -1) return -1;
|
||||||
|
goto redo;
|
||||||
|
|
||||||
|
case HCL_IOTOK_EOL:
|
||||||
|
{
|
||||||
|
int oldflagv;
|
||||||
|
//int concode;
|
||||||
|
|
||||||
|
if (level <= 0)
|
||||||
|
{
|
||||||
|
hcl_setsynerr (hcl, HCL_SYNERR_UNBALPBB, TOKEN_LOC(hcl), HCL_NULL);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
//concode = LIST_FLAG_GET_CONCODE(flagv);
|
||||||
|
obj = leave_list (hcl, &flagv, &oldflagv);
|
||||||
|
|
||||||
|
level--;
|
||||||
|
//if (LIST_FLAG_GET_CONCODE(oldflagv) == HCL_CONCODE_ARRAY) array_level--;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
case HCL_IOTOK_STRLIT:
|
||||||
|
case HCL_IOTOK_IDENT:
|
||||||
|
obj = hcl_makestring(hcl, TOKEN_NAME_PTR(hcl), TOKEN_NAME_LEN(hcl), 0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!obj) return -1;
|
||||||
|
|
||||||
|
/* check if we are at the top level */
|
||||||
|
//if (level <= 0) break; /* yes */
|
||||||
|
|
||||||
|
/* if not, append the element read into the current list.
|
||||||
|
* if we are not at the top level, we must be in a list */
|
||||||
|
//if (chain_to_list(hcl, obj) == HCL_NULL) return -1;
|
||||||
|
clear_comma_colon_flag (hcl);
|
||||||
|
|
||||||
|
/* read the next token */
|
||||||
|
GET_TOKEN (hcl);
|
||||||
|
}
|
||||||
|
|
||||||
|
done:
|
||||||
|
hcl->c->r.e = obj;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static HCL_INLINE int __read (hcl_t* hcl)
|
static HCL_INLINE int __read (hcl_t* hcl)
|
||||||
{
|
{
|
||||||
if (get_token(hcl) <= -1) return -1;
|
if (get_token(hcl) <= -1) return -1;
|
||||||
@ -2193,7 +2278,7 @@ static HCL_INLINE int __read (hcl_t* hcl)
|
|||||||
hcl_seterrnum (hcl, HCL_EFINIS);
|
hcl_seterrnum (hcl, HCL_EFINIS);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return read_object (hcl);
|
return (hcl->option.trait & HCL_CLI_MODE)? read_object_in_cli_mode(hcl): read_object(hcl);
|
||||||
}
|
}
|
||||||
|
|
||||||
hcl_oop_t hcl_read (hcl_t* hcl)
|
hcl_oop_t hcl_read (hcl_t* hcl)
|
||||||
|
Loading…
Reference in New Issue
Block a user