Szukałem na temat pakietu kompilator gcc Wikipedia tutaj , kiedy to pojawiły się:
GCC zaczęło od użycia parserów LALR wygenerowanych za pomocą Bison, ale stopniowo przestawiło się na ręcznie pisane parsery rekurencyjnego opadania; dla C ++ w 2004 r. oraz dla C i Objective-C w 2006 r. Obecnie wszystkie interfejsy używają ręcznie napisanych analizatorów składni rekurencyjnych
Tak więc przez ostatnie zdanie (i o ile ufam wikipedii) zdecydowanie mogę powiedzieć, że „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) i VHDL (ghdl) "są front-endami, których nie ma dłużej używaj generatora analizatora składni. Oznacza to, że wszyscy używają ręcznie napisanych parserów.
Moje pytanie brzmi zatem, czy ta praktyka jest wszechobecna? W szczególności szukam dokładnych odpowiedzi na „czy standardowa / oficjalna implementacja x ma ręcznie napisany parser” dla x w [Python, Swift, Ruby, Java, Scala, ML, Haskell]? (W rzeczywistości mile widziane są tutaj informacje na temat innych języków.) Jestem pewien, że mogę znaleźć to na własną rękę po wielu kopaniach. Ale jestem również pewien, że społeczność łatwo na to odpowiada. Dzięki!
Odpowiedzi:
AFAIK, GCC używają parsowanych odręcznie parserów, w szczególności w celu poprawy diagnostyki błędów składniowych (tj. Przekazywania sensownych komunikatów o błędach składniowych).
Teoria analizy (i generujące ją generatory analizujące) polega głównie na rozpoznawaniu i analizowaniu poprawnej frazy wejściowej. Ale oczekujemy od kompilatorów, że przekazują znaczący komunikat o błędzie (i że są w stanie sensownie parsować resztę danych wejściowych po błędzie składniowym), dla niektórych niepoprawnych danych wejściowych.
Ponadto, starsze, starsze języki - jak C11 lub C ++ 11 - (które są koncepcyjnie stare, nawet jeśli ich najnowsza wersja ma zaledwie trzy lata) wcale nie są pozbawione kontekstu. Radzenie sobie z tego wrażliwości kontekstowego w gramatyk dla generatorów parsera (tj żubr lub nawet MENHIR ) jest nudno trudne.
źródło
Dealing with that context sensitiveness in grammars for parser generators is boringly difficult
. Jest to również mniej więcej niemożliwe, ponieważ narzędzia te generują parsery kontekstowe. Prawidłowe miejsce do sprawdzenia, czy wszystkie ograniczenia kontekstowe są obecne, to po wygenerowaniu drzewa analizy, jeśli używasz takich narzędzi.Generatory parsera i silniki parsera są dość ogólne. Zaletą ogólności jest to, że szybkie budowanie dokładnego parsera i jego funkcjonalność jest łatwe, w ogólnym schemacie rzeczy.
Sam silnik analizatora składni cierpi z powodu ogólnej wydajności. Każdy odręczny kod zawsze będzie znacznie szybszy niż silniki analizatora składni sterowane tabelą.
Drugim obszarem, w którym generatory / silniki parsera mają trudności, jest to, że wszystkie prawdziwe języki programowania są wrażliwe na kontekst, często w dość subtelny sposób. Języki LR są pozbawione kontekstu, co oznacza, że istnieje wiele subtelności dotyczących pozycjonowania i środowiska, których nie można poprawnie przekazać w składni. Przypisani gramerzy próbują odnieść się do podstawowych zasad językowych, takich jak „deklaruj przed użyciem” itp. Podłączenie tej czułości kontekstowej do odręcznego kodu jest proste.
źródło