Ketika orang mengatakan "X tidak menulis", apa yang mereka maksud dengan "menulis" benar-benar hanya berarti "disatukan", dan apa dan bagaimana Anda menyatukannya bisa sangat berbeda, tergantung pada apa sebenarnya "X" itu.
Juga, ketika mereka mengatakan "tidak menulis", mereka dapat berarti beberapa hal yang sedikit berbeda:
- Anda tidak bisa menggabungkan dua Xs sama sekali, titik.
- Anda dapat menyatukan dua Xs, tetapi hasilnya mungkin bukan X (IOW: X tidak ditutup dalam komposisi .)
- Anda dapat menempatkan dua X bersama-sama, tetapi X yang dihasilkan mungkin tidak bekerja seperti yang Anda harapkan.
Contoh untuk # 1 adalah parser dengan scanner / lexers. Anda mungkin mendengar ungkapan "scanner / lexers don't compose". Itu sebenarnya tidak benar. Apa yang mereka maksudkan adalah "parser yang menggunakan tahap lexing terpisah jangan menulis".
Mengapa Anda ingin membuat parser? Nah, bayangkan Anda adalah vendor IDE seperti JetBrains, Eclipse Foundation, Microsoft, atau Embarcadero, dan Anda ingin membangun IDE untuk kerangka kerja web. Dalam pengembangan web biasa, kami sering mencampur bahasa. Anda memiliki file HTML dengan <script>
elemen yang mengandung ECMAScript dan<style>
elemen yang mengandung CSS. Anda memiliki file template yang berisi HTML, beberapa bahasa pemrograman, dan beberapa metasyntax bahasa template. Anda tidak ingin menulis highlight sintaks yang berbeda untuk "Python", "Python yang disematkan dalam templat", "CSS", "CSS dalam HTML", "ECMASCript", "ECMAScript di dalam HTML", "HTML", "HTML di dalam sebuah template ", dan seterusnya dan seterusnya. Anda ingin menulis penyorot sintaksis untuk Python, satu untuk HTML, satu untuk bahasa templat, dan kemudian menyusun ketiganya menjadi penyorot sintaksis untuk file templat.
Namun, lexer mem-parsing seluruh file menjadi aliran token, yang hanya masuk akal untuk satu bahasa itu. Pengurai untuk bahasa lain tidak dapat bekerja dengan token yang dilewati oleh lexer. Sebagai contoh, parser Python biasanya ditulis sedemikian rupa sehingga lexer melacak lekukan dan menyuntikkan token INDENT
dan palsu DEDENT
ke dalam aliran token, sehingga memungkinkan parser untuk bebas konteks meskipun sintaksis Python sebenarnya tidak. Namun HTML lexer akan sepenuhnya mengabaikan spasi putih, karena tidak memiliki arti dalam HTML.
Namun, pengurai tanpa pemindai, yang hanya membaca karakter, dapat meneruskan aliran karakter ke pengurai yang berbeda, yang kemudian dapat mengembalikannya, sehingga membuatnya lebih mudah untuk dikomposisi.
Contoh untuk # 2 adalah string dengan query SQL di dalamnya. Anda dapat memiliki dua string, yang masing-masing memiliki kueri SQL yang benar secara sintaksis di dalamnya, tetapi jika Anda menggabungkan dua string, hasilnya mungkin bukan query SQL yang benar secara sintaksis. Itulah mengapa kita memiliki pertanyaan algebras seperti ARel
, yang melakukan penulisan.
Kunci adalah contoh dari # 3. Jika Anda memiliki dua program dengan kunci, dan Anda menggabungkannya menjadi satu program, Anda masih memiliki program dengan kunci, tetapi bahkan jika dua program asli sepenuhnya benar, bebas dari kebuntuan dan balapan, program yang dihasilkan tidak harus memiliki ini milik. Penggunaan kunci yang benar adalah properti global dari seluruh program, dan properti yang tidak dipertahankan ketika Anda menyusun program. Hal ini berbeda dari, misalnya, transaksi, yang melakukan penulisan. Suatu program yang menggunakan transaksi dengan benar dapat disusun dengan program lain semacam itu dan akan menghasilkan program gabungan yang menggunakan transaksi dengan benar.