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

⚡ สรุปอย่างชาญฉลาด

การวิเคราะห์คำศัพท์ (Lexical Analysis) เป็นขั้นตอนแรกของการออกแบบคอมไพเลอร์ โดยที่ตัววิเคราะห์คำศัพท์จะแปลงกระแสของอักขระต้นฉบับให้เป็นโทเค็นที่มีความหมาย มันจะลบช่องว่างและข้อความแสดงความคิดเห็น บันทึกโทเค็นลงในตารางสัญลักษณ์ และรายงานข้อผิดพลาดทางคำศัพท์ไปยังตัวแยกวิเคราะห์ (Parser)

  • 🔤 ขั้นตอนการคอมไพล์ขั้นแรก: การวิเคราะห์คำศัพท์จะอ่านอักขระต้นฉบับและแปลงเป็นลำดับของโทเค็น
  • 🧩 คำสำคัญ: เลกซีม (lexeme) คือลำดับตัวอักษรที่ตรงกัน โทเค็น (token) คือหมวดหมู่ของเลกซีม และแพทเทิร์น (pattern) กำหนดกฎเกณฑ์
  • 🏗️ วิธีการทำงาน: ตัวแยกวิเคราะห์ร้องขอ "รับโทเค็นถัดไป" และตัวสแกนจะส่งคืนโทเค็นตามความต้องการ
  • 🧹 บทบาทในการทำความสะอาด: ตัวแยกวิเคราะห์จะลบช่องว่างและข้อความแสดงความคิดเห็น ขยายมาโคร และเติมข้อมูลลงในตารางสัญลักษณ์
  • ⚠️ ข้อผิดพลาดทางคำศัพท์: อักขระที่ไม่ถูกต้องหรือตัวระบุที่สะกดผิดจะทำให้เกิดข้อผิดพลาด ซึ่งสามารถแก้ไขได้ด้วยเทคนิคการกู้คืน เช่น การลบหรือการสลับตำแหน่ง
  • 🔀 Lexer กับ Parser: ตัวแยกคำ (lexer) ทำหน้าที่ระบุโทเค็น ในขณะที่ตัววิเคราะห์ไวยากรณ์ (parser) สร้างแผนผังการวิเคราะห์ไวยากรณ์ (parse tree) ในระหว่างการวิเคราะห์ไวยากรณ์

การวิเคราะห์คำศัพท์

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

การวิเคราะห์คำศัพท์ เป็นขั้นตอนแรกสุดในการออกแบบคอมไพเลอร์ 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

เครื่องวิเคราะห์คำศัพท์ โปรแกรมแยกวิเคราะห์
โปรแกรมสแกนอินพุต ทำการวิเคราะห์ไวยากรณ์
ระบุโทเค็น สร้างกล้ามหน้าท้องtracการแสดงผลรหัส t
ใส่โทเค็นลงในตารางสัญลักษณ์ อัปเดตรายการตารางสัญลักษณ์
มันสร้างข้อผิดพลาดทางคำศัพท์ มันสร้างแผนผังการแยกวิเคราะห์ของซอร์สโค้ด

เหตุใดจึงต้องแยก Lexical และ Parser

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

ข้อดีของการวิเคราะห์คำศัพท์

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

ข้อเสียของการวิเคราะห์คำศัพท์

  • คุณต้องใช้เวลาอย่างมากในการอ่านซอร์สโปรแกรมและแบ่งพาร์ติชันเป็นโทเค็น
  • นิพจน์ทั่วไปบางนิพจน์ค่อนข้างเข้าใจยากเมื่อเทียบกับกฎ PEG หรือ EBNF
  • ต้องใช้ความพยายามมากขึ้นในการพัฒนาและดีบัก lexer และคำอธิบายโทเค็น
  • จำเป็นต้องมีโอเวอร์เฮดรันไทม์เพิ่มเติมเพื่อสร้างตาราง lexer และสร้างโทเค็น

คำถามที่พบบ่อย

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

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

ตารางสัญลักษณ์เป็นโครงสร้างข้อมูลที่ตัววิเคราะห์คำศัพท์ใช้จัดเก็บตัวระบุและคุณลักษณะต่างๆ เช่น ชื่อและประเภท Later ขั้นตอนการคอมไพล์จะอ่านและอัปเดตข้อมูลนั้น tracตัวแปรและฟังก์ชัน k ตัว

AI สามารถสร้างนิพจน์ปกติของโทเค็นจากตัวอย่าง ตรวจจับความกำกวมหรือการทับซ้อนกันได้ping รูปแบบต่างๆ และอธิบายข้อผิดพลาดของเครื่องสแกน ซึ่งจะช่วยเร่งความเร็วในการสร้างและแก้ไขข้อผิดพลาดของตัวแยกวิเคราะห์สำหรับภาษาหรือ DSL ใหม่

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

สรุปโพสต์นี้ด้วย: