การแยกวิเคราะห์ C ++ เริ่มยากขึ้น การแยกวิเคราะห์ Java นั้นยากพอ ๆ กัน
เห็นนี้คำตอบดังนั้นการพูดคุยว่าทำไม C (และ C ++) เป็น "ยาก" ที่จะแยก สรุปสั้น ๆ คือไวยากรณ์ของ C และ C ++ มีความคลุมเครือโดยเนื้อแท้ พวกเขาจะให้คุณแยกวิเคราะห์หลายรายการและคุณต้องใช้บริบทเพื่อแก้ไขความไม่ชัดเจน จากนั้นผู้คนทำผิดโดยสมมติว่าคุณต้องแก้ไขความคลุมเครือในขณะที่คุณแยกวิเคราะห์ ไม่เป็นเช่นนั้นดูด้านล่าง หากคุณยืนยันที่จะแก้ไขความคลุมเครือในขณะที่คุณแยกวิเคราะห์ตัวแยกวิเคราะห์ของคุณจะซับซ้อนมากขึ้นและสร้างได้ยากขึ้นมาก แต่ความซับซ้อนนั้นเป็นบาดแผลที่เกิดขึ้นเอง
IIRC, ไวยากรณ์ LALR (1) ที่ "ชัดเจน" ของ Java 1.4 นั้นไม่คลุมเครือดังนั้นการแยกวิเคราะห์จึง "ง่าย" ฉันไม่แน่ใจว่า Java สมัยใหม่ไม่มีความคลุมเครือในท้องถิ่นทางไกลเป็นอย่างน้อย มักจะมีปัญหาในการตัดสินใจว่า "... >>" ปิดสองเทมเพลตหรือเป็น "ตัวดำเนินการกะที่ถูกต้อง" ฉันสงสัยว่าJava สมัยใหม่ไม่แยกวิเคราะห์ด้วย LALR (1) อีกต่อไปอีกต่อไป
แต่เราสามารถผ่านพ้นปัญหาการแยกวิเคราะห์ได้โดยใช้ตัวแยกวิเคราะห์ที่แข็งแกร่ง (หรือตัวแยกวิเคราะห์ที่อ่อนแอและแฮ็กคอลเลกชันบริบทเนื่องจากส่วนหน้าของ C และ C ++ ส่วนใหญ่ทำในขณะนี้) สำหรับทั้งสองภาษา C และ C ++ มีความซับซ้อนเพิ่มเติมในการมีตัวประมวลผลล่วงหน้า สิ่งเหล่านี้มีความซับซ้อนในทางปฏิบัติมากกว่าที่คิด ข้อเรียกร้องอย่างหนึ่งคือตัวแยกวิเคราะห์ C และ C ++ นั้นยากมากที่ต้องเขียนด้วยมือ ไม่เป็นความจริง คุณสามารถสร้างตัวแยกวิเคราะห์ Java และ C ++ ได้ดีด้วยตัวสร้างตัวแยกวิเคราะห์ GLR
แต่การแยกวิเคราะห์ไม่ใช่ปัญหาจริงๆ
เมื่อคุณแยกวิเคราะห์แล้วคุณจะต้องทำอะไรบางอย่างกับต้นไม้ AST / parse ในทางปฏิบัติคุณจำเป็นต้องรู้สำหรับตัวระบุทุกตัวความหมายของมันคืออะไรและใช้ที่ไหน ("ชื่อและความละเอียดประเภท" อย่างเลอะเทอะการสร้างตารางสัญลักษณ์) สิ่งนี้กลายเป็นงานที่มากกว่าการทำให้ตัวแยกวิเคราะห์ถูกต้องประกอบไปด้วยการสืบทอดอินเทอร์เฟซการโอเวอร์โหลดและเทมเพลตและความสับสนจากความจริงที่ว่าความหมายของทั้งหมดนี้เขียนด้วยภาษาธรรมชาติที่ไม่เป็นทางการซึ่งแพร่กระจายไปทั่วหลายสิบถึงหลายร้อยหน้า ของมาตรฐานภาษา C ++ แย่มากที่นี่ Java 7 และ 8 กำลังแย่มากจากมุมมองนี้ (และตารางสัญลักษณ์ก็ไม่ใช่ทั้งหมดที่คุณต้องการดูประวัติของฉันสำหรับบทความที่ยาวขึ้นเรื่อง "Life After Parsing")
คนส่วนใหญ่ต่อสู้กับส่วนการแยกวิเคราะห์ที่บริสุทธิ์ (มักจะไม่จบ; ตรวจสอบ SO ด้วยตัวเองสำหรับคำถามมากมายเกี่ยวกับวิธีสร้างตัวแยกวิเคราะห์ที่ใช้งานได้สำหรับภาษาที่แท้จริง) ดังนั้นพวกเขาจึงไม่เคยเห็นชีวิตหลังจากการแยกวิเคราะห์ จากนั้นเราก็ได้ทฤษฎีบทชาวบ้านเกี่ยวกับสิ่งที่ยากต่อการแยกวิเคราะห์และไม่มีสัญญาณว่าจะเกิดอะไรขึ้นหลังจากขั้นตอนนั้น
การแก้ไขไวยากรณ์ C ++ จะไม่ช่วยให้คุณไปได้ทุกที่
เกี่ยวกับการเปลี่ยนไวยากรณ์ C ++: คุณจะพบว่าคุณจำเป็นต้องแก้ไขสถานที่จำนวนมากเพื่อดูแลความคลุมเครือที่หลากหลายในท้องถิ่นและจริงในไวยากรณ์ C ++ ใด ๆ หากคุณยืนยันรายการต่อไปนี้อาจเป็นจุดเริ่มต้นที่ดี ฉันยืนยันว่าไม่มีประเด็นในการทำเช่นนี้หากคุณไม่ใช่คณะกรรมการมาตรฐาน C ++ หากคุณทำเช่นนั้นและสร้างคอมไพเลอร์โดยใช้สิ่งนั้นก็ไม่มีใครใช้มันได้ มีการลงทุนมากเกินไปในแอปพลิเคชั่น C ++ ที่มีอยู่เพื่อสลับเพื่อความสะดวกของผู้สร้างตัววิเคราะห์ นอกจากนี้ความเจ็บปวดของพวกเขาสิ้นสุดลงแล้วและตัวแยกวิเคราะห์ที่มีอยู่ก็ใช้ได้ดี
คุณอาจต้องการเขียนโปรแกรมแยกวิเคราะห์ของคุณเอง ตกลงไม่เป็นไร อย่าคาดหวังว่าชุมชนที่เหลือจะอนุญาตให้คุณเปลี่ยนภาษาที่พวกเขาต้องใช้เพื่อให้ง่ายขึ้นสำหรับคุณ พวกเขาทั้งหมดต้องการให้ง่ายขึ้นสำหรับพวกเขาและนั่นคือการใช้ภาษาตามเอกสารและการนำไปใช้