diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2019-03-12 06:22:15 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2019-03-12 06:22:15 -0700 |
commit | d0b35b7d272eaf4fbcf7754e25801739ddb2410d (patch) | |
tree | ebb220c8a2d04a93c685dfa0b4c7a707c62525be | |
parent | 4098bdfbe0406bfacfc8a1b46bfad38964cfd2df (diff) | |
download | txr-d0b35b7d272eaf4fbcf7754e25801739ddb2410d.tar.gz txr-d0b35b7d272eaf4fbcf7754e25801739ddb2410d.tar.bz2 txr-d0b35b7d272eaf4fbcf7754e25801739ddb2410d.zip |
parser: catch out-of-range floats.
* parser.l (out_of_range_float): New static function.
(grammar): Check for flo_str returning nil in several places;
that value is returned for out of range floats. This is not
documented!
* txr.1: Document athat flo-str returns nil for out-of-range
floats.
-rw-r--r-- | parser.l | 18 | ||||
-rw-r--r-- | txr.1 | 5 |
2 files changed, 20 insertions, 3 deletions
@@ -137,6 +137,12 @@ static void yyerrprepf(scanner_t *scanner, val fmt, ...) } } +static void out_of_range_float(scanner_t *scanner, val tok) +{ + yyerrorf(scanner, lit("out-of-range floating-point literal: ~a"), + tok, nao); +} + static wchar_t char_esc(int letter) { switch (letter) { @@ -344,7 +350,9 @@ UONLY {U2}{U}|{U3}{U}{U}|{U4}{U}{U}{U} || yy_top_state(yyscanner) == QWLIT) yy_pop_state(yyscanner); - yylval->val = flo_str(str); + if ((yylval->val = flo_str(str)) == nil) + out_of_range_float(yyg, str); + return NUMBER; } @@ -360,7 +368,9 @@ UONLY {U2}{U}|{U3}{U}{U}|{U4}{U}{U}{U} || yy_top_state(yyscanner) == QWLIT) yy_pop_state(yyscanner); - yylval->val = flo_str(str); + if ((yylval->val = flo_str(str)) == nil) + out_of_range_float(yyg, str); + return NUMBER; } @@ -372,7 +382,9 @@ UONLY {U2}{U}|{U3}{U}{U}|{U4}{U}{U}{U} || yy_top_state(yyscanner) == QWLIT) yy_pop_state(yyscanner); - yylval->val = flo_str(str); + if ((yylval->val = flo_str(str)) == nil) + out_of_range_float(yyg, str); + return NUMBER; } @@ -36741,6 +36741,11 @@ part denoted by the letter or .codn e , an optional sign and one or more optional exponent digits. +If the value specified by +.meta string +is out of range of the floating-point representation, then +.code nil +is returned. The .code num-str |