Es gibt einen Folk-Satz, der besagt, dass C schwer zu analysieren ist und C ++ im Wesentlichen unmöglich ist.
Es ist nicht wahr.
Was wahr ist, ist, dass C und C ++ mit LALR (1) -Parsern ziemlich schwer zu analysieren sind, ohne die Parsing-Maschinerie zu hacken und sich in Symboltabellendaten zu verwickeln. GCC hat sie tatsächlich mit YACC und zusätzlichem Hackery wie diesem analysiert, und ja, es war hässlich. Jetzt verwendet GCC handgeschriebene Parser, aber immer noch mit der Symboltabelle Hackery. Die Clang-Leute haben nie versucht, automatisierte Parser-Generatoren zu verwenden. AFAIK the Clang Parser war schon immer eine handcodierte rekursive Abstammung.
Was stimmt, ist, dass C und C ++ mit einfacheren automatisch generierten Parsern, z. B. GLR-Parsern , relativ einfach zu analysieren sind und Sie keine Hacks benötigen. Der Elsa C ++ - Parser ist ein Beispiel dafür. Unser C ++ - Frontend ist ein anderes (wie alle unsere "Compiler" -Frontends ist GLR eine wunderbare Parsing-Technologie).
Unser C ++ - Frontend ist nicht so schnell wie das von GCC und sicherlich langsamer als Elsa. Wir haben wenig Energie in die sorgfältige Optimierung gesteckt, da wir andere dringlichere Probleme haben (dennoch wurde es in Millionen von Zeilen C ++ - Code verwendet). Elsa ist wahrscheinlich langsamer als GCC, nur weil es allgemeiner ist. Angesichts der heutigen Prozessorgeschwindigkeit sind diese Unterschiede in der Praxis möglicherweise nicht sehr wichtig.
Aber die heute weit verbreiteten "echten Compiler" haben ihre Wurzeln in Compilern von vor 10 oder 20 Jahren oder mehr. Ineffizienzen waren dann viel wichtiger, und niemand hatte von GLR-Parsern gehört, also taten die Leute, was sie zu tun wussten. Clang ist sicherlich jünger, aber dann behalten Volkstheoreme ihre "Überzeugungskraft" für lange Zeit.
Sie müssen es nicht mehr so machen. Sie können GLR und andere solche Parser sehr vernünftig als Frontends verwenden, um die Wartbarkeit des Compilers zu verbessern.
Was ist wahr, das ist eine Grammatik erhalten , die Ihre freundliche Nachbarschaft Compiler Verhalten entspricht hart ist. Während praktisch alle C ++ - Compiler (die meisten) des ursprünglichen Standards implementieren, haben sie auch viele Erweiterungen für dunkle Ecken, z. B. DLL-Spezifikationen in MS-Compilern usw. Wenn Sie eine starke Parsing-Engine haben, können Sie Ihre Zeit damit verbringen, diese zu erhalten Die endgültige Grammatik, die der Realität entspricht, anstatt zu versuchen, Ihre Grammatik so zu biegen, dass sie den Einschränkungen Ihres Parser-Generators entspricht.
BEARBEITEN November 2012: Seit wir diese Antwort geschrieben haben, haben wir unser C ++ - Frontend verbessert, um volles C ++ 11 zu verarbeiten, einschließlich ANSI-, GNU- und MS-Dialektvarianten. Obwohl es viele zusätzliche Dinge gab, müssen wir unsere Parsing-Engine nicht ändern. Wir haben gerade die Grammatikregeln überarbeitet. Wir mussten die semantische Analyse ändern; C ++ 11 ist semantisch sehr kompliziert, und diese Arbeit überflutet den Aufwand, den Parser zum Laufen zu bringen.
BEARBEITEN Februar 2015: ... behandelt jetzt volles C ++ 14. (Siehe GLS-Analyse eines einfachen Code-Bits und C ++ 's berüchtigte "ärgerlichste Analyse" unter " Vom Menschen lesbaren AST aus C ++ - Code abrufen").
BEARBEITEN April 2017: Behandelt jetzt (Entwurf) C ++ 17.