From f905f1e4d1c77410931dc5ebfd8bcf466864a3e2 Mon Sep 17 00:00:00 2001 From: Bruce Hill Date: Mon, 19 Jan 2026 20:51:26 -0500 Subject: Allow parsing `123.foo()` as `(123).foo()` --- src/parse/numbers.c | 1 + src/parse/utils.c | 6 ++++++ src/parse/utils.h | 1 + 3 files changed, 8 insertions(+) (limited to 'src') diff --git a/src/parse/numbers.c b/src/parse/numbers.c index 4e746525..4e7937d9 100644 --- a/src/parse/numbers.c +++ b/src/parse/numbers.c @@ -57,6 +57,7 @@ ast_t *parse_num(parse_ctx_t *ctx, const char *pos) { size_t len = strspn(pos, "0123456789_"); if (strncmp(pos + len, "..", 2) == 0) return NULL; + else if (pos[len] == '.' && is_xid_start_next(pos + len + 1)) return NULL; else if (pos[len] == '.') len += 1 + strspn(pos + len + 1, "0123456789"); else if (pos[len] != 'e' && pos[len] != 'f' && pos[len] != '%') return NULL; if (pos[len] == 'e') { diff --git a/src/parse/utils.c b/src/parse/utils.c index 03e0ebcd..2df3f1a9 100644 --- a/src/parse/utils.c +++ b/src/parse/utils.c @@ -57,6 +57,12 @@ size_t match(const char **pos, const char *target) { return len; } +bool is_xid_start_next(const char *pos) { + ucs4_t point = 0; + u8_next(&point, (const uint8_t *)pos); + return uc_is_property_xid_start(point); +} + bool is_xid_continue_next(const char *pos) { ucs4_t point = 0; u8_next(&point, (const uint8_t *)pos); diff --git a/src/parse/utils.h b/src/parse/utils.h index b8fb0756..89b1cc82 100644 --- a/src/parse/utils.h +++ b/src/parse/utils.h @@ -22,6 +22,7 @@ bool indent(parse_ctx_t *ctx, const char **pos); const char *eol(const char *str); PUREFUNC int64_t get_indent(parse_ctx_t *ctx, const char *pos); const char *unescape(parse_ctx_t *ctx, const char **out); +bool is_xid_start_next(const char *pos); bool is_xid_continue_next(const char *pos); bool newline_with_indentation(const char **out, int64_t target); bool match_separator(parse_ctx_t *ctx, const char **pos); -- cgit v1.2.3