ฉันต้องการแยกภาษาเฉพาะโดเมนที่ผู้ใช้กำหนด ภาษาเหล่านี้มักจะใกล้กับสัญลักษณ์ทางคณิตศาสตร์ (ฉันไม่ได้แยกภาษาธรรมชาติ) ผู้ใช้กำหนด DSL ในสัญลักษณ์ BNF เช่นนี้
expr ::= LiteralInteger
| ( expr )
| expr + expr
| expr * expr
การป้อนข้อมูลเช่น1 + ( 2 * 3 )
ต้องได้รับการยอมรับในขณะที่การป้อนข้อมูลเช่น1 +
ต้องได้รับการปฏิเสธเป็นไม่ถูกต้องและการป้อนข้อมูลเช่น1 + 2 * 3
ต้องได้รับการปฏิเสธเป็นที่คลุมเครือ
ความยากลำบากส่วนกลางที่นี่คือการรับมือกับไวยากรณ์ที่กำกวมในวิธีที่ใช้งานง่าย การ จำกัด ไวยากรณ์ให้ไม่คลุมเครือนั้นไม่ใช่ตัวเลือกนั่นคือวิธีการใช้ภาษา - แนวคิดคือผู้เขียนต้องการละเว้นวงเล็บเมื่อไม่จำเป็นต้องหลีกเลี่ยงความคลุมเครือ ตราบใดที่การแสดงออกไม่ชัดเจนฉันต้องแยกมันและถ้าไม่ฉันต้องปฏิเสธมัน
โปรแกรมแยกวิเคราะห์ของฉันต้องทำงานกับไวยากรณ์ที่ไม่มีบริบทใด ๆ แม้แต่ที่คลุมเครือและต้องยอมรับอินพุตที่ไม่คลุมเครือทั้งหมด ฉันต้องการแผนผังการแยกวิเคราะห์สำหรับอินพุตที่ยอมรับทั้งหมด สำหรับการป้อนข้อมูลที่ไม่ถูกต้องหรือไม่ชัดเจนฉันต้องการข้อความแสดงข้อผิดพลาดที่ดี แต่เริ่มต้นด้วยสิ่งที่ฉันจะได้รับ
โดยทั่วไปฉันจะเรียกใช้ parser ในอินพุตที่ค่อนข้างสั้น ดังนั้นอัลกอริธึมที่เร็วกว่า asymptotically อาจไม่ใช่ทางเลือกที่ดีที่สุด ฉันต้องการที่จะปรับให้เหมาะสมสำหรับการกระจายของอินพุตประมาณ 80% ความยาวน้อยกว่า 20 สัญลักษณ์, 19% ระหว่าง 20 และ 50 สัญลักษณ์และอินพุต 1% ที่หายากอีกต่อไป ความเร็วสำหรับอินพุตที่ไม่ถูกต้องไม่ใช่ประเด็นหลัก นอกจากนี้ฉันคาดว่าจะมีการปรับเปลี่ยน DSL รอบ ๆ อินพุตทุก 1,000 ถึง 100,000 ฉันสามารถใช้เวลาสองสามวินาทีในการประมวลผลไวยากรณ์ก่อนไม่กี่นาที
ฉันควรตรวจสอบอัลกอริทึมการแยกวิเคราะห์โดยกำหนดขนาดอินพุตปกติของฉันอย่างไร การรายงานข้อผิดพลาดควรเป็นปัจจัยในการเลือกของฉันหรือฉันควรจะมีสมาธิในการแยกวิเคราะห์อินพุตที่ไม่คลุมเครือ
(ในโครงการที่ฉันต้องการ (อีกสักครู่) ฉันใช้CYKซึ่งไม่ยากเกินกว่าที่จะใช้งานและทำงานได้อย่างเพียงพอสำหรับขนาดอินพุตของฉัน แต่ไม่ได้สร้างข้อผิดพลาดที่ดีมาก)
x+y+z
อย่าคาดหวังว่าคุณจริงข้อผิดพลาดสำหรับการป้อนข้อมูลที่ไม่ชัดเจนถ้าเขียนผู้ใช้
+
ดังนั้นจึงx+y+z
เป็นที่คลุมเครือดังนั้นจึงผิดพลาด