Tag: parsing
11 รายการ
Blog
LeetCode #394 Decode String: แกะวงเล็บซ้อนด้วย stack
เทียบ 3 วิธีถอดข้อความ k[encoded] พร้อม parser, stack, Python, Java, complexity และ decision table
Zig std.mem.tokenizeAny: แยกคำเมื่อ delimiter มีหลายตัว
ใช้ tokenizeAny แยกข้อความด้วยช่องว่าง comma slash หรือ pipe โดยไม่คืน token ว่าง พร้อมเทียบ tokenizeScalar และ splitAny
Rust slice::split_off: หยิบช่วงออกจากมุมมองโดยไม่ allocate
ใช้ split_off กับ &mut &[T] เพื่อเลื่อน cursor ของ slice อย่างปลอดภัย พร้อมแยกจาก Vec::split_off และจัดการ out-of-bounds
Java Scanner.tokens: เปลี่ยน token stream เป็น pipeline ที่ปิด resource ชัดเจน
ใช้ Scanner.tokens กับ delimiter, filter และ try-with-resources พร้อม Java 17 assertions
Zig splitBackwardsSequence: แยก path จากด้านท้ายโดยไม่ reverse ข้อมูล
ใช้ std.mem.splitBackwardsSequence ดึงชื่อไฟล์และโฟลเดอร์จากท้าย slice พร้อมรู้ empty field, delimiter หลายไบต์ และ lifetime
Java OptionalInt.stream: ต่อค่าที่อาจไม่มีเข้ากับ IntStream
แปลงผล parse แบบ zero-or-one ให้เข้ากับ primitive stream โดยไม่ใช้ sentinel หรือ boxing เกินจำเป็น
Zig indexOfScalarPos: ค้นตัวคั่นต่อจาก cursor โดยไม่ตัด slice ซ้ำ
ใช้ std.mem.indexOfScalarPos ทำ parser แบบเดิน cursor พร้อมเข้าใจ null และขอบเขตเริ่มค้นหา
Python csv.Sniffer: เดารูปแบบไฟล์ได้ แต่ต้องมี fallback ที่คาดเดาได้
ใช้ Sniffer ตรวจ delimiter จาก sample พร้อมรับมือข้อมูลสั้น กำกวม และ input ที่ไม่น่าเชื่อถือ
Zig splitSequence: แยก delimiter หลายไบต์โดยยังเห็นช่องว่างระหว่างคู่ติดกัน
ใช้ std.mem.splitSequence ทำ parser รูปแบบเล็ก ๆ พร้อมเข้าใจ empty field, lifetime และความต่างจาก splitAny
Rust map_while: แปลงข้อมูลจนเจอเส้นแบ่ง แล้วหยุดอย่างมีขอบเขต
ใช้ Iterator::map_while อ่าน prefix ที่แปลงได้ พร้อมอธิบายว่า item ที่ทำให้หยุดถูก consume และ iterator ไม่ fused

Zig Workshop #3: แยกวิเคราะห์ log โดยไม่ขอหน่วยความจำแม้แต่ไบต์เดียว
เขียน parser สำหรับ nginx combined log ที่ไม่ copy อะไรเลย — ทุกฟิลด์เป็น slice ที่ชี้กลับเข้าไปในบรรทัดต้นทาง, error set ที่บอกได้ว่าผิดตรงไหน, โหมด --strict และบทเรียนเรื่องอายุของข้อมูลที่คอมไพเลอร์ Zig ไม่ได้ตรวจให้