การวิเคราะห์คำศัพท์ (ตัววิเคราะห์) ในการออกแบบคอมไพเลอร์พร้อมตัวอย่าง
การวิเคราะห์คำศัพท์คืออะไร?
การวิเคราะห์คำศัพท์ เป็นขั้นตอนแรกสุดในการออกแบบคอมไพเลอร์ Lexer รับซอร์สโค้ดที่ถูกแก้ไขซึ่งเขียนในรูปแบบของประโยค กล่าวอีกนัยหนึ่ง ช่วยให้คุณสามารถแปลงลำดับของอักขระให้เป็นลำดับของโทเค็นได้ ตัววิเคราะห์คำศัพท์แบ่งไวยากรณ์นี้ออกเป็นชุดโทเค็น โดยจะลบช่องว่างเพิ่มเติมหรือความคิดเห็นที่เขียนในซอร์สโค้ด
โปรแกรมที่ทำการวิเคราะห์คำศัพท์ในการออกแบบคอมไพเลอร์เรียกว่าตัววิเคราะห์คำศัพท์หรือเล็กเซอร์ lexer มี tokenizer หรือเครื่องสแกน หากตัววิเคราะห์คำศัพท์ตรวจพบว่าโทเค็นไม่ถูกต้อง จะทำให้เกิดข้อผิดพลาด บทบาทของ Lexical Analyzer ในการออกแบบคอมไพเลอร์คือการอ่านสตรีมอักขระจากซอร์สโค้ด ตรวจสอบโทเค็นทางกฎหมาย และส่งข้อมูลไปยังตัววิเคราะห์ไวยากรณ์เมื่อต้องการ
ตัวอย่าง
How Pleasant Is The Weather?
ดูตัวอย่างการวิเคราะห์คำศัพท์นี้ ตรงนี้ เราสามารถจดจำได้ง่ายว่ามีคำห้าคำว่า How Pleasant, The, Weather, Is นี่เป็นเรื่องปกติสำหรับเราเนื่องจากเราสามารถจดจำตัวคั่น ช่องว่าง และสัญลักษณ์เครื่องหมายวรรคตอนได้
HowPl easantIs Th ewe ather?
ทีนี้ ลองดูตัวอย่างนี้สิ เราก็สามารถอ่านสิ่งนี้ได้เช่นกัน อย่างไรก็ตาม อาจต้องใช้เวลาระยะหนึ่งเนื่องจากมีการวางตัวคั่นไว้ในตำแหน่งคี่ ไม่ใช่สิ่งที่มาหาคุณทันที
คำศัพท์พื้นฐาน
คำศัพท์คืออะไร?
ศัพท์คือลำดับของอักขระที่รวมอยู่ในซอร์สโปรแกรมตามรูปแบบการจับคู่ของโทเค็น มันไม่มีอะไรนอกจากตัวอย่างของโทเค็น
โทเค็นคืออะไร?
โทเค็นในการออกแบบคอมไพเลอร์คือลำดับของอักขระซึ่งแสดงถึงหน่วยข้อมูลในโปรแกรมต้นฉบับ
รูปแบบคืออะไร?
รูปแบบคือคำอธิบายที่ใช้โดยโทเค็น ในกรณีของคีย์เวิร์ดที่ใช้เป็นโทเค็น รูปแบบจะเป็นลำดับของอักขระ
เครื่องวิเคราะห์คำศัพท์ Architecture: วิธีการรับรู้โทเค็น
งานหลักของการวิเคราะห์คำศัพท์คือการอ่านอักขระที่ป้อนในโค้ดและสร้างโทเค็น
ตัววิเคราะห์คำศัพท์จะสแกนซอร์สโค้ดทั้งหมดของโปรแกรม โดยจะระบุแต่ละโทเค็นทีละรายการ โดยปกติแล้วสแกนเนอร์จะถูกนำไปใช้เพื่อสร้างโทเค็นเฉพาะเมื่อมีการร้องขอจาก parser นี่คือวิธีการจดจำโทเค็นในการออกแบบคอมไพเลอร์ -
- “รับโทเค็นถัดไป” คือคำสั่งที่ส่งจากตัวแยกวิเคราะห์ไปยังตัววิเคราะห์คำศัพท์
- เมื่อได้รับคำสั่งนี้ ตัววิเคราะห์คำศัพท์จะสแกนอินพุตจนกว่าจะพบโทเค็นถัดไป
- มันจะส่งคืนโทเค็นให้กับ Parser
ตัววิเคราะห์คำศัพท์จะข้ามช่องว่างและความคิดเห็นในขณะที่สร้างโทเค็นเหล่านี้ หากมีข้อผิดพลาดใดๆ ตัววิเคราะห์คำศัพท์จะเชื่อมโยงข้อผิดพลาดนั้นกับไฟล์ต้นฉบับและหมายเลขบรรทัด
บทบาทของตัววิเคราะห์คำศัพท์
ตัววิเคราะห์คำศัพท์ทำงานตามที่กำหนดด้านล่าง:
- ช่วยในการระบุโทเค็นลงในตารางสัญลักษณ์
- ลบช่องว่างและความคิดเห็นออกจากโปรแกรมต้นฉบับ
- เชื่อมโยงข้อความแสดงข้อผิดพลาดกับโปรแกรมต้นฉบับ
- ช่วยให้คุณขยายมาโครหากพบในโปรแกรมต้นฉบับ
- อ่านอักขระอินพุตจากโปรแกรมต้นฉบับ
ตัวอย่างการวิเคราะห์คำศัพท์ โทเค็น ไม่ใช่โทเค็น
พิจารณาโค้ดต่อไปนี้ที่ส่งไปยัง Lexical Analyzer
#include <stdio.h> int maximum(int x, int y) { // This will compare 2 numbers if (x > y) return x; else { return y; } }
ตัวอย่างโทเค็นที่สร้างขึ้น
ศัพท์ | เหรียญ |
---|---|
int | คำหลัก |
สูงสุด | ตัวบ่งชี้ |
( | OperaTor |
int | คำหลัก |
x | ตัวบ่งชี้ |
, | OperaTor |
int | คำหลัก |
Y | ตัวบ่งชี้ |
) | OperaTor |
{ | OperaTor |
If | คำหลัก |
ตัวอย่างของ Nontoken
ประเภท | ตัวอย่าง |
---|---|
Comment | // นี่จะเป็นการเปรียบเทียบ 2 ตัวเลข |
คำสั่งก่อนโปรเซสเซอร์ | #รวม |
คำสั่งก่อนโปรเซสเซอร์ | #กำหนด NUMS 8,9 |
แมโคร | หมายเลข |
ช่องว่าง | /n /b /t |
ข้อผิดพลาดเกี่ยวกับคำศัพท์
ลำดับอักขระที่ไม่สามารถสแกนลงในโทเค็นที่ถูกต้องได้ถือเป็นข้อผิดพลาดด้านคำศัพท์ ข้อเท็จจริงสำคัญเกี่ยวกับข้อผิดพลาดด้านคำศัพท์:
- ข้อผิดพลาดด้านคำศัพท์ไม่ได้เกิดขึ้นบ่อยนัก แต่ควรได้รับการจัดการโดยเครื่องสแกน
- การสะกดคำผิดของตัวระบุ ตัวดำเนินการ และคำสำคัญ ถือเป็นข้อผิดพลาดทางคำศัพท์
- โดยทั่วไป ข้อผิดพลาดด้านคำศัพท์เกิดจากการปรากฏของอักขระที่ไม่ถูกต้อง ซึ่งส่วนใหญ่อยู่ที่ตอนต้นของโทเค็น
การกู้คืนข้อผิดพลาดในตัววิเคราะห์คำศัพท์
ต่อไปนี้เป็นเทคนิคการกู้คืนข้อผิดพลาดที่พบบ่อยที่สุด:
- ลบอักขระหนึ่งตัวออกจากอินพุตที่เหลือ
- ในโหมดตื่นตระหนก อักขระที่ต่อเนื่องกันจะถูกละเว้นเสมอจนกว่าเราจะไปถึงโทเค็นที่มีรูปแบบถูกต้อง
- โดยการแทรกอักขระที่หายไปลงในอินพุตที่เหลือ
- แทนที่อักขระด้วยอักขระอื่น
- สลับอักขระอนุกรมสองตัว
ตัววิเคราะห์คำศัพท์กับ Parser
เครื่องวิเคราะห์คำศัพท์ | โปรแกรมแยกวิเคราะห์ |
---|---|
โปรแกรมสแกนอินพุต | ทำการวิเคราะห์ไวยากรณ์ |
ระบุโทเค็น | สร้างการแสดงโค้ดเชิงนามธรรม |
ใส่โทเค็นลงในตารางสัญลักษณ์ | อัปเดตรายการตารางสัญลักษณ์ |
มันสร้างข้อผิดพลาดทางคำศัพท์ | มันสร้างแผนผังการแยกวิเคราะห์ของซอร์สโค้ด |
เหตุใดจึงต้องแยก Lexical และ Parser
- ความเรียบง่ายของการออกแบบ: ช่วยให้กระบวนการวิเคราะห์คำศัพท์และการวิเคราะห์ไวยากรณ์ง่ายขึ้นโดยกำจัดโทเค็นที่ไม่ต้องการ
- เพื่อปรับปรุงประสิทธิภาพของคอมไพเลอร์: ช่วยให้คุณปรับปรุงประสิทธิภาพของคอมไพเลอร์
- ความเชี่ยวชาญ: สามารถใช้เทคนิคพิเศษเพื่อปรับปรุงกระบวนการวิเคราะห์คำศัพท์ได้
- การพกพา: มีเพียงสแกนเนอร์เท่านั้นที่ต้องสื่อสารกับโลกภายนอก
- ความสามารถในการพกพาที่สูงขึ้น: ลักษณะเฉพาะเฉพาะอุปกรณ์อินพุตที่จำกัดเฉพาะ lexer
ข้อดีของการวิเคราะห์คำศัพท์
- โปรแกรมเช่นคอมไพเลอร์ใช้วิธีวิเคราะห์คำศัพท์ซึ่งสามารถใช้ข้อมูลที่แยกวิเคราะห์จากรหัสของโปรแกรมเมอร์เพื่อสร้างรหัสปฏิบัติการไบนารีที่คอมไพล์แล้ว
- เว็บเบราว์เซอร์ใช้เพื่อจัดรูปแบบและแสดงหน้าเว็บด้วยความช่วยเหลือของข้อมูลที่แยกวิเคราะห์ จาฟสสคริปต์, HTML, ซีเอสเอส
- ตัววิเคราะห์คำศัพท์ที่แยกต่างหากช่วยให้คุณสร้างตัวประมวลผลเฉพาะทางและมีประสิทธิภาพมากขึ้นสำหรับงานนั้น
ข้อเสียของการวิเคราะห์คำศัพท์
- คุณต้องใช้เวลาอย่างมากในการอ่านซอร์สโปรแกรมและแบ่งพาร์ติชันเป็นโทเค็น
- นิพจน์ทั่วไปบางนิพจน์ค่อนข้างเข้าใจยากเมื่อเทียบกับกฎ PEG หรือ EBNF
- ต้องใช้ความพยายามมากขึ้นในการพัฒนาและดีบัก lexer และคำอธิบายโทเค็น
- จำเป็นต้องมีโอเวอร์เฮดรันไทม์เพิ่มเติมเพื่อสร้างตาราง lexer และสร้างโทเค็น
สรุป
- การวิเคราะห์คำศัพท์เป็นขั้นตอนแรกในการออกแบบคอมไพเลอร์
- ศัพท์และโทเค็นเป็นลำดับของอักขระที่รวมอยู่ในโปรแกรมต้นทางตามรูปแบบการจับคู่ของโทเค็น
- ตัววิเคราะห์คำศัพท์ถูกนำมาใช้เพื่อสแกนซอร์สโค้ดทั้งหมดของโปรแกรม
- ตัววิเคราะห์คำศัพท์ช่วยในการระบุโทเค็นลงในตารางสัญลักษณ์
- ลำดับอักขระที่ไม่สามารถสแกนลงในโทเค็นที่ถูกต้องได้ถือเป็นข้อผิดพลาดด้านคำศัพท์
- ลบอักขระหนึ่งตัวออกจากอินพุตที่เหลือจะมีประโยชน์ วิธีการกู้คืนข้อผิดพลาด
- ตัววิเคราะห์คำศัพท์จะสแกนโปรแกรมอินพุตในขณะที่ตัวแยกวิเคราะห์ทำการวิเคราะห์ไวยากรณ์
- ช่วยให้กระบวนการวิเคราะห์คำศัพท์และการวิเคราะห์ไวยากรณ์ง่ายขึ้นโดยกำจัดโทเค็นที่ไม่ต้องการ
- เว็บเบราว์เซอร์ใช้ตัววิเคราะห์คำศัพท์เพื่อจัดรูปแบบและแสดงหน้าเว็บด้วยความช่วยเหลือของข้อมูลที่แยกวิเคราะห์จาก JavsScript, HTML, CSS
- ข้อเสียเปรียบที่ใหญ่ที่สุดของการใช้ Lexical analyse คือ ต้องใช้รันไทม์เพิ่มเติมเพื่อสร้างตาราง lexer และสร้างโทเค็น