การออกแบบคอมไพเลอร์ - การกู้คืนข้อผิดพลาด

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

  • Lexical : ชื่อของตัวระบุบางตัวพิมพ์ไม่ถูกต้อง

  • Syntactical : ไม่มีอัฒภาคหรือวงเล็บไม่สมดุล

  • Semantical : การกำหนดค่าที่เข้ากันไม่ได้

  • Logical : รหัสไม่สามารถเข้าถึงได้วนซ้ำไม่สิ้นสุด

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

โหมดตื่นตระหนก

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

โหมดคำสั่ง

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

เกิดข้อผิดพลาดในการผลิต

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

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

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

ต้นไม้ไวยากรณ์นามธรรม

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

หากเฝ้าดูอย่างใกล้ชิดเราพบว่าโหนดลีฟส่วนใหญ่เป็นโหนดลูกเดียวของโหนดแม่ ข้อมูลนี้สามารถกำจัดได้ก่อนที่จะให้อาหารในระยะต่อไป โดยการซ่อนข้อมูลเพิ่มเติมเราจะได้รับต้นไม้ตามที่แสดงด้านล่าง:

ต้นไม้นามธรรมสามารถแสดงเป็น:

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