Công cụ dành cho nhà phát triển · Trình chuyển đổi cú pháp
Vấn đề ở Na Uy: YAML 1.1 so với 1.2 và tại sao KHÔNG trở thành sai
· Lý lịch
yaml data-formats gỡ lỗi
Trong YAML 1.1 giá trị không được trích dẫn NO là giá trị boolean, đó là lý do Na Uy biến mất khỏi danh sách quốc gia. Bài đăng này cho biết lịch sử thao tác nhập ẩn của YAML, thông số kỹ thuật 1.2 đã thay đổi gì và tại sao sự cố vẫn tiếp diễn trong công cụ ngày nay.
Danh sách các quốc gia bị thiếu một quốc gia - KHÔNG được phân tích là sai và báo cáo lỗi từ văn phòng Oslo
Lỗi cổ điển là mã quốc gia không được trích dẫn `NO` trở thành sai. Các thử nghiệm của ToolAcre chứng minh rằng điều đó không xảy ra ở đây: cả hai tùy chọn lược đồ đều giữ `NO`, có, không, bật và tắt dưới dạng chuỗi. Câu chuyện mở đầu bằng việc Na Uy biến mất bên trong bảng này sẽ mâu thuẫn với việc thực hiện.
Ví dụ này vẫn hữu ích như một cảnh báo về khả năng tương thích. Khi người tiêu dùng YAML khác sử dụng các quy tắc cũ, người viết của ToolAcre sẽ trích dẫn các chuỗi không rõ ràng để người đọc ở cuối không diễn giải lại chúng. Đầu đọc và đầu ghi được cấu hình để ngăn ngừa lỗi mà phác thảo mô tả.
Na Uy không biến mất trong trình chuyển đổi này: KHÔNG giữ nguyên văn bản
Kho lưu trữ này ghi lại các lược đồ cốt lõi và JSON bị hạn chế của js-yaml cũng như hành vi vô hướng được quan sát của chúng. Nó không chứa các nguồn về nguồn gốc 2001 của YAML, ý định của tác giả hoặc các cuộc tranh luận về thiết kế lịch sử. Những tuyên bố đó bị bỏ qua thay vì được xây dựng lại từ bộ nhớ.
Cơ chế hiện tại là đủ cho một hướng dẫn thực tế. Độ phân giải vô hướng đơn giản xảy ra theo lược đồ đã chọn; giá trị được trích dẫn vẫn là văn bản; các thẻ không được hỗ trợ sẽ bị từ chối. Bằng chứng về mã không nên bị kéo dài vào lịch sử tiêu chuẩn không có nguồn gốc.
Bằng chứng kho lưu trữ bao gồm cấu hình trình phân tích cú pháp hiện tại, không phải lịch sử nguồn gốc của YAML
YAML 1.1 thường được coi là các biến thể có, không, bật và tắt dưới dạng boolean. Điều đó giải thích tại sao vấn đề Na Uy tồn tại ở một số hệ sinh thái. ToolAcre không hiển thị công tắc 1.1 và không bao giờ thể hiện chuyển đổi bát phân thập lục phân hoặc hệ bát phân kế thừa trong chế độ như vậy.
Sử dụng mối nguy hiểm để xem lại đầu ra của trình phân tích cú pháp bên ngoài, không phải để dự đoán bảng này. Nếu một công cụ khác tạo ra sai, hãy ghi lại thư viện và lược đồ của nó. Kết quả của ToolAcre có thể đóng vai trò là kết quả đọc YAML 1.2 tương phản, nhưng không phải là bằng chứng cho thấy việc triển khai khác được định cấu hình không chính xác cho hợp đồng của nó.
Các boolean YAML 1.1 kế thừa giải thích mối nguy hiểm nhưng không được bật ở đây
Lược đồ JSON nghiêm ngặt chỉ nhận dạng các cách viết vô hướng tương thích với JSON. Ngoài ra, Core còn phân giải các giá trị dấu ngã và giá trị trống thành số nguyên null, thập lục phân hoặc `0o` và số không hữu hạn. Cả hai đều không mở rộng vốn từ vựng Boolean ngoài phạm vi đúng và sai.
Core Infinity và NaN sau đó trở thành rỗng trong JSON kèm theo cảnh báo vì JSON không có đại diện nào cho chúng. Do đó, sự khác biệt giữa các tùy chọn lược đồ có thể nhìn thấy được và đôi khi bị mất đi, mặc dù bản thân giá trị Na Uy vẫn ổn định.
Cả hai tùy chọn được giao đều là lược đồ YAML 1.2
Hành vi kế thừa vẫn tồn tại ở bất cứ nơi nào mặc định của trình phân tích cú pháp hoặc quy ước ứng dụng giữ lại nó. Trình chuyển đổi không thể kiểm kê các thư viện hoặc phiên bản đó từ bằng chứng kho lưu trữ. Kiểm tra người tiêu dùng thực tế bằng một thiết bị cố định có chứa các từ mơ hồ và các dạng số tương tự.
Người viết YAML của ToolAcre thêm các trích dẫn bảo vệ xung quanh các chuỗi mà những người đọc lớn tuổi hơn có thể nhập theo cách khác, bao gồm `NO`, `yes`, `1.0`, `0755` và văn bản hiển thị ngày tháng. Kết quả tương thích này có thể đo lường được và an toàn hơn một tuyên bố chung chung về việc áp dụng trình phân tích cú pháp hiện đại.
Mối nguy hiểm vẫn tồn tại trong các trình phân tích cú pháp khác; xác minh chúng thay vì khái quát hóa từ công cụ này
Chuyển đổi `countries: [SE, NO, DK]`, `answers: [yes, no, on, off]`, `mode: 0755`, `octal: 0o755`, `version: 1.10` và `empty:`. Theo mức nghiêm ngặt, tất cả ngoại trừ giá trị gốc JSON vẫn là chuỗi. Trong Core, bát phân trở thành 493 và trống trở thành rỗng; đất nước và các từ trả lời vẫn là chuỗi.
Trích dẫn mọi mã thông báo để buộc văn bản. Sau đó ghi kết quả JSON trở lại YAML và kiểm tra các trích dẫn mà trình tuần tự hóa chọn. So sánh mã chính xác này sẽ tiết lộ các quy tắc của công cụ mà không giả vờ thực thi chế độ YAML 1.1 không tồn tại.
Ví dụ đã hoạt động: mã quốc gia và dạng tương tự vô hướng theo hai lược đồ được vận chuyển
Các chuyển đổi trình phân tích cú pháp dành riêng cho ngôn ngữ, mặc định của phiên bản và trình bao bọc khung nằm ngoài phạm vi triển khai này. Tên và hành vi của họ thay đổi độc lập. Tư vấn và kiểm tra thành phần sẽ tiêu thụ cấu hình.
Bảng điều khiển cũng không xác nhận ngữ nghĩa của ứng dụng. Việc giữ `NO` dưới dạng chuỗi là cần thiết cho mã quốc gia nhưng không thể chứng minh rằng `NO` là giá trị được phép trong một lược đồ cụ thể.
Bài học rút ra: trích dẫn chuỗi của bạn, biết phiên bản trình phân tích cú pháp của bạn — và cách chuyển đổi YAML thành JSON trong trình duyệt giúp hiển thị nội dung nhập ẩn
Văn bản trích dẫn có thể được gõ lại, biết lược đồ thực sự đang được sử dụng và kiểm tra người tiêu dùng. Hai tùy chọn ToolAcre của YAML 1.2 làm cho sự khác biệt hạn chế của chúng trở nên rõ ràng và cố tình tránh bẫy Boolean kế thừa.
Bài học không phải là mọi trình phân tích cú pháp đều hoạt động theo một cách. Đó là cách gõ ngầm là cấu hình và trình chuyển đổi sẽ nêu rõ cấu hình đó. Ở đây có bằng chứng cho thấy Na Uy vẫn `"NO"`.
Khi cấu hình xuyên hệ thống, hãy thêm một thiết bị cố định có khả năng tương tác chứa mọi mã thông báo không rõ ràng mà miền của bạn cho phép. Chuyển đổi hoặc phân tích cú pháp nó trong từng người tiêu dùng thực và so sánh các giá trị đã nhập, không được hiển thị YAML. Thao tác này sẽ nắm bắt bảng Boolean cũ, quy tắc bát phân hoặc chênh lệch giá trị trống trước khi danh sách quốc gia hoặc chế độ cấp phép được đưa vào sản xuất. Trích dẫn các chuỗi đã biết vẫn là cách bảo vệ di động đơn giản nhất vì nó ghi lại ý định trong tài liệu thay vì dựa vào các mặc định của môi trường.