การวิเคราะห์ไวยากรณ์: ประเภทการแยกวิเคราะห์จากบนลงล่างและล่างขึ้นบนของคอมไพเลอร์

การวิเคราะห์ไวยากรณ์คืออะไร?

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

การวิเคราะห์ไวยากรณ์ในกระบวนการออกแบบคอมไพเลอร์เกิดขึ้นหลังจากขั้นตอนการวิเคราะห์คำศัพท์ ซึ่งเรียกอีกอย่างหนึ่งว่า Parse Tree หรือ Syntax Tree Parse Tree ได้รับการพัฒนาด้วยความช่วยเหลือของไวยากรณ์ที่กำหนดไว้ล่วงหน้าของภาษา โปรแกรมวิเคราะห์ไวยากรณ์ยังตรวจสอบด้วยว่าโปรแกรมที่กำหนดนั้นปฏิบัติตามกฎที่ระบุไว้โดยไวยากรณ์ที่ไม่มีบริบทหรือไม่ หากเป็นไปตามนั้น โปรแกรมวิเคราะห์จะสร้าง Parse Tree ของโปรแกรมต้นทางนั้น หากไม่เป็นไปตามนั้น โปรแกรมจะแสดงข้อความแสดงข้อผิดพลาด

การวิเคราะห์ไวยากรณ์
กระบวนการวิเคราะห์ไวยากรณ์

ทำไมคุณถึงต้องการตัววิเคราะห์ไวยากรณ์?

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

คำศัพท์เฉพาะตัววิเคราะห์ไวยากรณ์ที่สำคัญ

คำศัพท์สำคัญที่ใช้ในกระบวนการวิเคราะห์ไวยากรณ์:

  • ประโยค: ประโยคคือกลุ่มของอักขระเหนือตัวอักษรบางตัว
  • คำศัพท์: ศัพท์คือหน่วยวากยสัมพันธ์ระดับต่ำสุดของภาษา (เช่น ผลรวม เริ่มต้น)
  • Token: โทเค็นเป็นเพียงหมวดหมู่ของคำศัพท์
  • คำสำคัญและคำสงวน – เป็นตัวระบุที่ใช้เป็นส่วนคงที่ของไวยากรณ์ของคำสั่ง เป็นคำสงวนซึ่งคุณไม่สามารถใช้เป็นชื่อตัวแปรหรือตัวระบุได้
  • คำพูดที่น่ารำคาญ – คำที่รบกวนเป็นตัวเลือกซึ่งจะแทรกลงในคำสั่งเพื่อให้อ่านประโยคได้ง่ายขึ้น
  • ความคิดเห็น – เป็นส่วนสำคัญของเอกสาร ส่วนใหญ่จะแสดงด้วย /* */ หรือ//Blank (ช่องว่าง)
  • ตัวคั่น – เป็นองค์ประกอบวากยสัมพันธ์ที่ทำเครื่องหมายจุดเริ่มต้นหรือจุดสิ้นสุดของหน่วยวากยสัมพันธ์บางหน่วย เช่นเดียวกับคำสั่งหรือสำนวน “begin”…”end” หรือ {}
  • ชุดตัวอักษร – ASCII, ยูนิโค้ด
  • ตัวบ่งชี้ – เป็นข้อจำกัดด้านความยาวซึ่งช่วยให้คุณลดความสามารถในการอ่านประโยคได้
  • Operaสัญลักษณ์ทอร์ – + และ – ดำเนินการคำนวณพื้นฐานสองอย่าง
  • องค์ประกอบทางวากยสัมพันธ์ของภาษา

ทำไมเราต้องแยกวิเคราะห์?

วจีวิภาค

การแยกวิเคราะห์ยังตรวจสอบว่าสตริงอินพุตมีรูปแบบที่ถูกต้อง และหากไม่เป็นเช่นนั้น ให้ปฏิเสธ

วจีวิภาค

ต่อไปนี้เป็นงานสำคัญที่ดำเนินการโดยตัววิเคราะห์ในการออกแบบคอมไพเลอร์:

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

เทคนิคการแยกวิเคราะห์

เทคนิคการแยกวิเคราะห์แบ่งออกเป็นสองกลุ่ม:

  • การแยกวิเคราะห์จากบนลงล่าง
  • การแยกวิเคราะห์จากล่างขึ้นบน

การแยกจากบนลงล่าง

ในโครงสร้างการแยกวิเคราะห์จากบนลงล่างของต้นไม้แยกเริ่มต้นที่รากแล้วดำเนินการต่อไปทางใบ

การแยกวิเคราะห์จากบนลงล่างสองประเภทคือ:

  1. การแยกวิเคราะห์แบบคาดการณ์:

การแยกวิเคราะห์แบบคาดการณ์สามารถคาดเดาได้ว่าควรใช้การผลิตแบบใดเพื่อแทนที่สตริงอินพุตเฉพาะ ตัวแยกวิเคราะห์แบบคาดการณ์ใช้จุดมองไปข้างหน้า ซึ่งชี้ไปยังสัญลักษณ์อินพุตถัดไป การย้อนรอยไม่ใช่ปัญหากับเทคนิคการแยกวิเคราะห์นี้ เป็นที่รู้จักในชื่อ LL(1) Parser

  1. การแยกวิเคราะห์โคตรแบบเรียกซ้ำ:

เทคนิคการแยกวิเคราะห์นี้จะแยกวิเคราะห์อินพุตซ้ำเพื่อสร้างแผนผังคำสรรเสริญ ประกอบด้วยฟังก์ชันเล็กๆ หลายฟังก์ชัน หนึ่งฟังก์ชันสำหรับแต่ละ nonterminal ในไวยากรณ์

การแยกวิเคราะห์จากล่างขึ้นบน

ในการวิเคราะห์แบบ Bottom Up ในการออกแบบคอมไพเลอร์ การสร้าง Parse Tree จะเริ่มต้นด้วย Leave จากนั้นจึงประมวลผลไปยัง Root เรียกอีกอย่างว่าการวิเคราะห์แบบ Shift-Reduce การวิเคราะห์ประเภทนี้ในการออกแบบคอมไพเลอร์จะสร้างขึ้นด้วยความช่วยเหลือของการใช้บางอย่าง เครื่องมือซอฟต์แวร์.

ข้อผิดพลาด – วิธีการกู้คืน

ข้อผิดพลาดทั่วไปที่เกิดขึ้นในการแยกวิเคราะห์ซอฟต์แวร์ระบบ

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

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

การกู้คืนโหมดคำสั่ง

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

การกู้คืนโหมดตื่นตระหนก

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

การกู้คืนระดับวลี

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

ข้อผิดพลาดโปรดักชั่น

  • การกู้คืนการผลิตข้อผิดพลาดจะขยายไวยากรณ์สำหรับภาษาที่สร้างโครงสร้างที่ผิดพลาด จากนั้นตัววิเคราะห์จะดำเนินการวินิจฉัยข้อผิดพลาดเกี่ยวกับโครงสร้างนั้น

การแก้ไขทั่วโลก

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

ไวยากรณ์

ไวยากรณ์คือชุดของกฎโครงสร้างที่อธิบายภาษา ไวยากรณ์กำหนดโครงสร้างของประโยค คำนี้ยังหมายถึงการศึกษากฎเหล่านี้ และไฟล์นี้รวมถึงสัณฐานวิทยา เสียงวิทยา และไวยากรณ์ สามารถอธิบายไวยากรณ์ได้หลายอย่าง การเขียนโปรแกรมภาษา.

กฎของแบบฟอร์มไวยากรณ์

  • สัญลักษณ์ที่ไม่ใช่เทอร์มินัลควรปรากฏทางด้านซ้ายของการผลิตอย่างน้อยหนึ่งรายการ
  • ไม่ควรแสดงสัญลักษณ์เป้าหมายที่ด้านขวาของ ::= ของการผลิตใดๆ
  • กฎจะเกิดซ้ำหาก LHS ปรากฏใน RHS

อนุสัญญาสัญกรณ์

สัญลักษณ์ตามรูปแบบการสัญกรณ์อาจระบุได้โดยการใส่องค์ประกอบไว้ในวงเล็บเหลี่ยม ซึ่งเป็นลำดับของอินสแตนซ์ขององค์ประกอบโดยพลการ ซึ่งสามารถระบุได้โดยการใส่องค์ประกอบไว้ในวงเล็บเหลี่ยมตามด้วยสัญลักษณ์ดอกจัน { … }*

เป็นทางเลือกทางเลือกซึ่งอาจใช้สัญลักษณ์ภายในกฎข้อเดียว อาจอยู่ในวงเล็บ ([,] ) เมื่อจำเป็น

เทอร์มินัลพื้นที่การประชุมเชิงสัญลักษณ์สองประเภทและเทอร์มินัลที่ไม่ใช่เทอร์มินัล

1.ขั้ว:

  • ตัวอักษรตัวพิมพ์เล็กในตัวอักษรเช่น a, b, c,
  • Operaสัญลักษณ์ทอร์ เช่น +,-, * เป็นต้น
  • สัญลักษณ์เครื่องหมายวรรคตอน เช่น วงเล็บ, แฮช, ลูกน้ำ
  • 0, 1, …, 9 หลัก
  • สตริงตัวหนา เช่น id หรือ if อะไรก็ตามที่แสดงถึงสัญลักษณ์เทอร์มินัลเดียว

2. ไม่ใช่เทอร์มินัล:

  • ตัวอักษรตัวพิมพ์ใหญ่ เช่น A, B, C
  • ชื่อตัวเอียงตัวพิมพ์เล็ก: สำนวนหรือบางส่วน

ไวยากรณ์ฟรีตามบริบท

CFG เป็นไวยากรณ์แบบเรียกซ้ำด้านซ้ายซึ่งมีการผลิตประเภทนี้อย่างน้อยหนึ่งรายการ กฎในไวยากรณ์ที่ไม่มีบริบทส่วนใหญ่จะเป็นแบบเรียกซ้ำ ตัววิเคราะห์ไวยากรณ์จะตรวจสอบว่าโปรแกรมเฉพาะตรงตามกฎทั้งหมดของไวยากรณ์ที่ไม่มีบริบทหรือไม่ หากเป็นไปตามนั้น ตัววิเคราะห์ไวยากรณ์ของกฎเหล่านี้อาจสร้างแผนผังการแยกวิเคราะห์สำหรับโปรแกรมนั้น

expression -> expression -+ term
expression -> expression – term 
expression-> term
term  -> term * factor
term -> expression/ factor
term  -> factor factor
factor ->  ( expression )
factor -> id

ที่มาของไวยากรณ์

ที่มาของไวยากรณ์คือลำดับของกฎไวยากรณ์ที่แปลงสัญลักษณ์เริ่มต้นให้เป็นสตริง รากศัพท์พิสูจน์ว่าสตริงเป็นภาษาของไวยากรณ์

อนุพันธ์ซ้ายสุด

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

รากศัพท์ขวาสุด

การสแกนแหล่งที่มาทางขวาสุดและแทนที่อินพุตด้วยกฎการผลิตจากขวาไปซ้ายตามลำดับ เรียกว่ารากขวาสุด รูปแบบประโยคที่ได้มาจากรากขวาสุดเรียกว่ารูปแบบประโยคที่ถูกต้อง

ไวยากรณ์กับตัววิเคราะห์คำศัพท์

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

ตัววิเคราะห์ไวยากรณ์

ข้อเสียของการใช้ตัววิเคราะห์ไวยากรณ์

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

สรุป

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

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