aboutsummaryrefslogtreecommitdiff
path: root/src/parse
diff options
context:
space:
mode:
Diffstat (limited to 'src/parse')
-rw-r--r--src/parse/numbers.c1
-rw-r--r--src/parse/utils.c6
-rw-r--r--src/parse/utils.h1
3 files changed, 8 insertions, 0 deletions
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);