Khi mọi người nói "X không soạn", ý nghĩa của chúng bằng cách "soạn" thực sự chỉ có nghĩa là "đặt lại với nhau", và những gì và như thế nào bạn đặt chúng lại với nhau có thể rất khác nhau, tùy thuộc vào những gì chính xác "X" là.
Ngoài ra, khi họ nói "không sáng tác", họ có thể có nghĩa là một số điều hơi khác nhau:
- Bạn không thể đặt hai chữ X cùng nhau.
- Bạn có thể đặt hai X cùng nhau, nhưng kết quả có thể không phải là X (IOW: X không được đóng trong chế phẩm .)
- Bạn có thể đặt hai X cùng nhau, nhưng kết quả X có thể không hoạt động theo cách bạn mong đợi.
Một ví dụ cho # 1 là các trình phân tích cú pháp với máy quét / lexers. Bạn có thể nghe thấy cụm từ "máy quét / từ vựng không sáng tác". Điều đó không thực sự đúng. Ý họ là "trình phân tích cú pháp sử dụng một giai đoạn từ vựng riêng biệt không sáng tác".
Tại sao bạn muốn soạn thảo trình phân tích cú pháp? Chà, hãy tưởng tượng bạn là một nhà cung cấp IDE như JetBrains, Eclipse Foundation, Microsoft hoặc Embarcadero và bạn muốn xây dựng một IDE cho một khung web. Trong phát triển web điển hình, chúng tôi thường trộn lẫn các ngôn ngữ. Bạn có tệp HTML với <script>
các thành phần có chứa ECMAScript và<style>
các phần tử chứa CSS. Bạn có các tệp mẫu có chứa HTML, một số ngôn ngữ lập trình và một số metasyntax ngôn ngữ mẫu. Bạn không muốn viết các công cụ tô sáng cú pháp khác nhau cho "Python", "Python được nhúng trong một mẫu", "CSS", "CSS trong HTML", "ECMASCript", "ECMAScript trong HTML", "HTML", "HTML trong một mẫu ", vân vân và vân vân. Bạn muốn viết một cú pháp tô sáng cho Python, một cho HTML, một cho ngôn ngữ mẫu, sau đó kết hợp ba thành một cú pháp tô sáng cho một tệp mẫu.
Tuy nhiên, một lexer phân tích toàn bộ tệp thành một luồng mã thông báo, điều này chỉ có ý nghĩa đối với một ngôn ngữ đó. Trình phân tích cú pháp cho ngôn ngữ khác không thể hoạt động với mã thông báo mà trình từ vựng chuyển nó. Ví dụ: các trình phân tích cú pháp Python thường được viết theo cách mà trình từ chối theo dõi thụt lề và tiêm giả INDENT
và DEDENT
mã thông báo vào luồng mã thông báo, do đó cho phép trình phân tích cú pháp không có ngữ cảnh mặc dù cú pháp của Python thực sự không. Tuy nhiên, một lexer HTML sẽ hoàn toàn bỏ qua khoảng trắng, vì nó không có ý nghĩa gì trong HTML.
Tuy nhiên, một trình phân tích cú pháp không quét, chỉ đơn giản là đọc các ký tự, có thể chuyển luồng ký tự sang một trình phân tích cú pháp khác, sau đó có thể đưa nó trở lại, do đó làm cho chúng dễ soạn hơn nhiều.
Một ví dụ cho # 2 là các chuỗi có các truy vấn SQL trong đó. Bạn có thể có hai chuỗi, mỗi chuỗi có truy vấn SQL đúng về mặt cú pháp, nhưng nếu bạn nối hai chuỗi đó, kết quả có thể không phải là truy vấn SQL chính xác về mặt cú pháp. Đó là lý do tại sao chúng ta phải truy vấn đại số như ARel
, mà làm soạn.
Khóa là một ví dụ về # 3. Nếu bạn có hai chương trình có khóa và bạn kết hợp chúng thành một chương trình duy nhất, bạn vẫn có một chương trình có khóa, nhưng ngay cả khi hai chương trình gốc hoàn toàn chính xác, không có bế tắc và cuộc đua, chương trình kết quả không nhất thiết phải có bất động sản. Việc sử dụng đúng khóa là một thuộc tính toàn cầu của toàn bộ chương trình và là một thuộc tính không được bảo tồn khi bạn soạn chương trình. Điều này khác với, ví dụ, giao dịch, mà làm soạn. Một chương trình sử dụng chính xác các giao dịch có thể được soạn thảo với một chương trình khác như vậy và sẽ mang lại một chương trình kết hợp sử dụng đúng các giao dịch.