เมื่อมีคนพูดว่า "X ไม่ได้เขียน" สิ่งที่พวกเขาหมายถึง "การเขียน" จริงๆเพียงแค่หมายความว่า "ใส่กัน" และสิ่งที่และวิธีการที่คุณเอามารวมกันจะแตกต่างกันมากขึ้นอยู่กับสิ่งที่ว่า "X" คือ
นอกจากนี้เมื่อพวกเขาพูดว่า "ไม่เขียน" พวกเขาสามารถหมายถึงสิ่งที่แตกต่างกันเล็กน้อย:
- คุณไม่สามารถรวม Xs สองตัวเข้าด้วยกันได้ตลอดเวลา
- คุณสามารถใส่ X สองตัวไว้ด้วยกัน แต่ผลลัพธ์อาจไม่ใช่ X (IOW: X ไม่ได้ปิดภายใต้การจัดองค์ประกอบ )
- คุณสามารถรวม Xs สองตัวเข้าด้วยกัน แต่ X ที่ได้นั้นอาจไม่เป็นไปตามที่คุณคาดหวัง
ตัวอย่างสำหรับ # 1 คือ parsers ที่มีสแกนเนอร์ / lexers คุณอาจได้ยินคำว่า "สแกนเนอร์ / lexers ไม่แต่ง" นั่นไม่จริงเลย สิ่งที่พวกเขาหมายถึงคือ "parser ที่ใช้เวที lexing แยกไม่ได้แต่ง"
ทำไมคุณต้องการเขียนโปรแกรมแยกวิเคราะห์? ลองจินตนาการว่าคุณเป็นผู้ขาย IDE เช่น JetBrains, Eclipse Foundation, Microsoft หรือ Embarcadero และคุณต้องการสร้าง IDE สำหรับเว็บเฟรมเวิร์ก ในการพัฒนาเว็บทั่วไปเรามักจะผสมผสานภาษาต่างๆ คุณมีไฟล์ HTML ที่มี<script>
องค์ประกอบที่มี ECMAScript และ<style>
องค์ประกอบที่มี CSS คุณมีไฟล์เทมเพลตที่ประกอบด้วย HTML ภาษาการเขียนโปรแกรมบางส่วนและเมตาซินไวยากรณ์ภาษาเทมเพลตบางส่วน คุณไม่ต้องการที่จะเขียนปากกาเน้นข้อความไวยากรณ์ที่แตกต่างกันสำหรับ "Python", "Python ฝังอยู่ในแม่แบบ", "CSS", "CSS ภายใน HTML", "ECMASCript", "ECMASCript", "ECMAScript ภายใน HTML", "HTML", "HTML ภายใน เทมเพลต "และอื่น ๆ เป็นต้น คุณต้องการเขียนปากกาเน้นข้อความสำหรับงูใหญ่หนึ่งสำหรับ HTML หนึ่งสำหรับภาษาแม่แบบและจากนั้นเรียบเรียงทั้งสามลงในปากกาเน้นข้อความไวยากรณ์สำหรับไฟล์แม่แบบ
อย่างไรก็ตาม lexer จะวิเคราะห์ไฟล์ทั้งหมดลงในสตรีมของโทเค็นซึ่งเหมาะสมสำหรับภาษานั้นเท่านั้น โปรแกรมแยกวิเคราะห์สำหรับภาษาอื่นไม่สามารถทำงานได้กับโทเค็นที่ lexer ส่งผ่าน ตัวอย่างเช่นตัวแยกวิเคราะห์ Python มักเขียนในลักษณะที่ lexer คอยติดตามการเยื้องและอัดฉีดINDENT
และDEDENT
โทเค็นปลอมในโทเค็นสตรีมโทเค็นจึงอนุญาตให้ parser ปราศจากบริบทแม้ว่าไวยากรณ์ของ Python จะไม่จริง HTML lexer จะไม่สนใจพื้นที่ว่างทั้งหมดเนื่องจากไม่มีความหมายใน HTML
อย่างไรก็ตามการแยกวิเคราะห์สแกนเนอร์ซึ่งเพียงแค่อ่านตัวอักษรสามารถส่งกระแสข้อมูลตัวละครไปยัง parser ที่แตกต่างกันซึ่งสามารถส่งกลับมาจึงทำให้ง่ายต่อการเขียน
ตัวอย่างสำหรับ # 2 คือสตริงที่มีเคียวรี SQL อยู่ คุณสามารถมีสองสตริงแต่ละอันมีเคียวรี SQL ที่ถูกต้องทางไวยากรณ์ในนั้น แต่ถ้าคุณต่อสองสตริงเข้าด้วยกันผลลัพธ์อาจไม่เป็นเคียวรี SQL ที่ถูกต้องทางไวยากรณ์ นั่นเป็นเหตุผลที่เรามีจีบราส์แบบสอบถามARel
ซึ่งทำขึ้น
ล็อคเป็นตัวอย่างของ # 3 หากคุณมีสองโปรแกรมที่มีการล็อกและคุณรวมเข้ากับโปรแกรมเดียวคุณยังคงมีโปรแกรมที่มีการล็อก แต่แม้ว่าโปรแกรมดั้งเดิมสองโปรแกรมนั้นถูกต้องสมบูรณ์ปราศจากการหยุดชะงักและการแข่งขันโปรแกรมผลลัพธ์ไม่จำเป็นต้องมีสิ่งนี้ คุณสมบัติ การใช้งานการล็อคที่ถูกต้องเป็นคุณสมบัติส่วนกลางของโปรแกรมทั้งหมดและคุณสมบัติที่ไม่ได้รับการรักษาไว้เมื่อคุณเขียนโปรแกรม สิ่งนี้แตกต่างจากธุรกรรมที่ทำขึ้น โปรแกรมที่ใช้ธุรกรรมอย่างถูกต้องสามารถประกอบกับโปรแกรมดังกล่าวได้อีกและจะให้โปรแกรมรวมซึ่งใช้ธุรกรรมอย่างถูกต้อง