small change to support radixed number literals
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
parent
8a277c77c0
commit
4651fadcea
37
lib/read.c
37
lib/read.c
@ -234,13 +234,21 @@ static HCL_INLINE int is_linebreak (hcl_ooci_t c)
|
|||||||
return c == '\n'; /* make sure this is one of the space chars in is_spacechar() */
|
return c == '\n'; /* make sure this is one of the space chars in is_spacechar() */
|
||||||
}
|
}
|
||||||
|
|
||||||
static HCL_INLINE int is_digitchar (hcl_ooci_t c)
|
static HCL_INLINE int is_digit_char (hcl_ooci_t c)
|
||||||
{
|
{
|
||||||
/* TODO: support full unicode */
|
/* TODO: support full unicode */
|
||||||
return (c >= '0' && c <= '9');
|
return (c >= '0' && c <= '9');
|
||||||
}
|
}
|
||||||
|
|
||||||
static HCL_INLINE int is_xdigitchar (hcl_ooci_t c)
|
static HCL_INLINE int is_radixed_digit_char (hcl_ooci_t c, int radix)
|
||||||
|
{
|
||||||
|
if (c >= '0' && c <= '9') return (c - '0') < radix;
|
||||||
|
if (c >= 'a' && c <= 'z') return (c - 'a' + 10) < radix;
|
||||||
|
if (c >= 'A' && c <= 'Z') return (c - 'A' + 10) < radix;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HCL_INLINE int is_xdigit_char (hcl_ooci_t c)
|
||||||
{
|
{
|
||||||
/* TODO: support full unicode */
|
/* TODO: support full unicode */
|
||||||
return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f');
|
return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f');
|
||||||
@ -1867,7 +1875,7 @@ static int feed_process_token (hcl_t* hcl)
|
|||||||
HCL_ASSERT (hcl, TOKEN_NAME_LEN(hcl) >= 3);
|
HCL_ASSERT (hcl, TOKEN_NAME_LEN(hcl) >= 3);
|
||||||
for (i = 2; i < TOKEN_NAME_LEN(hcl); i++)
|
for (i = 2; i < TOKEN_NAME_LEN(hcl); i++)
|
||||||
{
|
{
|
||||||
HCL_ASSERT (hcl, is_xdigitchar(TOKEN_NAME_CHAR(hcl, i)));
|
HCL_ASSERT (hcl, is_xdigit_char(TOKEN_NAME_CHAR(hcl, i)));
|
||||||
v = v * 16 + HCL_CHAR_TO_NUM(TOKEN_NAME_CHAR(hcl, i), 16);
|
v = v * 16 + HCL_CHAR_TO_NUM(TOKEN_NAME_CHAR(hcl, i), 16);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1889,7 +1897,7 @@ static int feed_process_token (hcl_t* hcl)
|
|||||||
HCL_ASSERT (hcl, TOKEN_NAME_LEN(hcl) >= 3);
|
HCL_ASSERT (hcl, TOKEN_NAME_LEN(hcl) >= 3);
|
||||||
for (i = 2; i < TOKEN_NAME_LEN(hcl); i++)
|
for (i = 2; i < TOKEN_NAME_LEN(hcl); i++)
|
||||||
{
|
{
|
||||||
HCL_ASSERT (hcl, is_digitchar(TOKEN_NAME_CHAR(hcl, i)));
|
HCL_ASSERT (hcl, is_digit_char(TOKEN_NAME_CHAR(hcl, i)));
|
||||||
v = v * 10 + HCL_CHAR_TO_NUM(TOKEN_NAME_CHAR(hcl, i), 10);
|
v = v * 10 + HCL_CHAR_TO_NUM(TOKEN_NAME_CHAR(hcl, i), 10);
|
||||||
|
|
||||||
if (v > HCL_ERROR_MAX)
|
if (v > HCL_ERROR_MAX)
|
||||||
@ -2223,6 +2231,7 @@ static HCL_INLINE void init_flx_pn (hcl_flx_pn_t* pn, hcl_ooch_t start_digit)
|
|||||||
{
|
{
|
||||||
HCL_MEMSET (pn, 0, HCL_SIZEOF(*pn));
|
HCL_MEMSET (pn, 0, HCL_SIZEOF(*pn));
|
||||||
pn->start_digit = start_digit;
|
pn->start_digit = start_digit;
|
||||||
|
pn->radix = 10;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HCL_INLINE void init_flx_st (hcl_flx_st_t* st, hcl_ooch_t sign_c)
|
static HCL_INLINE void init_flx_st (hcl_flx_st_t* st, hcl_ooch_t sign_c)
|
||||||
@ -2640,7 +2649,7 @@ static int flx_hmarked_char (hcl_t* hcl, hcl_ooci_t c)
|
|||||||
c = 0;
|
c = 0;
|
||||||
for (i = 3; i < TOKEN_NAME_LEN(hcl); i++)
|
for (i = 3; i < TOKEN_NAME_LEN(hcl); i++)
|
||||||
{
|
{
|
||||||
if (!is_xdigitchar(TOKEN_NAME_CHAR(hcl, i)))
|
if (!is_xdigit_char(TOKEN_NAME_CHAR(hcl, i)))
|
||||||
{
|
{
|
||||||
hcl_setsynerrbfmt (hcl, HCL_SYNERR_CHARLIT, TOKEN_LOC(hcl), TOKEN_NAME(hcl),
|
hcl_setsynerrbfmt (hcl, HCL_SYNERR_CHARLIT, TOKEN_LOC(hcl), TOKEN_NAME(hcl),
|
||||||
"invalid hexadecimal character character literal %.*js", TOKEN_NAME_LEN(hcl), TOKEN_NAME_PTR(hcl));
|
"invalid hexadecimal character character literal %.*js", TOKEN_NAME_LEN(hcl), TOKEN_NAME_PTR(hcl));
|
||||||
@ -3015,7 +3024,7 @@ static int flx_plain_number (hcl_t* hcl, hcl_ooci_t c) /* number */
|
|||||||
{
|
{
|
||||||
hcl_flx_pn_t* pn = FLX_PN(hcl);
|
hcl_flx_pn_t* pn = FLX_PN(hcl);
|
||||||
|
|
||||||
if (is_digitchar(c))
|
if (is_radixed_digit_char(c, pn->radix))
|
||||||
{
|
{
|
||||||
ADD_TOKEN_CHAR (hcl, c);
|
ADD_TOKEN_CHAR (hcl, c);
|
||||||
pn->digit_count[pn->fpdec]++;
|
pn->digit_count[pn->fpdec]++;
|
||||||
@ -3049,7 +3058,7 @@ static int flx_plain_number (hcl_t* hcl, hcl_ooci_t c) /* number */
|
|||||||
{
|
{
|
||||||
if (!pn->fpdec && c == '.')
|
if (!pn->fpdec && c == '.')
|
||||||
{
|
{
|
||||||
if (pn->radix)
|
if (pn->radix != 10)
|
||||||
{
|
{
|
||||||
hcl_setsynerrbfmt (hcl, HCL_SYNERR_NUMLIT, FLX_LOC(hcl), HCL_NULL,
|
hcl_setsynerrbfmt (hcl, HCL_SYNERR_NUMLIT, FLX_LOC(hcl), HCL_NULL,
|
||||||
"invalid use of decimal point after radixed number '%.*js'",
|
"invalid use of decimal point after radixed number '%.*js'",
|
||||||
@ -3063,19 +3072,21 @@ static int flx_plain_number (hcl_t* hcl, hcl_ooci_t c) /* number */
|
|||||||
|
|
||||||
if (pn->digit_count[0] == 0)
|
if (pn->digit_count[0] == 0)
|
||||||
{
|
{
|
||||||
hcl_setsynerrbfmt (hcl, HCL_SYNERR_NUMLIT, TOKEN_LOC(hcl), TOKEN_NAME(hcl),
|
hcl_setsynerrbfmt (hcl, HCL_SYNERR_NUMLIT, TOKEN_LOC(hcl), HCL_NULL,
|
||||||
"invalid numeric literal with no digit before decimal point");
|
"invalid numeric literal with no digit '%.*js'",
|
||||||
|
TOKEN_NAME_LEN(hcl), TOKEN_NAME_PTR(hcl));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
else if (pn->fpdec && pn->digit_count[1] == 0)
|
else if (pn->fpdec && pn->digit_count[1] == 0)
|
||||||
{
|
{
|
||||||
hcl_setsynerrbfmt (hcl, HCL_SYNERR_NUMLIT, TOKEN_LOC(hcl), TOKEN_NAME(hcl),
|
hcl_setsynerrbfmt (hcl, HCL_SYNERR_NUMLIT, TOKEN_LOC(hcl), HCL_NULL,
|
||||||
"invalid numeric literal with no digit after decimal point");
|
"invalid numeric literal with no digit after decimal point '%.*js'",
|
||||||
|
TOKEN_NAME_LEN(hcl), TOKEN_NAME_PTR(hcl));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
non_digit_char:
|
non_digit_char:
|
||||||
FEED_WRAP_UP (hcl, (pn->fpdec? HCL_TOK_FPDECLIT: (pn->radix? HCL_TOK_RADNUMLIT: HCL_TOK_NUMLIT)));
|
FEED_WRAP_UP (hcl, (pn->fpdec? HCL_TOK_FPDECLIT: (pn->radix != 10? HCL_TOK_RADNUMLIT: HCL_TOK_NUMLIT)));
|
||||||
goto not_consumed;
|
goto not_consumed;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3275,7 +3286,7 @@ static int flx_signed_token (hcl_t* hcl, hcl_ooci_t c)
|
|||||||
hcl_flx_st_t* st = FLX_ST(hcl);
|
hcl_flx_st_t* st = FLX_ST(hcl);
|
||||||
|
|
||||||
HCL_ASSERT (hcl, st->char_count == 0);
|
HCL_ASSERT (hcl, st->char_count == 0);
|
||||||
if (is_digitchar(c))
|
if (is_digit_char(c))
|
||||||
{
|
{
|
||||||
/* the sign is not part of the pn->digit_count[0] but is
|
/* the sign is not part of the pn->digit_count[0] but is
|
||||||
* in the current token buffer. pn->digit_count[0] doesn't
|
* in the current token buffer. pn->digit_count[0] doesn't
|
||||||
|
@ -103,4 +103,16 @@ while (< i 52) {
|
|||||||
i := (+ i 1)
|
i := (+ i 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
i := 0xAbCd93481FFAABBCCDDEeFa12837281
|
||||||
|
j := 0o125715446440377652567463357357502240671201
|
||||||
|
k := 0b1010101111001101100100110100100000011111111110101010101110111100110011011101111011101111101000010010100000110111001010000001
|
||||||
|
l := 14272837210234798094990047170340811393
|
||||||
|
|
||||||
|
if (== i j) { printf "OK: i is equal to j\n" } \
|
||||||
|
else { printf "ERROR: i is not equal to j\n" }
|
||||||
|
if (== i k) { printf "OK: i is equal to k\n" } \
|
||||||
|
else { printf "ERROR: i is not equal to k\n" }
|
||||||
|
if (== i l) { printf "OK: i is equal to l\n" } \
|
||||||
|
else { printf "ERROR: i is not equal to l\n" }
|
||||||
} ## END
|
} ## END
|
||||||
|
@ -14,6 +14,10 @@ $include 10 ##ERROR: syntax error - $include target expected in place of '10'
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
0b ##ERROR: invalid numeric literal with no digit '0b'
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
##
|
##
|
||||||
|
|
||||||
x := (+ 10 20) "aaaa"; ##ERROR: syntax error - too many rvalues
|
x := (+ 10 20) "aaaa"; ##ERROR: syntax error - too many rvalues
|
||||||
|
Loading…
Reference in New Issue
Block a user