Warum hat GCC von Bison zu einem rekursiven Abstiegsparser für C ++ und C gewechselt?

10

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

neelsg
quelle
1
Schließlich werden alle Parser nach genügend Modifikationen selbst
Ratschenfreak
1
Das Teilen Ihrer Forschung hilft allen . Sagen Sie uns, was Sie versucht haben und warum es Ihren Anforderungen nicht entsprach. Dies zeigt, dass Sie sich die Zeit genommen haben, um sich selbst zu helfen. Es erspart uns, offensichtliche Antworten zu wiederholen, und vor allem hilft es Ihnen, eine spezifischere und relevantere Antwort zu erhalten. Siehe auch Fragen
Mücke
1
@gnat Ich erweiterte meine Frage
neelsg
1
C ++ ist im Vergleich zu den meisten anderen Programmiersprachen eine außerordentlich komplexe zu analysierende Sprache. Mein Bauchgefühl ist, dass ein Allzweck-Parser bestimmte Optimierungen, die ein selbst gebrauter Parser verwenden könnte, wahrscheinlich nicht unterstützen könnte.

Antworten:

16

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).

Basile Starynkevitch
quelle