โปรแกรมแยกวิเคราะห์ HTML ทำงานอย่างไร? มันไม่ใช้นิพจน์ทั่วไปในการแยกวิเคราะห์?
ดีไม่
หากคุณย้อนกลับไปในสมองของคุณถึงทฤษฎีของหลักสูตรการคำนวณถ้าคุณเรียนหลักสูตรหนึ่งหรือหลักสูตรคอมไพเลอร์หรืออะไรที่คล้ายกันคุณอาจจำได้ว่ามีภาษาและรูปแบบการคำนวณหลายประเภท ฉันไม่มีคุณสมบัติที่จะลงรายละเอียดทั้งหมด แต่ฉันสามารถตรวจสอบประเด็นสำคัญบางประการกับคุณได้
ประเภทของภาษาและการคำนวณที่ง่ายที่สุด (สำหรับวัตถุประสงค์เหล่านี้) คือภาษาปกติ สิ่งเหล่านี้สามารถสร้างขึ้นด้วยนิพจน์ทั่วไปและรับรู้ด้วยออโตมาตา จำกัด โดยทั่วไปนั่นหมายความว่าสตริง "การแยกวิเคราะห์" ในภาษาเหล่านี้ใช้สถานะ แต่ไม่ใช่หน่วยความจำเสริม HTML ไม่ใช่ภาษาปกติอย่างแน่นอน หากคุณคิดเช่นนั้นรายการแท็กสามารถซ้อนกันได้ตามอำเภอใจ ตัวอย่างเช่นตารางสามารถมีตารางและแต่ละตารางสามารถมีแท็กที่ซ้อนกันจำนวนมาก ด้วยนิพจน์ทั่วไปคุณอาจสามารถเลือกคู่ของแท็กได้ แต่จะไม่มีอะไรซ้อนกันโดยพลการ
ภาษาคลาสสิกธรรมดาที่ไม่ปกติจะจับคู่วงเล็บอย่างถูกต้อง ลองทำตามที่คุณทำได้คุณจะไม่สามารถสร้างนิพจน์ทั่วไป (หรือ จำกัด ออโตเมตัน) ที่จะใช้งานได้ตลอดไป คุณต้องมีหน่วยความจำเพื่อติดตามความลึกของการซ้อน
เครื่องสเตทที่มีสแต็กสำหรับหน่วยความจำเป็นจุดแข็งถัดไปของโมเดลการคำนวณ สิ่งนี้เรียกว่าระบบอัตโนมัติแบบกดลงและจดจำภาษาที่สร้างขึ้นโดยไวยากรณ์ที่ไม่มีบริบท ที่นี่เราสามารถจดจำวงเล็บที่ตรงกันได้อย่างถูกต้อง - สแต็กเป็นโมเดลหน่วยความจำที่สมบูรณ์แบบสำหรับมัน
นี่ดีพอสำหรับ HTML หรือไม่? น่าเศร้าที่ไม่ อาจเป็นไปได้สำหรับ XML ที่ตรวจสอบความถูกต้องอย่างรอบคอบซึ่งแท็กทั้งหมดจะเรียงกันอย่างสมบูรณ์แบบเสมอ ใน HTML <b><i>wow!</b></i>
โลกแห่งความจริงที่คุณสามารถหาได้ง่ายตัวอย่างเช่น เห็นได้ชัดว่าสิ่งนี้ไม่ซ้อนกันดังนั้นเพื่อที่จะแยกวิเคราะห์ได้อย่างถูกต้องสแต็กจึงไม่ทรงพลังเพียงพอ
ระดับถัดไปของการคำนวณคือภาษาที่สร้างขึ้นโดยไวยากรณ์ทั่วไปและได้รับการยอมรับจากเครื่องทัวริง สิ่งนี้เป็นที่ยอมรับกันโดยทั่วไปว่าเป็นรูปแบบการคำนวณที่แข็งแกร่งที่สุดที่มี - เครื่องสถานะพร้อมหน่วยความจำเสริมซึ่งหน่วยความจำสามารถแก้ไขได้ทุกที่ นี่คือสิ่งที่ภาษาโปรแกรมสามารถทำได้ นี่คือระดับความซับซ้อนที่ HTML อาศัยอยู่
เพื่อสรุปทุกอย่างในประโยคเดียว: ในการแยกวิเคราะห์ HTML ทั่วไปคุณต้องมีภาษาโปรแกรมจริงไม่ใช่นิพจน์ทั่วไป
HTML จะแยกวิเคราะห์ในลักษณะเดียวกับที่ภาษาอื่น ๆ ในการแยกวิเคราะห์ ได้แก่ การแยกวิเคราะห์และการแยกวิเคราะห์ ขั้นตอนการอ่านจะแบ่งสตรีมของอักขระแต่ละตัวออกเป็นโทเค็นที่มีความหมาย ขั้นตอนการแยกวิเคราะห์จะประกอบโทเค็นโดยใช้สถานะและหน่วยความจำเป็นเอกสารที่สอดคล้องกันอย่างมีเหตุผลซึ่งสามารถดำเนินการได้