From keithp at keithp.com Wed Nov 3 18:57:08 2021 From: keithp at keithp.com (Keith Packard) Date: Wed, 3 Nov 2021 18:57:08 -0700 (PDT) Subject: [Nickle] nickle: Branch 'master' Message-ID: <20211104015708.5F2183F310FD@elaine.keithp.com> lex.l | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) New commits: commit a390a7a064193ab727d5dcab609467e69ddf3ca1 Author: Keith Packard Date: Wed Nov 3 18:54:58 2021 -0700 Support C-like hex float values in lexer This means 0x1.1p2 will result in the value 4.25 Signed-off-by: Keith Packard diff --git a/lex.l b/lex.l index 48a1f33..98e48af 100644 --- a/lex.l +++ b/lex.l @@ -613,7 +613,7 @@ has_member { yylval.ints = HASMEMBER; return HASMEMBER; } yylval.value = atov(yytext+2, 16); return HEX_NUM; } -0x(([0-9a-fA-F_]+((\.[0-9a-fA-F_]*(\{[0-9a-fA-F_]+\})?)?))|(\.[0-9a-fA-F_]+)|(\.[0-9a-fA-F_]*\{[0-9a-fA-F_]+\}))(([Ee][-+]?[0-9a-fA-F_]+)?) { +0x(([0-9a-fA-F_]+((\.[0-9a-fA-F_]*(\{[0-9a-fA-F_]+\})?)?))|(\.[0-9a-fA-F_]+)|(\.[0-9a-fA-F_]*\{[0-9a-fA-F_]+\}))(([Pp][-+]?[0-9a-fA-F_]+)?) { yylval.value = aetov (yytext+2, 16); return HEX_FLOAT; } @@ -840,6 +840,7 @@ aetov (char *s, int base) ENTER (); char *int_part, *frac_part, *rep_part, *exp_part, *next; int sign, int_len = -1, frac_len = -1, rep_len = -1, exp_frac_len = -1, esign; + int exp_base = 10; Value v, sv; int_part = s; @@ -869,7 +870,14 @@ aetov (char *s, int base) RETURN(Void); /* can't happen */ } } - exp_part = scan_number(next, 'e', &exp_frac_len); + exp_part = NULL; + if (base == 10) { + exp_part = scan_number(next, 'e', &exp_frac_len); + exp_base = 10; + } else if (base == 16) { + exp_part = scan_number(next, 'p', &exp_frac_len); + exp_base = 2; + } if (exp_part) { if (frac_len < 0) frac_len = exp_frac_len; @@ -903,7 +911,7 @@ aetov (char *s, int base) } if (exp_part) { - sv = Pow (NewInt (base), atov (exp_part, base)); + sv = Pow (NewInt (exp_base), atov (exp_part, 10)); if (esign > 0) v = Times (v, sv); else