มีทฤษฎีบทชาวบ้านที่บอกว่า C นั้นยากที่จะแยกวิเคราะห์และโดยพื้นฐานแล้ว C ++ เป็นไปไม่ได้
มันไม่เป็นความจริง
สิ่งที่เป็นความจริงก็คือ C และ C ++ นั้นค่อนข้างยากที่จะแยกวิเคราะห์โดยใช้ตัวแยกวิเคราะห์ LALR (1) โดยไม่ต้องแฮ็คเครื่องจักรในการแยกวิเคราะห์และทำให้ข้อมูลตารางสัญลักษณ์ยุ่งเหยิง ในความเป็นจริงแล้ว GCC ใช้ในการแยกวิเคราะห์โดยใช้ YACC และแฮ็กเกอร์เพิ่มเติมเช่นนี้และใช่มันน่าเกลียด ตอนนี้ GCC ใช้ตัวแยกวิเคราะห์ที่เขียนด้วยลายมือ แต่ยังคงใช้แฮ็กเกอร์ตารางสัญลักษณ์ ชาวเสียงดังไม่เคยพยายามใช้เครื่องแยกวิเคราะห์อัตโนมัติ AFAIK ตัวแยกวิเคราะห์เสียงดังได้รับการเข้ารหัสแบบเรียกซ้ำเสมอ
ความจริงก็คือ C และ C ++ นั้นค่อนข้างง่ายในการแยกวิเคราะห์ด้วยตัวแยกวิเคราะห์ที่สร้างขึ้นโดยอัตโนมัติที่แข็งแกร่งกว่าเช่นตัวแยกวิเคราะห์ GLRและคุณไม่จำเป็นต้องแฮ็กใด ๆ Elsa c ++ แยกวิเคราะห์เป็นตัวอย่างหนึ่งของเรื่องนี้ Front End C ++ของเราเป็นอีกส่วนหนึ่ง (เช่นเดียวกับส่วนหน้า "คอมไพเลอร์" ของเรา GLR เป็นเทคโนโลยีการแยกวิเคราะห์ที่ยอดเยี่ยมมาก)
ส่วนหน้า C ++ ของเราไม่เร็วเท่า GCC และช้ากว่า Elsa อย่างแน่นอน เราใช้พลังงานเพียงเล็กน้อยในการปรับแต่งมันอย่างระมัดระวังเพราะเรามีปัญหาเร่งด่วนอื่น ๆ อีก (อย่างไรก็ตามมันถูกใช้กับโค้ด C ++ หลายล้านบรรทัด) Elsa น่าจะช้ากว่า GCC เพียงเพราะมันเป็นเรื่องทั่วไป ด้วยความเร็วโปรเซสเซอร์ในปัจจุบันความแตกต่างเหล่านี้อาจไม่สำคัญมากนักในทางปฏิบัติ
แต่ "คอมไพเลอร์ตัวจริง" ที่เผยแพร่กันอย่างแพร่หลายในปัจจุบันมีรากฐานมาจากคอมไพเลอร์เมื่อ 10 หรือ 20 ปีก่อนหรือมากกว่านั้น จากนั้นความไร้ประสิทธิภาพก็มีความสำคัญมากขึ้นและไม่มีใครเคยได้ยินเกี่ยวกับตัวแยกวิเคราะห์ GLR ดังนั้นผู้คนจึงทำในสิ่งที่พวกเขารู้ว่าต้องทำอย่างไร เสียงดังขึ้นเป็นเรื่องล่าสุด แต่แล้วทฤษฎีบทชาวบ้านก็ยังคงรักษา "การโน้มน้าวใจ" ไว้เป็นเวลานาน
คุณไม่จำเป็นต้องทำแบบนั้นอีกต่อไป คุณสามารถใช้ GLR และตัวแยกวิเคราะห์อื่น ๆ เป็นส่วนหน้าได้อย่างสมเหตุสมผลโดยมีการปรับปรุงการบำรุงรักษาคอมไพเลอร์
สิ่งที่เป็นความจริงก็คือการได้รับไวยากรณ์ที่ตรงกับพฤติกรรมของคอมไพเลอร์เพื่อนบ้านที่เป็นมิตรของคุณนั้นยาก ในขณะที่คอมไพเลอร์ C ++ เกือบทั้งหมดใช้มาตรฐานดั้งเดิม (ส่วนใหญ่) แต่ก็มักจะมีส่วนขยายมุมมืดมากมายเช่นข้อกำหนด DLL ในคอมไพเลอร์ MS เป็นต้นหากคุณมีเครื่องมือแยกวิเคราะห์ที่แข็งแกร่งคุณสามารถใช้เวลาของคุณในการพยายามหา ไวยากรณ์ขั้นสุดท้ายเพื่อให้ตรงกับความเป็นจริงแทนที่จะพยายามดัดไวยากรณ์ของคุณเพื่อให้ตรงกับข้อ จำกัด ของตัวสร้างโปรแกรมแยกวิเคราะห์ของคุณ
แก้ไขพฤศจิกายน 2555: ตั้งแต่เขียนคำตอบนี้เราได้ปรับปรุงส่วนหน้า C ++ ของเราเพื่อรองรับ C ++ 11 แบบเต็มรวมถึงภาษาถิ่น ANSI, GNU และ MS ในขณะที่มีสิ่งพิเศษมากมายเราไม่จำเป็นต้องเปลี่ยนเครื่องมือแยกวิเคราะห์ของเรา เราเพิ่งแก้ไขกฎไวยากรณ์ เราไม่ต้องเปลี่ยนการวิเคราะห์ความหมาย; C ++ 11 มีความซับซ้อนมากในเชิงความหมายและงานนี้ทำให้ความพยายามในการเรียกใช้โปรแกรมแยกวิเคราะห์
แก้ไขกุมภาพันธ์ 2015: ... ตอนนี้จัดการ C ++ 14 แบบเต็ม (ดูรับ AST ที่มนุษย์สามารถอ่านได้จากรหัส c ++สำหรับการแยกวิเคราะห์ GLR ของรหัสบิตธรรมดาและ "การแยกวิเคราะห์ที่น่าอับอายที่สุดของ C ++")
แก้ไขเมษายน 2017: ตอนนี้จัดการ (ร่าง) C ++ 17