Gab es eine Sprachänderung, die dies erforderte, oder einen praktischen Grund, warum Bison nicht mehr angemessen oder optimal war?
Ich habe auf Wikipedia gesehen, dass sie gewechselt haben, unter Bezugnahme auf die Versionshinweise zu GCC 3.4 und GCC 4.1 .
In diesen Versionshinweisen heißt es:
Ein handgeschriebener C ++ - Parser rekursiver Abstammung hat den von YACC abgeleiteten C ++ - Parser aus früheren GCC-Versionen ersetzt. Der neue Parser enthält eine stark verbesserte Infrastruktur, die für ein besseres Parsen von C ++ - Quellcodes, die Handhabung von Erweiterungen und eine saubere Trennung (soweit möglich) zwischen ordnungsgemäßer Semantikanalyse und Parsen erforderlich ist. Der neue Parser behebt viele Fehler, die im alten Parser gefunden wurden.
Und:
Der alte Bison-basierte C- und Objective-C-Parser wurde durch einen neuen, schnelleren handgeschriebenen Parser für rekursiven Abstieg ersetzt
Ich würde gerne wissen, welche tatsächlichen Probleme sie hatten und warum es unmöglich / unpraktisch war, sie mit Bison zu lösen
Antworten:
GCC hat auf handgeschriebenes Parsing umgestellt, da Fehlermeldungen bei der Verwendung rekursiver Abstiegstechniken aussagekräftiger sind, wie ich hier erläutert habe .
Außerdem wird C ++ zu einer (syntaktisch) komplexen Sprache zum Parsen, die sich für die Verwendung von Parser-Generatoren nicht lohnt.
Schließlich analysiert der Großteil der Arbeit eines echten Compilers nicht, sondern optimiert. GCC-Optimierungsdurchläufe am mittleren Ende sind viel komplexer als das Parsen.
(Übrigens können Sie GCC anpassen, z. B. mit Plugins oder mit MELT , aber Sie können die Syntax der akzeptierten Sprache nicht wirklich erweitern - außer durch Hinzufügen von Attributen und Pragmas).
quelle