diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2024-07-22 08:07:19 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2024-07-22 08:07:19 -0700 |
commit | e5a6c31be5da033320f6414fab0b31ef88f3260c (patch) | |
tree | a2f55843aab915431f18ee0946b0eae84a9dbfcd /parser.l | |
parent | 74d7277b99dfe15797464f41adc5204c728eca6b (diff) | |
download | txr-e5a6c31be5da033320f6414fab0b31ef88f3260c.tar.gz txr-e5a6c31be5da033320f6414fab0b31ef88f3260c.tar.bz2 txr-e5a6c31be5da033320f6414fab0b31ef88f3260c.zip |
json: new *read-json-int* variable.
* parser.h (struct parser): New member, read_json_int.
* parser.c (read_json_int_s): New symbol variable
for *read-json-int* symbol.
(parser_common_init): Look up value of *read-json-int*
and store in read_json_int struct member.
(parse_init): Initialize read_json_int_s with interned
symbol and also register the dynamic variable.
* parser.l (grammar): Extend the {JNUM} rule to check
the read_json_int flag and produce an integer value if
the lexeme does not contain a decimal point, e or E.
* tests/010/json.tl: New tests.
* txr.1: Documented.
* lex.yy.c.shipped: Regenerated.
Diffstat (limited to 'parser.l')
-rw-r--r-- | parser.l | 7 |
1 files changed, 6 insertions, 1 deletions
@@ -1249,8 +1249,13 @@ NJPUNC [^(){},:\[\]"~*^ \t\r\n] } <JSON>{JNUM} { - if ((yylval->val = flo_str_utf8(yytext)) == nil) + if (yyextra->read_json_int && !strpbrk(yytext, ".eE")) { + wchar_t *wtxt = utf8_dup_from(yytext); + yylval->val = int_str_wc(wtxt, num(10)); + free(wtxt); + } else if ((yylval->val = flo_str_utf8(yytext)) == nil) { out_of_range_float(yyg, yytext); + } return NUMBER; } |