Почему Бабель использует парсер сверху вниз?
Я изучаю построение компилятора и, естественно, я также изучаю реализацию этих концепций в реальном мире. Одним из примеров этого является анализатор Бабеля: Вавилон.
Я просмотрел код Babylon, и он, похоже, использует синтаксический анализатор Top Down со встроенными специальными семантическими правилами. ЦСИ
Я ожидал, что Babel будет использовать элемент синтаксических анализаторов LR и, вероятно, файл определения, где грамматические произведения связаны с семантическими правилами. Зачем? Ну, в основном потому, что множество других реальных языков используют генераторы синтаксического анализатора, такие как Yacc, Bison и др., Которые дают вам именно такой интерфейс, и, кажется, более ясный и более понятный способ представления этих правил, и даже больше, когда вы Учтите, что Бабель живет на краю стандарта Javascript, постоянно внедряя новые вещи.
Я также создал парсер сверху вниз и снизу вверх (lr) и не вижу большой разницы в сложности реализации между ними (оба одинаково сложны:))
Итак, почему синтаксический анализатор Babel использует специальные синтаксически направленные переводы сверху вниз вместо того, что я считаю более структурированным подходом? Какие дизайнерские решения стоят за этим? Что мне не хватает?
Спасибо!
1 ответ
Я чувствую, что вы действительно задаете два (или, может быть, три) вопроса, поэтому я отвечу на них отдельно
В общем каковы преимущества и недостатки разных подходов к парсингу
Сверху вниз против снизу вверх
Для парсеров, написанных от руки, ситуация на самом деле довольно ясна: парсеры сверху вниз гораздо проще писать и поддерживать до такой степени, что я никогда даже не видел рукописного парсера снизу вверх.
Для генераторов парсеров ситуация менее понятна. Существуют оба типа генераторов синтаксического анализатора (например, yacc и bison - снизу вверх, а ANTLR и JavaCC - сверху вниз). Оба имеют свои преимущества и недостатки, и я не думаю, что есть много причин говорить, что один подход явно лучше другого.
Фактически, я бы сказал, что обычно нет смысла выбирать между анализом сверху вниз и снизу вверх. Когда вы пишете свой парсер, всегда следуйте первому. При использовании генератора синтаксических анализаторов вы должны просто выбрать инструмент, функции которого лучше всего подходят для вашего проекта, а не в зависимости от того, генерирует ли он анализаторы снизу вверх или сверху вниз.
Рукописные парсеры против генераторов парсеров
Есть много причин, по которым можно было бы писать парсеры от руки. Они также зависят от того, какие парсер-генераторы доступны для языка. Недостатком, от которого часто страдают генераторы парсеров, является то, что им трудно генерировать хорошие сообщения об ошибках для синтаксических ошибок.
Другая возможная проблема заключается в том, что для неконтекстно-свободных языков вам могут потребоваться некоторые грязные хаки для их реализации с использованием генератора синтаксических анализаторов, или это может быть просто невозможно вообще.
Как эти факторы относятся конкретно к Вавилону
Рукописные парсеры против генераторов парсеров
Грамматика JavaScript довольно сложна с множеством особых случаев для устранения неоднозначностей. Вероятно, при использовании генератора синтаксического анализа потребуются обширные взломы, и это может быть вообще невозможно, если генераторы синтаксического анализатора доступны для JavaScript.
Я бы также сказал, что генераторы синтаксического анализатора, доступные для JavaScript, могут быть еще не готовы к работе и еще меньше были готовы при создании проекта.
Сверху вниз против снизу вверх
Как я уже сказал, я никогда не видел рукописного анализатора снизу вверх. Таким образом, решение написать нисходящий синтаксический анализатор не составляет никакого труда, если вы решите использовать парсер, написанный от руки.