it-swarm.com.de

Verwenden moderne Sprachen immer noch Parser-Generatoren?

Ich habe über die gcc-Compiler-Suite auf Wikipedia recherchiert hier , als dies auftauchte:

GCC begann mit der Verwendung von mit Bison generierten LALR-Parsern, wechselte jedoch nach und nach zu handgeschriebenen Parsern mit rekursivem Abstieg. für C++ im Jahr 2004 und für C und Objective-C im Jahr 2006. Derzeit verwenden alle Frontends handgeschriebene Parser für rekursiven Abstieg

Mit diesem letzten Satz (und so sehr ich Wikipedia vertraue) kann ich definitiv sagen, dass "C (gcc), C++ (g ++), Ziel-C, Ziel-C++, Fortran (gfortran), Java (gcj), Ada (GNAT), Go (gccgo), Pascal (gpc), ... Quecksilber, Modula-2, Modula-3, PL/I, D (gdc) und VHDL (ghdl) ) "sind alle Frontends, die keinen Parser-Generator mehr verwenden. Das heißt, sie verwenden alle handgeschriebene Parser.

Meine Frage ist dann, ist diese Praxis allgegenwärtig? Insbesondere suche ich nach genauen Antworten auf "Hat die standardmäßige/offizielle Implementierung von x einen handgeschriebenen Parser" für x in [Python, Swift, Ruby, Java, Scala, ML, Haskell]? (Informationen zu anderen Sprachen sind hier ebenfalls willkommen.) Ich bin mir sicher, dass ich diese nach langem Graben selbst finden kann. Ich bin mir aber auch sicher, dass dies von der Community leicht zu beantworten ist. Vielen Dank!

38
eatonphil

AFAIK, GCC verwenden insbesondere handgeschriebene Parser, um die syntaktische Fehlerdiagnose zu verbessern (d. H. Menschliche aussagekräftige Meldungen zu Syntaxfehlern zu geben).

Bei der Parsing-Theorie (und den daraus abgeleiteten Parsing-Generatoren) geht es hauptsächlich darum, eine korrekte Eingabephrase zu erkennen und zu analysieren. Wir erwarten jedoch von Compilern, dass sie eine aussagekräftige Fehlermeldung ausgeben (und dass sie den Rest der Eingabe nach dem syntaktischen Fehler sinnvoll analysieren können), um eine falsche Eingabe zu erhalten.

Außerdem sind alte Legacy-Sprachen wie C11 oder C++ 11 (die konzeptionell alt sind, auch wenn ihre letzte Version erst drei Jahre alt ist) überhaupt nicht kontextfrei. Der Umgang mit dieser Kontextsensitivität in Grammatiken für Parsergeneratoren (d. H. Bison oder sogar Menhir ) ist langweilig schwierig.

34

Parser-Generatoren und Parser-Engines sind recht allgemein. Der Vorteil der Allgemeinheit besteht darin, dass es im Gesamtschema einfach ist, einen genauen Parser schnell zu erstellen und funktionsfähig zu machen.

Die Parser-Engine selbst leidet aufgrund ihrer Allgemeinheit an der Leistungsfront. Jeder handgeschriebene Code ist immer erheblich schneller als die tabellengesteuerten Parser-Engines.

Der zweite Bereich, in dem Parser-Generatoren/Engines Schwierigkeiten haben, besteht darin, dass alle realen Programmiersprachen kontextsensitiv sind, oft auf sehr subtile Weise. LR-Sprachen sind kontextfrei, was bedeutet, dass es viele Feinheiten in Bezug auf Positionierung und Umgebung gibt, die in der Syntax nicht richtig vermittelt werden können. Zugeschriebene Grammatiker versuchen, grundlegende Sprachregeln wie "Vor Verwendung deklarieren" usw. zu behandeln. Die Verknüpfung dieser Kontextsensitivität mit handgeschriebenem Code ist unkompliziert.

7
BobDalgleish