From 75bde660d9f9cae7b7310971d03b38307550cba5 Mon Sep 17 00:00:00 2001 From: "peng.li24" <734991033@qq.com> Date: Sat, 29 Aug 2026 17:14:42 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20scanner=20=E5=AD=97=E7=AC=A6=E4=B8=B2?= =?UTF-8?q?=E5=AD=97=E9=9D=A2=E9=87=8F=E8=BD=AC=E4=B9=89=EF=BC=88\n=20\t?= =?UTF-8?q?=20\r=20\0=EF=BC=89+=20deps=20=E5=8D=87=20v0.2.3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude --- deps.json | 6 +++--- layout/src/scanner.rs | 28 +++++++++++++++++++++++++--- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/deps.json b/deps.json index d780d11e..3278f4e1 100644 --- a/deps.json +++ b/deps.json @@ -1,7 +1,7 @@ { - "kvspace": "v0.2.2", - "kvspace-c": "v0.2.2", - "kvspace-durable": "v0.2.2", + "kvspace": "v0.2.3", + "kvspace-c": "v0.2.3", + "kvspace-durable": "v0.2.3", "blockmalloc": "v0.1.4", "slotsboxmalloc": "v0.1.4" } diff --git a/layout/src/scanner.rs b/layout/src/scanner.rs index c2c6ba7e..5ebaa4ee 100644 --- a/layout/src/scanner.rs +++ b/layout/src/scanner.rs @@ -145,6 +145,16 @@ fn single_char_token(c: u8) -> Option { }) } +fn escaped_byte(c: u8) -> u8 { + match c { + b'n' => b'\n', + b't' => b'\t', + b'r' => b'\r', + b'0' => 0, + other => other, + } +} + fn scan_quoted(src: &[u8], mut i: usize, quote: u8) -> (String, usize) { i += 1; let mut b: Vec = Vec::new(); @@ -153,7 +163,7 @@ fn scan_quoted(src: &[u8], mut i: usize, quote: u8) -> (String, usize) { if c == b'\\' { i += 1; if i < src.len() { - b.push(src[i]); + b.push(escaped_byte(src[i])); i += 1; } continue; @@ -177,7 +187,7 @@ fn scan_triple_quoted(src: &[u8], mut i: usize) -> (String, usize) { if c == b'\\' { i += 1; if i < src.len() { - b.push(src[i]); + b.push(escaped_byte(src[i])); i += 1; } continue; @@ -401,9 +411,21 @@ pub fn scan(src: &str) -> Vec { let start = i; i += 1; while i < src.len() { - // ·(U+00B7)在绝对路径里是路径字符,不是成员分隔符 + // ·(U+00B7)与 .(释放给小数 key)是路径字符;· 后的坐标段 [0,1] 是成员链。 if src[i] == 0xC2 && i + 1 < src.len() && src[i + 1] == 0xB7 { i += 2; + if i < src.len() && src[i] == b'[' { + while i < src.len() && src[i] != b']' { + i += 1; + } + if i < src.len() { + i += 1; // 跳过 ] + } + } + continue; + } + if src[i] == b'.' { + i += 1; continue; } if is_token_delim(src[i]) {