รับข้อผิดพลาดทางไวยากรณ์ที่มีความหมายจาก antlr parser

ฉันได้สร้าง Script-Interpreter สำหรับ .Net โดยใช้ Antlr มันใช้งานได้ค่อนข้างดี แต่ข้อผิดพลาดทางไวยากรณ์ที่สร้างขึ้นนั้นแย่มาก คุณสามารถดูไลบรารีที่อยู่ในขั้นตอนการพัฒนาระยะเริ่มต้นได้ที่นี่ และไวยากรณ์ที่ใช้คือ อิงตามไวยากรณ์ ecma-Script นี้

ตอนนี้ปัญหาใหญ่คือเมื่อฉันมีไฟล์สคริปต์ขนาดใหญ่และฉันมีคำจำกัดความของวัตถุที่ระบุว่า

obj = { var1 = "hello"
        var2 = "world};

ฉันคาดหวังข้อความว่า "ข้อผิดพลาดทางไวยากรณ์ที่บรรทัด xyz ',' คาดหวัง แต่กลับได้รับรายการที่ไม่มีทางเลือกอื่นนับร้อยที่ xyz สำหรับทุกข้อผิดพลาดในการติดตามผลที่เกิดจากเครื่องหมายจุลภาคหายไป

มีวิธีรับข้อผิดพลาดหนึ่งอันที่เกิดจากเครื่องหมายจุลภาคหายไปหรือไม่? มันจะโอเคโดยสิ้นเชิง หากบ่นเกี่ยวกับโทเค็น var2 ที่ไม่คาดคิด


person Matt W    schedule 31.03.2017    source แหล่งที่มา


คำตอบ (1)


คุณสามารถใช้ 2 วิธีสำหรับสิ่งนี้:

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

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

person Raven    schedule 05.04.2017
comment
แทงค์คุณมาก. ฉันได้ลองใช้วิธีแรกแล้ว ปัญหาคือ ไม่สามารถรับข้อผิดพลาดเริ่มแรกที่ทำให้ข้อผิดพลาดอื่นๆ ทั้งหมดเป็นเช่นนั้นได้ อย่างไรก็ตาม วิธีที่สองของคุณทำงานได้อย่างสมบูรณ์แบบ และฉันก็สามารถแจ้งเตือนข้อผิดพลาดทางไวยากรณ์ที่พบบ่อยที่สุดได้อย่างมีความหมายด้วยวิธีที่คุณอธิบายในไวยากรณ์ของคุณ - person Matt W; 06.04.2017