ตัวแยกวิเคราะห์ SLR, LALR และ LR สามารถใช้งานได้โดยใช้เครื่องจักรที่ขับเคลื่อนด้วยตารางเดียวกัน
โดยพื้นฐานแล้วอัลกอริทึมการแยกวิเคราะห์จะรวบรวมโทเค็นอินพุตถัดไป T และให้คำปรึกษาสถานะปัจจุบัน S (และ lookahead, GOTO และตารางการลดที่เกี่ยวข้อง) เพื่อตัดสินใจว่าจะทำอย่างไร:
- SHIFT: หากตารางปัจจุบันบอกว่าให้ SHIFT บนโทเค็น T คู่ (S, T) จะถูกผลักลงบนสแต็กแยกวิเคราะห์สถานะจะเปลี่ยนไปตามที่ตาราง GOTO ระบุสำหรับโทเค็นปัจจุบัน (เช่น GOTO (T) ) โทเค็นอินพุตอื่น T 'จะถูกดึงออกมาและกระบวนการจะทำซ้ำ
- การลด: ทุกสถานะมี 0, 1 หรือการลดที่เป็นไปได้มากมายที่อาจเกิดขึ้นในสถานะ ถ้าตัวแยกวิเคราะห์เป็น LR หรือ LALR โทเค็นจะถูกตรวจสอบเทียบกับชุด lookahead สำหรับการลดที่ถูกต้องทั้งหมดสำหรับสถานะ ถ้าโทเค็นตรงกับ lookahead ที่ตั้งค่าไว้สำหรับการลดสำหรับกฎไวยากรณ์ G = R1 R2 .. Rn การลดสแต็กและการเลื่อนจะเกิดขึ้น: การดำเนินการเชิงความหมายสำหรับ G ถูกเรียกสแต็กจะโผล่ n (จาก Rn) ครั้งคู่ ( S, G) ถูกผลักลงบนสแต็กสถานะใหม่ S 'ถูกตั้งค่าเป็น GOTO (G) และวงจรจะทำซ้ำด้วยโทเค็นเดียวกัน T ถ้าตัวแยกวิเคราะห์เป็นตัวแยกวิเคราะห์ SLR จะมีกฎการลดมากที่สุดหนึ่งกฎสำหรับ สถานะและดังนั้นการดำเนินการลดสามารถทำได้โดยสุ่มสี่สุ่มห้าโดยไม่ต้องค้นหาเพื่อดูว่าการลดใช้ข้อใด เป็นประโยชน์สำหรับตัวแยกวิเคราะห์ SLR เพื่อทราบว่ามีหรือไม่เป็นการลดลงหรือไม่ นี่เป็นเรื่องง่ายที่จะบอกได้ว่าแต่ละรัฐบันทึกจำนวนการลดที่เกี่ยวข้องอย่างชัดเจนหรือไม่และการนับนั้นจำเป็นสำหรับเวอร์ชัน L (AL) R ในทางปฏิบัติอยู่ดี
- ข้อผิดพลาด: หากไม่สามารถ SHIFT หรือ REDUCE ได้แสดงว่าข้อผิดพลาดทางไวยากรณ์จะถูกประกาศ
ดังนั้นถ้าพวกเขาใช้เครื่องจักรเดียวกันทั้งหมดประเด็นคืออะไร?
ค่าที่อ้างว่าใน SLR คือความเรียบง่ายในการนำไปใช้งาน คุณไม่จำเป็นต้องสแกนผ่านการตรวจสอบการลดจำนวนที่เป็นไปได้ในการตรวจสอบชุด lookahead เนื่องจากมีอยู่มากที่สุดและนี่เป็นการดำเนินการเพียงอย่างเดียวหากไม่มี SHIFT ออกจากสถานะ การลดที่ใช้สามารถแนบกับสถานะโดยเฉพาะดังนั้นเครื่องจักรแยกวิเคราะห์ SLR จึงไม่จำเป็นต้องตามล่าหามัน ในทางปฏิบัติตัวแยกวิเคราะห์ L (AL) R จะจัดการกับชุดภาษาที่มีประโยชน์มากขึ้นและมีงานพิเศษเพียงเล็กน้อยในการนำไปใช้ซึ่งไม่มีใครใช้ SLR ยกเว้นเป็นการฝึกหัดทางวิชาการ
ความแตกต่างระหว่าง LALR และ LR จะทำอย่างไรกับโต๊ะเครื่องกำเนิดไฟฟ้า. LR parser generator ติดตามการลดลงที่เป็นไปได้ทั้งหมดจากสถานะเฉพาะและชุด lookahead ที่แม่นยำ คุณจะลงเอยด้วยสถานะที่การลดทุกครั้งเชื่อมโยงกับผู้มองที่ตั้งค่าไว้จากบริบทด้านซ้าย สิ่งนี้มีแนวโน้มที่จะสร้างรัฐที่ค่อนข้างใหญ่ ตัวสร้างตัวแยกวิเคราะห์ LALR ยินดีที่จะรวมสถานะหากตาราง GOTO และชุด lookhead สำหรับการลดเข้ากันได้และไม่ขัดแย้งกัน สิ่งนี้ทำให้เกิดสถานะจำนวนน้อยกว่ามากในราคาที่ไม่สามารถแยกแยะลำดับสัญลักษณ์บางอย่างที่ LR สามารถแยกแยะได้ ดังนั้นตัวแยกวิเคราะห์ LR สามารถแยกวิเคราะห์ภาษาชุดใหญ่กว่าตัวแยกวิเคราะห์ LALR แต่มีตารางแยกวิเคราะห์ที่ใหญ่กว่ามาก ในทางปฏิบัติเราสามารถค้นหาไวยากรณ์ LALR ซึ่งใกล้เคียงกับภาษาเป้าหมายมากพอที่ขนาดของเครื่องสถานะนั้นคุ้มค่าที่จะปรับให้เหมาะสม
ทั้งสามใช้เครื่องจักรเดียวกัน SLR นั้น "ง่าย" ในแง่ที่คุณสามารถเพิกเฉยต่อเครื่องจักรเล็ก ๆ น้อย ๆ แต่มันก็ไม่คุ้มกับปัญหา LR แยกวิเคราะห์ชุดภาษาที่กว้างขึ้น แต่ตารางสถานะมักจะค่อนข้างใหญ่ นั่นทำให้ LALR เป็นตัวเลือกที่ใช้ได้จริง
จากที่กล่าวมาทั้งหมดนี้เป็นสิ่งที่ควรค่าแก่การรู้ว่าตัวแยกวิเคราะห์GLRสามารถแยกวิเคราะห์ภาษาที่ไม่มีบริบทโดยใช้เครื่องจักรที่ซับซ้อนกว่าแต่เป็นตารางเดียวกัน (รวมถึงเวอร์ชันที่เล็กกว่าที่ใช้โดย LALR) ซึ่งหมายความว่า GLR มีประสิทธิภาพมากกว่า LR, LALR และ SLR อย่างเคร่งครัด ค่อนข้างมากถ้าคุณสามารถเขียนไวยากรณ์ BNF มาตรฐาน GLR จะแยกวิเคราะห์ตามนั้น ความแตกต่างในเครื่องจักรคือ GLR ยินดีที่จะลองใช้การแยกวิเคราะห์หลาย ๆ ครั้งเมื่อมีข้อขัดแย้งระหว่างตาราง GOTO และหรือชุดผู้ค้นหา (GLR มีประสิทธิภาพอย่างไรเป็นอัจฉริยะอย่างแท้จริง [ไม่ใช่ของฉัน] แต่จะไม่พอดีกับโพสต์ SO นี้)
สำหรับฉันแล้วเป็นความจริงที่มีประโยชน์มหาศาล ฉันสร้างเครื่องวิเคราะห์โปรแกรมและตัวแปลงรหัสและตัวแยกวิเคราะห์เป็นสิ่งที่จำเป็น แต่ "ไม่น่าสนใจ"; งานที่น่าสนใจคือสิ่งที่คุณทำกับผลลัพธ์ที่แยกวิเคราะห์ดังนั้นจึงมุ่งเน้นไปที่การทำงานหลังการแยกวิเคราะห์ การใช้ GLR หมายความว่าฉันสามารถสร้างไวยากรณ์ที่ใช้งานได้ค่อนข้างง่ายเมื่อเทียบกับการแฮ็กไวยากรณ์เพื่อเข้าสู่รูปแบบที่ใช้งานได้ของ LALR สิ่งนี้มีความสำคัญมากเมื่อพยายามจัดการกับภาษาที่ไม่ใช่เชิงวิชาการเช่น C ++ หรือ Fortran ซึ่งคุณต้องการกฎหลายพันข้อเพื่อจัดการกับภาษาทั้งหมดได้ดีและคุณไม่ต้องการใช้ชีวิตของคุณในการพยายามแฮ็กกฎไวยากรณ์เพื่อ ตรงตามข้อ จำกัด ของ LALR (หรือแม้แต่ LR)
เป็นตัวอย่างที่มีชื่อเสียง C ++ ถือว่ายากมากที่จะแยกวิเคราะห์ ... โดยผู้ชายที่ทำการแยกวิเคราะห์ LALR C ++ นั้นตรงไปตรงมาในการแยกวิเคราะห์โดยใช้เครื่องจักร GLR โดยใช้กฎที่ให้ไว้ด้านหลังของคู่มืออ้างอิง C ++ (ฉันมีตัวแยกวิเคราะห์อย่างแม่นยำและไม่เพียง แต่จัดการกับวานิลลา C ++ เท่านั้น แต่ยังรวมถึงภาษาถิ่นของผู้ขายอีกด้วยซึ่งเป็นไปได้ในทางปฏิบัติเท่านั้นเนื่องจากเราใช้ตัวแยกวิเคราะห์ GLR, IMHO)
[แก้ไขพฤศจิกายน 2554: เราได้ขยายโปรแกรมแยกวิเคราะห์เพื่อรองรับ C ++ 11 ทั้งหมด GLR ช่วยให้ทำได้ง่ายขึ้นมาก แก้ไขสิงหาคม 2014: ตอนนี้จัดการ C ++ 17 ทั้งหมด ไม่มีอะไรพังหรือแย่ลง GLR ยังคงเป็นแมวเหมียว]