Производственные компиляторы используют генераторы парсеров? - PullRequest
5 голосов
/ 17 июня 2011

Я слышал, что "настоящие авторы компиляторов" запускают свой собственный парсер, а не используют генераторы парсеров.Я также слышал, что генераторы парсеров не подходят для реальных языков.Предположительно, существует много особых случаев, которые трудно реализовать с помощью генератора синтаксических анализаторов.У меня есть мои сомнения по этому поводу:

  1. Теоретически, генератор синтаксического анализатора GLR должен быть в состоянии обрабатывать большинство конструкций языка программирования (кроме, может быть, C ++ ...)
  2. Я знаю, по крайней мере,один производственный язык, который использует генератор парсера: Ruby [1].
  3. Когда я учился в школе на классе компиляторов, мы использовали генератор парсера.

Итак, мой вопрос: так ли этоРазумно написать производственный компилятор с использованием генератора синтаксических анализаторов, или использование генератора синтаксических анализаторов считается плохим проектным решением сообщества компиляторов?

[1] https://github.com/ruby/ruby/blob/trunk/parse.y

Ответы [ 3 ]

4 голосов
/ 17 июня 2011

Для чего бы то ни было, GCC использовал генератор синтаксических анализаторов до 4.0, я полагаю, затем переключился на рукописный анализатор рекурсивного спуска, потому что его было проще поддерживать и расширять.

Генераторы синтаксических анализаторов «сокращают» для «настоящих» языков, но объем работы по преобразованию вашей грамматики во что-то выполнимое растет в геометрической прогрессии.

Редактирование: ссылка на документ GCC с подробным описанием измененийс причинами и выгодами от анализа затрат: http://gcc.gnu.org/wiki/New_C_Parser.

1 голос
/ 19 июня 2011

Я несколько лет работал в компании, где мы более или менее писали компиляторы.Мы были не очень заинтересованы в производительности;просто уменьшая объем работы / обслуживания.Для этого мы использовали комбинацию сгенерированных парсеров + рукописный код.Идеальный баланс - автоматизировать простые повторяющиеся части с помощью генератора синтаксических анализаторов, а затем решать сложные задачи с помощью пользовательских функций.

0 голосов
/ 18 июня 2011

Иногда используется комбинация обоих методов, например, генерация кода с помощью синтаксического анализатора, а затем модификация этого кода «вручную».

Другой способ заключается в том, что некоторые инструменты сканера (лексера) и анализатора позволяютк ним добавляется пользовательский код, дополняющий правила грамматики, называемые «семантическими действиями».Хорошим примером этого случая является то, что синтаксический анализатор обнаруживает общие идентификаторы, а некоторый пользовательский код преобразует некоторые конкретные идентификаторы в ключевые слова.

РЕДАКТИРОВАТЬ: добавить «семантические действия»

...