คำถามนี้เกิดจากคำถามอื่นที่ฉันถามในเว็บไซต์ CS ข้อมูลอ้างอิง
ฉันได้ลองค้นหาบันทึกหลักสูตรออนไลน์จากมหาวิทยาลัยต่างๆ เพื่อหาคำตอบสำหรับปัญหาที่ฉันกำลังเผชิญอยู่
ฉันต้องใช้คอมไพเลอร์สำหรับภาษาที่กำหนดเองสำหรับงานที่ได้รับมอบหมาย ภาษานี้มีสัญลักษณ์ อะตอมมิก บางตัว เช่น ตัวอักษรจากตัวอักษรภาษาอังกฤษ และตัวเลข และฉันก็หาตัวอย่างสำหรับสิ่งเหล่านี้ได้ และมันค่อนข้างตรงไปตรงมา ตัวอย่างเช่น: ไปที่หน้า 25
อย่างไรก็ตาม ภาษานี้ยังประกอบด้วย คำสงวน เช่น ถ้า และ สำหรับ
นี่คือที่ฉันมีปัญหา สมมติว่า lexer พยายามอ่านสตริงคำสั่ง if (expression) หากฉันใช้การดำเนินการเช่น หน้า 4 มันจะจัดหมวดหมู่ หาก เป็นตัวระบุอย่างไม่ถูกต้อง
ดังนั้นความคิดของฉันคือการใช้กลไก lookahead เพื่อว่าก่อนที่ lexer จะจัดหมวดหมู่และส่งสิ่งที่กำลังอ่านไปยัง DFA ก็จะสามารถตัดสินใจได้อย่างมีข้อมูลและถูกต้อง
ตัวอย่างเช่น: lexer พบกับ i เนื่องจาก i สามารถอยู่ในคำสงวนได้ (if) lexer จึงควรตรวจสอบอักขระ ถัดไป หากเป็น f ดังนั้น lexer ควรตรวจสอบให้แน่ใจว่าไม่ใช่สตริงปกติที่ขึ้นต้นด้วย if เช่น ifxyz
ฉันชอบแนวคิดนี้ ยกเว้นว่าฉันไม่สามารถหาสิ่งที่คล้ายกันจากการดูบันทึกรายวิชาออนไลน์ ซึ่งทำให้ฉันคิดว่าบางทีฉันอาจทำอะไรผิด
อัปเดต!! มีไว้สำหรับผู้ที่มาที่นี่ผ่านการค้นหาเพื่อพยายามค้นหาวิธีแก้ไข จริงๆ แล้วฉันได้แก้ไขปัญหานี้มานานแล้ว และคำตอบที่ลิงก์ไว้ในความคิดเห็นก็มีประโยชน์มาก ฉันแนะนำให้คุณไปอ่านมัน
นี่คือวิธีที่ฉันแก้ไขปัญหานี้:
เริ่มต้น(ฉ) -› ฉ
F(o) -> FO
FO(r) -> สำหรับ
สำหรับ(_) -> ตัวระบุ
นอกจากนี้ ทุกรัฐยังมีทรัพย์สินของ Lex As เหตุผล: ถือว่าคุณมาถึงสถานะ F โดยไม่ต้องป้อนข้อมูลเพิ่มเติม ดังนั้น คุณควรถือว่าสิ่งนี้เป็นตัวระบุ (ในภาษาส่วนใหญ่) ดังนั้น F.lexAs จะส่งกลับการตีความสถานะที่ถูกต้อง ในกรณีนี้คือ IDENTIFIER