Я исследовал о наборе компиляторов GCC на википедии здесь , когда это придумал:
GCC начал использовать парсеры LALR, сгенерированные с помощью Bison, но постепенно переключился на рукописные парсеры с рекурсивным спуском; для C ++ в 2004 году и для C и Objective-C в 2006 году. В настоящее время все внешние интерфейсы используют рукописные парсеры рекурсивного спуска
Таким образом, по последнему предложению (и насколько я доверяю Википедии) я могу определенно сказать, что "C (gcc), C ++ (g ++), Objective-C, Objective-C ++, Fortran (gfortran), Java (gcj), Ada (GNAT), Go (gccgo), Pascal (gpc), ... Меркурий, Modula-2, Modula-3, PL / I, D (gdc) и VHDL (ghdl) "- все интерфейсы, которые не больше использовать генератор парсеров. То есть все они используют рукописные парсеры.
Тогда мой вопрос: повсеместна ли эта практика? В частности, я ищу точные ответы на «есть ли у стандартной / официальной реализации x рукописный синтаксический анализатор» для x в [Python, Swift, Ruby, Java, Scala, ML, Haskell]? (На самом деле, информация о любых других языках также приветствуется здесь.) Я уверен, что смогу найти это самостоятельно после многих копаний. Но я также уверен, что сообщество легко ответит на это. Благодарность!
Ответы:
AFAIK, GCC используют рукописные синтаксические анализаторы, в частности, для улучшения диагностики синтаксических ошибок (т.е. предоставления значимых сообщений о синтаксических ошибках).
Теория синтаксического анализа (и генераторы синтаксического анализа, происходящие от него) в основном заключается в распознавании и анализе правильной входной фразы. Но мы ожидаем от компиляторов, что они выдают значимое сообщение об ошибке (и что они могут многозначительно проанализировать оставшуюся часть ввода после синтаксической ошибки) для некоторого неверного ввода.
Кроме того, старые унаследованные языки, такие как C11 или C ++ 11 (которые концептуально устарели, даже если их последней редакции всего три года) вовсе не являются контекстно-свободными. Работать с этой чувствительностью к контексту в грамматиках для генераторов синтаксических анализаторов (т. Е. Бизонов или даже менгиров ) чрезвычайно сложно.
источник
Dealing with that context sensitiveness in grammars for parser generators is boringly difficult
, Это также более или менее невозможно, поскольку эти инструменты генерируют парсеры без контекста. Правильное место для проверки наличия всех контекстно-зависимых ограничений - после того, как вы сгенерировали дерево разбора, если используете такие инструменты.Генераторы парсеров и движки парсеров довольно общие. Преимущество универсальности заключается в том, что быстрое создание точного синтаксического анализатора и обеспечение его работоспособности легко в общей схеме вещей.
Сам двигатель парсера страдает на фронте производительности из-за своей универсальности. Любой рукописный код всегда будет значительно быстрее, чем движки табличного парсера.
Вторая область, в которой генераторы / механизмы синтаксического анализа сталкиваются с трудностями, заключается в том, что все настоящие языки программирования чувствительны к контексту, часто довольно тонкими способами. Языки LR не зависят от контекста, а это означает, что есть много тонкостей в позиционировании и среде, которые невозможно правильно передать в синтаксисе. Приписанные грамматики пытаются обратиться к базовым языковым правилам, таким как «объявить перед использованием» и т. Д. Встраивание этой чувствительности к контексту в рукописный код очень просто.
источник