Ich war die Erforschung über die gcc - Compiler - Suite auf wikipedia hier , wenn dies kam:
GCC begann mit der Verwendung von LALR-Parsern, die mit Bison generiert wurden, wechselte jedoch allmählich zu handgeschriebenen rekursiven Parsern. Für C ++ im Jahr 2004 und für C und Objective-C im Jahr 2006. Derzeit verwenden alle Frontends handgeschriebene Parser mit rekursiver Herkunft
Anhand dieses letzten Satzes (und soweit ich Wikipedia vertraue) kann ich definitiv sagen, dass "C (gcc), C ++ (g ++), Objective-C, Objective-C ++, Fortran (gfortran), Java (gcj), Ada (GNAT), Go (gccgo), Pascal (gpc), ... Mercury, Modula-2, Modula-3, PL / I, D (gdc) und VHDL (ghdl) "sind alle Frontends, die nicht Verwenden Sie länger einen Parser-Generator. Das heißt, sie alle verwenden handgeschriebene Parser.
Meine Frage ist dann, ist diese Praxis allgegenwärtig? Insbesondere suche ich nach genauen Antworten auf die Frage "Hat die Standard- / offizielle Implementierung von x einen handgeschriebenen Parser" für x in [Python, Swift, Ruby, Java, Scala, ML, Haskell]? (Informationen in anderen Sprachen sind hier auch willkommen.) Ich bin mir sicher, dass ich diese nach langem Graben selbst finden kann. Aber ich bin mir auch sicher, dass dies von der Community leicht zu beantworten ist. Vielen Dank!
Antworten:
AFAIK, GCC verwenden handgeschriebene Parser insbesondere, um die syntaktische Fehlerdiagnose zu verbessern (dh menschliche aussagekräftige Meldungen zu Syntaxfehlern zu geben).
Bei der Parsing-Theorie (und den von ihr 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 den Rest der Eingabe nach dem syntaktischen Fehler sinnvoll analysieren können), wenn eine falsche Eingabe vorliegt.
Auch alte Legacy-Sprachen wie C11 oder C ++ 11 (die konzeptionell alt sind, auch wenn ihre letzte Revision erst drei Jahre alt ist) sind überhaupt nicht kontextfrei. Der Umgang mit diesem Zusammenhang ist in Grammatiken für Parsergeneratoren (zB Bisons oder sogar Menhirs ) langweilig schwierig.
quelle
Dealing with that context sensitiveness in grammars for parser generators is boringly difficult
. Es ist auch mehr oder weniger unmöglich, da diese Tools kontextfreie Parser generieren. Der richtige Ort, um zu überprüfen, ob alle kontextsensitiven Einschränkungen vorhanden sind, ist, nachdem Sie den Analysebaum generiert haben, wenn Sie solche Tools verwenden.Parser-Generatoren und Parser-Engines sind recht allgemein. Der Vorteil der Allgemeinheit besteht darin, dass das schnelle Erstellen und Funktionieren eines genauen Parsers im Gesamtschema einfach ist.
Die Parser-Engine selbst leidet an der Leistungsfront aufgrund ihrer Allgemeinheit. Jeder handgeschriebene Code ist immer deutlich schneller als die tabellengesteuerten Parser-Engines.
Der zweite Bereich, in dem Parser-Generatoren / Engines Schwierigkeiten haben, ist, dass alle realen Programmiersprachen kontextsensitiv sind, oft auf 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. Mit Attributen versehene Grammatiker versuchen, grundlegende Sprachregeln wie "Vor Verwendung deklarieren" usw. zu behandeln. Die Verknüpfung dieser Kontextsensitivität mit handgeschriebenem Code ist unkompliziert.
quelle