ไวยากรณ์มักจะถูกกำหนดให้เป็นบริบทไวยากรณ์ฟรี - คำนิยามที่แม่นยำจะได้รับในหน้าวิกิพีเดีย แต่การทำงานเช่นเดียวกับมันไม่อยู่ในเร่ซึ่งจะขึ้นอยู่กับวัวกระทิงซึ่งเป็นในทางกลับกันขึ้นอยู่กับyacc
มันบอกว่าที่นี่ที่เร่ใช้parser LALR นี่คือตัวแยกวิเคราะห์ LRที่ตารางการค้นหาย่อตัวอาจแนะนำการแยกวิเคราะห์ความขัดแย้งลดความหมายของไวยากรณ์ LR (เช่นไวยากรณ์อิสระบริบทที่ตัวแยกวิเคราะห์ LR สามารถแยกวิเคราะห์) หากคุณต้องการทราบเกี่ยวกับข้อ จำกัด ของสาขานี้โดยเฉพาะของ parsers และของ parsers อื่น ๆ ภาพรวมของทุกชนิดของการแยกวิเคราะห์เทคนิค (LL, LR และอื่น ๆ ) จะได้รับที่นี่
ในการตอบคำถามของคุณ: มีอัลกอริทึมการแยกวิเคราะห์ที่มีความสามารถในการแยกวิเคราะห์ภาษาที่ไม่มีบริบทใด ๆ แม้ว่าภาษานั้นจะคลุมเครือ (เช่นมีวิธีการตีความอินพุตมากกว่าหนึ่งวิธี):
อัลกอรึทึมแรกนั้นคืออัลกอริธึมCYKซึ่งน่าเสียดายที่มีเวลาทำงานของโดยที่คือความยาวของสตริงอินพุตและn | G |O ( n3| G | )n| G |คือขนาดของไวยากรณ์และดังนั้นจึงเป็นไปไม่ได้สำหรับการแยกภาษา
O ( n3)O ( n2)
ที่นี่คุณสามารถค้นหาบทความเกี่ยวกับการใช้งานจริงของอัลกอริทึม Earley (การปรับตัว) พวกเขาสรุปว่า: "เมื่อพิจารณาถึงความเป็นเอกเทศของ Earley เมื่อเทียบกับ LALR (1) การแยกวิเคราะห์ ((ซึ่งประมาณคร่าวๆว่า PLY ทำอะไร)) และเมื่อพิจารณาว่าแม้แต่ PEP (การใช้อัลกอริธึมของ Earley)) ผู้ใช้นี่เป็นผลลัพธ์ที่ยอดเยี่ยม "
ประเภทสุดท้ายของการแยกวิเคราะห์เป็นตัวแยกวิเคราะห์จี นี่เป็นเวอร์ชันทั่วไปของการแยกวิเคราะห์ LR ซึ่งสามารถแยกวิเคราะห์ภาษาที่ไม่มีบริบท
การดำเนินผู้ใหญ่ของจีเป็นASF + ไอ้เวร กระทิงยังสามารถสร้างตัวแยกวิเคราะห์ GLR แม้ว่าการใช้งานจะแตกต่างจากอัลกอริทึม 'มาตรฐาน' GLR เล็กน้อย Elkhound ขั้นตอนวิธีการเป็นขั้นตอนวิธีไฮบริดจี / LALR มันใช้ LALR เมื่อเป็นไปได้และ GLR เมื่อจำเป็นเพื่อที่จะได้อย่างรวดเร็วและมีความสามารถในการแยกไวยากรณ์ใด ๆ
นอกเหนือจากไวยากรณ์ฟรีตามบริบทแล้วยังมีไวยากรณ์ที่มีความอ่อนไหวตามบริบทแต่โดยทั่วไปแล้วยากที่จะแยกวิเคราะห์และไม่เพิ่มความหมายมาก: คุณสามารถทำอะไรกับมันได้มากขึ้น แต่สำหรับแอปพลิเคชันส่วนใหญ่การใช้งานพิเศษไม่เกี่ยวข้อง ภาษาธรรมชาติ
เป็นขั้นตอนสุดท้ายมีไวยากรณ์ที่ไม่ จำกัด เมื่อถึงจุดนี้ไวยากรณ์ก็สมบูรณ์แบบทัวริงดังนั้นจึงไม่มีใครผูกมัดได้ว่าจะใช้เวลานานแค่ไหนในการแยกวิเคราะห์ภาษาใดภาษาหนึ่งซึ่งไม่เป็นที่ต้องการสำหรับแอปพลิเคชันการแยกวิเคราะห์ส่วนใหญ่ พลังพิเศษนั้นแทบไม่จำเป็นเลย หากคุณต้องการใช้พลังงานทั้งหมดนั้นจะมีเครื่องภาษาให้บริการ
สุดท้ายนี้การใช้ parser-generator ของคุณเองไม่ใช่เรื่องเล็กน้อยโดยเฉพาะอย่างยิ่งที่จะทำให้มันเร็ว ฉันเพิ่งเสร็จสิ้นการสร้าง flex ของตัวเอง (ตัวกำเนิด lexer) และในขณะนี้ดูเหมือนว่าการออกกำลังกายในปัญหาอัลกอริธึมที่ค่อนข้างง่าย แต่มันค่อนข้างซับซ้อนที่จะทำให้ถูกต้องโดยเฉพาะอย่างยิ่งเมื่อฉันพยายามสนับสนุน Unicode พิจารณาใช้การใช้งานที่มีอยู่แล้วแทนที่จะเขียนเอง