ไทย

เครื่องมือสำหรับนักพัฒนา · ตัวแปลงไวยากรณ์

ปัญหาของนอร์เวย์: YAML 1.1 กับ 1.2 และเหตุใด NO จึงกลายเป็นเท็จ

· พื้นหลัง

yaml ข้อมูลรูปแบบ การดีบัก

ข้อความ NO ยังคงเป็นสตริงในขณะที่เส้นทางบูลีนแบบเดิมถูกขีดฆ่า
ภาพประกอบเวกเตอร์ต้นฉบับ ToolAcre

ใน YAML 1.1 ค่าที่ไม่มีเครื่องหมายคำพูด NO คือบูลีน ซึ่งเป็นสาเหตุที่นอร์เวย์หายไปจากรายชื่อประเทศ โพสต์นี้บอกเล่าประวัติการพิมพ์โดยนัยของ YAML สิ่งที่ข้อกำหนด 1.2 เปลี่ยนแปลงไป และสาเหตุที่ปัญหายังคงมีอยู่ในเครื่องมือในปัจจุบัน

รายชื่อประเทศที่ขาดหายไป — NO ถูกแยกวิเคราะห์ว่าเป็นเท็จ และรายงานข้อผิดพลาดจากสำนักงานออสโล

ข้อผิดพลาดแบบคลาสสิกคือรหัสประเทศที่ไม่มีเครื่องหมายคำพูด `NO` กลายเป็นเท็จ การทดสอบของ ToolAcre พิสูจน์ว่าไม่ได้เกิดขึ้นที่นี่: ตัวเลือกสคีมาทั้งสองเก็บ `NO`, ใช่, ไม่ใช่, เปิดและปิดเป็นสตริง การเปิดเรื่องโดยที่นอร์เวย์หายไปในแผงนี้จะขัดแย้งกับการดำเนินการ

ตัวอย่างยังคงมีประโยชน์เป็นคำเตือนความเข้ากันได้ เมื่อผู้บริโภค YAML รายอื่นใช้กฎเดิม ผู้เขียนของ ToolAcre จะเสนอราคาสตริงที่ไม่ชัดเจน เพื่อให้ผู้อ่านดาวน์สตรีมไม่ต้องตีความกฎเหล่านั้นใหม่ ตัวอ่านและตัวเขียนได้รับการกำหนดค่าเพื่อป้องกันความล้มเหลวตามที่โครงร่างอธิบาย

นอร์เวย์ไม่หายไปในตัวแปลงนี้: NO ยังคงเป็นข้อความ

พื้นที่เก็บข้อมูลนี้บันทึก JSON และ Core schema ที่ถูกจำกัดของ js-yaml รวมถึงพฤติกรรมสเกลาร์ที่สังเกตได้ ไม่มีแหล่งที่มาสำหรับต้นกำเนิด 2001 ของ YAML ความตั้งใจของผู้เขียน หรือการถกเถียงเกี่ยวกับการออกแบบทางประวัติศาสตร์ การอ้างสิทธิ์เหล่านั้นจะถูกละเว้นแทนที่จะสร้างใหม่จากหน่วยความจำ

กลไกปัจจุบันก็เพียงพอแล้วสำหรับแนวทางปฏิบัติ ความละเอียดสเกลาร์ธรรมดาเกิดขึ้นภายใต้สคีมาที่เลือก ค่าที่ยกมายังคงเป็นข้อความ แท็กที่ไม่รองรับจะถูกปฏิเสธ หลักฐานเกี่ยวกับโค้ดไม่ควรขยายไปสู่ประวัติมาตรฐานที่ไม่มีแหล่งที่มา

หลักฐานที่เก็บข้อมูลครอบคลุมการกำหนดค่าตัวแยกวิเคราะห์ปัจจุบัน ไม่ใช่ประวัติต้นทางของ YAML

YAML 1.1 โดยทั่วไปถือว่าใช่ ไม่ใช่ เปิดและปิดตัวแปรเป็นบูลีน นั่นอธิบายว่าทำไมนอร์เวย์ถึงมีปัญหาในระบบนิเวศบางแห่ง ToolAcre ไม่เปิดเผยสวิตช์ 1.1 และไม่เคยแสดงการแปลงฐานแปดหกฐานสิบหกหรือแบบเดิมภายใต้โหมดดังกล่าว

ใช้อันตรายเพื่อตรวจสอบเอาต์พุตของพาร์เซอร์ภายนอก ไม่ใช่เพื่อทำนายแผงนี้ หากเครื่องมืออื่นสร้างเท็จ ให้บันทึกไลบรารีและสคีมาของมัน ผลลัพธ์ของ ToolAcre สามารถทำหน้าที่เป็นการอ่าน YAML 1.2 ที่ตัดกัน แต่ไม่ใช่เป็นการพิสูจน์ว่าการใช้งานอื่นได้รับการกำหนดค่าไม่ถูกต้องสำหรับสัญญา

Legacy YAML 1.1 บูลีนอธิบายอันตรายแต่ไม่ได้เปิดใช้งานที่นี่

สคีมา JSON ที่เข้มงวดรู้จักเฉพาะการสะกดแบบสเกลาร์ที่เข้ากันได้กับ JSON เท่านั้น Core ยังแก้ไขค่าเครื่องหมายตัวหนอนและค่าว่างให้เป็นค่าว่าง เลขฐานสิบหก หรือจำนวนเต็ม `0o` และตัวเลขที่ไม่สิ้นสุด ไม่มีการขยายคำศัพท์แบบบูลีนเกินกว่าจริงและเท็จ

Core Infinity และ NaN กลายเป็นโมฆะในภายหลังใน JSON โดยมีคำเตือนเนื่องจาก JSON ไม่มีการนำเสนอสำหรับสิ่งเหล่านั้น ความแตกต่างระหว่างตัวเลือกสคีมาจึงมองเห็นได้และบางครั้งก็สูญเสียไป แม้ว่าค่าของนอร์เวย์จะคงที่ก็ตาม

ตัวเลือกที่จัดส่งทั้งสองแบบคือสคีมา YAML 1.2

ลักษณะการทำงานแบบเดิมจะคงอยู่ไม่ว่าค่าดีฟอลต์ของ parser หรือแบบแผนของแอปพลิเคชันจะยังคงอยู่ก็ตาม ตัวแปลงไม่สามารถจัดทำไลบรารีหรือเวอร์ชันเหล่านั้นจากหลักฐานที่เก็บได้ ทดสอบผู้บริโภคจริงด้วยอุปกรณ์ที่มีคำที่ไม่ชัดเจนและตัวเลขที่คล้ายคลึงกัน

ผู้เขียน YAML ของ ToolAcre เพิ่มเครื่องหมายคำพูดป้องกันรอบสตริงที่ผู้อ่านรุ่นเก่าอาจพิมพ์แตกต่างออกไป รวมถึง `NO`, `yes`, `1.0`, `0755` และข้อความที่ดูวันที่ ผลลัพธ์ความเข้ากันได้นี้สามารถวัดได้และปลอดภัยกว่าคำสั่งแบบครอบคลุมเกี่ยวกับการนำ parser สมัยใหม่ไปใช้

อันตรายยังคงมีอยู่ใน parsers อื่น ตรวจสอบพวกเขาแทนที่จะสรุปจากเครื่องมือนี้

แปลง `countries: [SE, NO, DK]`, `answers: [yes, no, on, off]`, `mode: 0755`, `octal: 0o755`, `version: 1.10` และ `empty:` ภายใต้เข้มงวด ค่าทั้งหมดยกเว้น JSON-ค่าดั้งเดิมจะยังคงเป็นสตริง ภายใต้ Core ฐานแปดจะกลายเป็น 493 และช่องว่างจะกลายเป็นโมฆะ ประเทศและคำตอบยังคงเป็นสตริง

อ้างอิงทุกโทเค็นเพื่อบังคับข้อความ จากนั้นเขียนผลลัพธ์ JSON กลับไปที่ YAML และตรวจสอบเครื่องหมายคำพูดที่ซีเรียลไลเซอร์เลือก การเปรียบเทียบที่แม่นยำของโค้ดนี้เผยให้เห็นกฎของเครื่องมือโดยไม่ต้องแสร้งทำเป็นว่าดำเนินการโหมด YAML 1.1 ที่ไม่มีอยู่

ตัวอย่างการทำงาน: รหัสประเทศและสเกลาร์ที่มีลักษณะคล้ายกันภายใต้สคีมาสองรายการที่จัดส่ง

สวิตช์ตัวแยกวิเคราะห์เฉพาะภาษา ค่าเริ่มต้นของเวอร์ชัน และตัวหุ้มกรอบงานอยู่นอกการดำเนินการนี้ ชื่อและพฤติกรรมของพวกเขาเปลี่ยนแปลงอย่างอิสระ ปรึกษาและทดสอบส่วนประกอบที่จะใช้การกำหนดค่า

แผงยังไม่ตรวจสอบความหมายของแอปพลิเคชัน การเก็บ `NO` ไว้เป็นสตริงเป็นสิ่งจำเป็นสำหรับรหัสประเทศ แต่ไม่สามารถพิสูจน์ได้ว่า `NO` เป็นค่าที่อนุญาตในสคีมาเฉพาะ

ประเด็นสำคัญ: อ้างอิงสตริงของคุณ รู้เวอร์ชันของ parser ของคุณ — และการแปลง YAML เป็น JSON ในเบราว์เซอร์ทำให้การพิมพ์โดยนัยมองเห็นได้อย่างไร

ข้อความอ้างอิงที่สามารถพิมพ์ซ้ำได้ ทราบสคีมาที่ใช้งานจริง และทดสอบผู้บริโภค ตัวเลือก YAML 1.2 สองตัวของ ToolAcre ทำให้มองเห็นความแตกต่างที่จำกัดได้ชัดเจน และจงใจหลีกเลี่ยงกับดักบูลีนแบบเดิม

บทเรียนไม่ใช่ว่า parser ทุกคนจะมีพฤติกรรมแบบเดียวกัน การพิมพ์โดยนัยคือการกำหนดค่า และตัวแปลงควรระบุการกำหนดค่านั้น นี่คือหลักฐานที่ระบุว่านอร์เวย์ยังคงอยู่ `"NO"`

เมื่อการกำหนดค่าข้ามระบบ ให้เพิ่มฟิกซ์เจอร์การทำงานร่วมกันที่มีโทเค็นที่ไม่ชัดเจนทุกรายการที่โดเมนของคุณอนุญาต แปลงหรือแยกวิเคราะห์ในผู้บริโภคจริงแต่ละราย และเปรียบเทียบค่าที่พิมพ์ ไม่ได้แสดงผล YAML ซึ่งจะจับตารางบูลีนแบบเดิม กฎฐานแปด หรือความแตกต่างของค่าว่างก่อนที่รายชื่อประเทศหรือโหมดสิทธิ์จะถึงการใช้งานจริง การอ้างถึงสตริงที่รู้จักยังคงเป็นการป้องกันแบบพกพาที่ง่ายที่สุด เนื่องจากจะบันทึกเจตนาในเอกสารแทนที่จะอาศัยค่าเริ่มต้นของสภาพแวดล้อม