Lexers ที่ขับเคลื่อนด้วยตาราง - แล้วคำสำคัญที่สงวนไว้ล่ะ

คำถามนี้เกิดจากคำถามอื่นที่ฉันถามในเว็บไซต์ 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


person Novicegrammer    schedule 21.03.2020    source แหล่งที่มา
comment
ตอบแล้วที่นี่ในวิทยาการคอมพิวเตอร์   -  person rici    schedule 21.03.2020
comment
หากคุณมาที่นี่พร้อมกับการค้นหา คำตอบนี้ก็อาจเกี่ยวข้องเช่นกัน   -  person rici    schedule 21.03.2020


คำตอบ (1)


ตัวอย่าง lookahead ของคุณก็เหมือนกับ DFA ในตัวมันเองจริงๆ น่าเศร้า ไม่มีวิธีที่ง่ายในการแก้ปัญหานี้ นอกเหนือจากการเขียนโค้ดคำหลักลงใน DFA ที่คุณใช้อยู่

สำหรับตัวอย่าง if ฉันจะสร้างประเภทโทเค็นชื่อ IF ซึ่งแตกต่างจากประเภทโทเค็น ID ของคุณ

ตอนนี้ คุณต้องเปลี่ยน DFA ของคุณเพื่อยอมรับโทเค็น IF หากเราอยู่ในสถานะเริ่มต้นและเราอ่าน i DFA ไม่ควรเริ่มต้นเส้นทาง ID ปกติ ก็ควรไปตามเส้นทางที่แยกจากกัน

ต่อไปนี้คือตัวอย่าง DFA สำหรับการตีความเฉพาะโทเค็น IF และ ID และยอมรับเฉพาะอักขระ a-z

DFA คำหลัก

person c.abate    schedule 21.04.2020
comment
ฉันได้แก้ไขปัญหาแล้วและ (ตามลิงก์ในความคิดเห็นของคำถาม) นี่เป็นวิธีแก้ปัญหาที่ฉันทำ - person Novicegrammer; 23.04.2020