การวิเคราะห์คำศัพท์ (ตัววิเคราะห์) ในการออกแบบคอมไพเลอร์พร้อมตัวอย่าง

การวิเคราะห์คำศัพท์คืออะไร?

การวิเคราะห์คำศัพท์ เป็นขั้นตอนแรกสุดในการออกแบบคอมไพเลอร์ Lexer รับซอร์สโค้ดที่ถูกแก้ไขซึ่งเขียนในรูปแบบของประโยค กล่าวอีกนัยหนึ่ง ช่วยให้คุณสามารถแปลงลำดับของอักขระให้เป็นลำดับของโทเค็นได้ ตัววิเคราะห์คำศัพท์แบ่งไวยากรณ์นี้ออกเป็นชุดโทเค็น โดยจะลบช่องว่างเพิ่มเติมหรือความคิดเห็นที่เขียนในซอร์สโค้ด

โปรแกรมที่ทำการวิเคราะห์คำศัพท์ในการออกแบบคอมไพเลอร์เรียกว่าตัววิเคราะห์คำศัพท์หรือเล็กเซอร์ lexer มี tokenizer หรือเครื่องสแกน หากตัววิเคราะห์คำศัพท์ตรวจพบว่าโทเค็นไม่ถูกต้อง จะทำให้เกิดข้อผิดพลาด บทบาทของ Lexical Analyzer ในการออกแบบคอมไพเลอร์คือการอ่านสตรีมอักขระจากซอร์สโค้ด ตรวจสอบโทเค็นทางกฎหมาย และส่งข้อมูลไปยังตัววิเคราะห์ไวยากรณ์เมื่อต้องการ

ตัวอย่าง

How Pleasant Is The Weather?

ดูตัวอย่างการวิเคราะห์คำศัพท์นี้ ตรงนี้ เราสามารถจดจำได้ง่ายว่ามีคำห้าคำว่า How Pleasant, The, Weather, Is นี่เป็นเรื่องปกติสำหรับเราเนื่องจากเราสามารถจดจำตัวคั่น ช่องว่าง และสัญลักษณ์เครื่องหมายวรรคตอนได้

 HowPl easantIs Th ewe ather?

ทีนี้ ลองดูตัวอย่างนี้สิ เราก็สามารถอ่านสิ่งนี้ได้เช่นกัน อย่างไรก็ตาม อาจต้องใช้เวลาระยะหนึ่งเนื่องจากมีการวางตัวคั่นไว้ในตำแหน่งคี่ ไม่ใช่สิ่งที่มาหาคุณทันที

คำศัพท์พื้นฐาน

คำศัพท์คืออะไร?

ศัพท์คือลำดับของอักขระที่รวมอยู่ในซอร์สโปรแกรมตามรูปแบบการจับคู่ของโทเค็น มันไม่มีอะไรนอกจากตัวอย่างของโทเค็น

โทเค็นคืออะไร?

โทเค็นในการออกแบบคอมไพเลอร์คือลำดับของอักขระซึ่งแสดงถึงหน่วยข้อมูลในโปรแกรมต้นฉบับ

รูปแบบคืออะไร?

รูปแบบคือคำอธิบายที่ใช้โดยโทเค็น ในกรณีของคีย์เวิร์ดที่ใช้เป็นโทเค็น รูปแบบจะเป็นลำดับของอักขระ

เครื่องวิเคราะห์คำศัพท์ Architecture: วิธีการรับรู้โทเค็น

งานหลักของการวิเคราะห์คำศัพท์คือการอ่านอักขระที่ป้อนในโค้ดและสร้างโทเค็น

ตัววิเคราะห์คำศัพท์จะสแกนซอร์สโค้ดทั้งหมดของโปรแกรม โดยจะระบุแต่ละโทเค็นทีละรายการ โดยปกติแล้วสแกนเนอร์จะถูกนำไปใช้เพื่อสร้างโทเค็นเฉพาะเมื่อมีการร้องขอจาก parser นี่คือวิธีการจดจำโทเค็นในการออกแบบคอมไพเลอร์ -

เครื่องวิเคราะห์คำศัพท์ Archiเทคเจอร์
เครื่องวิเคราะห์คำศัพท์ Archiเทคเจอร์
  1. “รับโทเค็นถัดไป” คือคำสั่งที่ส่งจากตัวแยกวิเคราะห์ไปยังตัววิเคราะห์คำศัพท์
  2. เมื่อได้รับคำสั่งนี้ ตัววิเคราะห์คำศัพท์จะสแกนอินพุตจนกว่าจะพบโทเค็นถัดไป
  3. มันจะส่งคืนโทเค็นให้กับ 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 และสร้างโทเค็น