Из Википедии, бесплатной энциклопедии
  (Перенаправлено из генераторов парсеров )
Перейти к навигации Перейти к поиску

В информатике , компилятор компилятор или генератор компилятор является инструментом программирования , который создает парсер , интерпретатор или компилятор из некоторой формы формального описания языка программирования и машины.

Наиболее распространенный тип компилятора-компилятора более точно называется генератором синтаксического анализатора и обрабатывает только синтаксический анализ: его входные данные представляют собой грамматику , обычно записанную в форме Бэкуса – Наура (BNF) или расширенной форме Бэкуса – Наура (EBNF), которая определяет синтаксис языка программирования; а его вывод - это исходный код парсера для языка программирования. Генераторы синтаксического анализатора не обрабатывают семантику языка программирования или генерацию машинного кода для целевой машины. [1]

Metacompiler является инструментом разработки программного обеспечения , используемого в основном в строительстве составителей , переводчиков и переводчиков для других языков программирования. [2] Входными данными для метакомпилятора является компьютерная программа, написанная на специализированном метаязыке программирования, предназначенном в основном для создания компиляторов. [2] [3] [4] Язык созданного компилятора называется объектным языком . Минимальный ввод, производимый компилятором, - это метапрограмма, определяющая грамматику объектного языка исемантические преобразования в объектную программу . [3] [4] [5]

Варианты [ править ]

Типичный генератор парсера связывает исполняемый код с каждым правилом грамматики, которое должно выполняться, когда эти правила применяются парсером. Эти фрагменты кода иногда называют подпрограммами семантических действий, поскольку они определяют семантику синтаксической структуры, которая анализируется анализатором. В зависимости от типа синтаксического анализатора, который должен быть сгенерирован, эти процедуры могут создавать дерево синтаксического анализа (или абстрактное синтаксическое дерево ) или напрямую генерировать исполняемый код.

Одна из самых ранних (1964 г.), удивительно мощных версий компиляторов-компиляторов - это META II , которая приняла аналитическую грамматику с средствами вывода, которые производят машинный код стека , и способна компилировать свой собственный исходный код и другие языки.

Среди самых ранних программ исходных версий Unix, создаваемых в Bell Labs, была двухчастная система lex и yacc , которая обычно использовалась для вывода кода языка программирования C , но имела гибкую систему вывода, которую можно было использовать для всего, начиная с языков программирования. в текстовый файл преобразования. Их современные версии GNU - это flex и bison .

Некоторые экспериментальные компиляторы-компиляторы принимают на вход формальное описание семантики языка программирования, обычно используя денотационную семантику . Этот подход часто называют «компиляцией на основе семантики», и он был впервые применен в системе семантической реализации (SIS) Питера Моссеса в 1978 году. [6] Однако и сгенерированный компилятор, и созданный им код были неэффективны во времени и пространстве. В настоящее время производственные компиляторы не создаются таким образом, но исследования продолжаются.

Проект компилятора-компилятора производственного качества ( PQCC ) в Университете Карнеги-Меллона не формализует семантику, но имеет полуформальную структуру для машинного описания.

Компиляторы-компиляторы существуют во многих разновидностях, в том числе восходящие машинные генераторы перезаписи (см. JBurg ), используемые для мозаики синтаксических деревьев в соответствии с грамматикой перезаписи для генерации кода, и генераторы парсеров грамматики атрибутов (например, ANTLR может использоваться для одновременной проверки типов, константа распространение и многое другое на этапе синтаксического анализа).

Метакомпиляторы [ править ]

Метакомпиляторы сокращают задачу написания компиляторов, автоматизируя аспекты, которые остаются одинаковыми независимо от объектного языка . Это делает возможным создание предметно-ориентированных языков , соответствующих спецификации конкретной проблемы. Метакомпилятор снижает затраты на создание переводчиков для таких предметно-ориентированных объектных языков до такой степени, что становится экономически целесообразным включить в решение проблемы дизайн предметно-ориентированного языка . [4]

Метаязык метакомпилятора - это мощный язык обработки строк и символов, который также полезен для создания широкого спектра других инструментов разработки и анализа программного обеспечения. [4] [7]

Помимо того , что метакомпилятор полезен для разработки предметно-ориентированного языка , он является ярким примером предметно-ориентированного языка, предназначенного для области написания компиляторов.

Метакомпилятор - это метапрограмма, обычно написанная на собственном метаязыке или на существующем языке компьютерного программирования. Сам процесс компиляции метакомпилятора, написанного на его собственном метаязыке, эквивалентен саморазмещающемуся компилятору . Наиболее распространенные компиляторы, написанные сегодня, - это компиляторы с собственным хостом. Самостоятельный хостинг - это мощный инструмент многих метакомпиляторов, позволяющий легко расширять собственный метаязык метапрограммирования. Особенность, которая отделяет метакомпилятор от других компиляторов компилятора, заключается в том, что он принимает в качестве входных данных специализированный язык метапрограммирования, который описывает все аспекты работы компилятора. Метапрограмма, созданная метакомпилятором, является такой же полной программой, как и программа, написанная наC ++ , BASIC или любой другой общий язык программирования . Метапрограммирование метаязык является мощным атрибутом позволяет легче развитие языков компьютерного программирования и других компьютерных средств. Процессоры командной строки, преобразование и анализ текстовых строк легко кодируются с использованием метаязыков метапрограммирования метакомпиляторов.

Полнофункциональный пакет разработки включает компоновщик и библиотеку поддержки времени выполнения . Обычно для написания библиотеки поддержки требуется машинно-ориентированный язык системного программирования , такой как C или C ++. Библиотека, состоящая из функций поддержки, необходимых для процесса компиляции, обычно завершает полный пакет метакомпилятора.

Значение метакомпилятора [ править ]

В информатике приставка « мета» обычно используется для обозначения примерно (отдельная категория) . Например, метаданные - это данные, которые описывают другие данные. Язык, который используется для описания других языков, - это метаязык . Мета также может означать на более высоком уровне абстракции . Метаязыком работает на более высоком уровне абстракции для описания свойств языка. Форма Бэкуса – Наура (БНФ) - это формальный метаязык, первоначально использовавшийся для определения АЛГОЛА 60 . BNF - слабый метаязык , поскольку он описывает только синтаксис и ничего не говорит осемантика или значение. Метапрограммирование - это написание компьютерных программ со способностью обрабатывать программы как свои данные. Метакомпилятор принимает на вход метапрограмму, написанную на специализированных метаязыках (абстракция более высокого уровня), специально разработанных для целей метапрограммирования . [3] [4] [5] Результатом является исполняемая объектная программа.

Можно провести аналогию: поскольку компилятор C ++ принимает в качестве входных данных программу на языке программирования C ++ , мета- компилятор принимает в качестве входных данных программу мета- программирования на метаязыке .

Метакомпилятор Forth [ править ]

Многие сторонники языка Forth называют процесс создания новой реализации Forth мета-компиляцией и что он составляет метакомпилятор. Четвертое определение метакомпилятора:

«Метакомпилятор - это компилятор, который обрабатывает собственный исходный код, в результате чего создается исполняемая версия самого себя».

Это четвертое использование термина «метакомпилятор» оспаривается в основных компьютерных науках. См. Forth (язык программирования) и Историю построения компилятора . Фактический процесс компиляции Forth представляет собой комбинацию Forth, являющегося самодостаточным расширяемым языком программирования, и иногда кросс-компиляцией , давно устоявшейся терминологией в компьютерных науках. Метакомпиляторы - это общая система написания компиляторов. Кроме того, концепция метакомпилятора Forth неотличима от самообслуживания и расширяемого языка. Фактический процесс действует на более низком уровне, определяя минимальное подмножество четвертых слов., который можно использовать для определения дополнительных четвертых слов. Затем можно определить полную реализацию Forth из базового набора. Это похоже на процесс начальной загрузки. Проблема в том, что почти каждый компилятор языков общего назначения также подходит под описание метакомпилятора Forth.

Когда (самостоятельно размещающий компилятор) X обрабатывает свой собственный исходный код, в результате чего создается исполняемая версия самого себя, X является метакомпилятором.

Просто замените X любым распространенным языком, C, C ++, Pascal , COBOL , Fortran , Ada , Modula-2 и т. Д. И X будет метакомпилятором в соответствии с использованием метакомпилятора Forth. Метакомпилятор работает на уровне абстракции выше компилятора, который он компилирует. Он работает только на том же уровне (компилятор с собственным хостингом) при компиляции. Необходимо увидеть проблему с этим определением метакомпилятора. Его можно применить практически к любому языку.

Однако при изучении концепции программирования в Forth добавление новых слов в словарь, расширение языка таким образом - это метапрограммирование. Именно метапрограммирование в Forth делает его метакомпилятором.

Программирование на Forth добавляет в язык новые слова. Подобное изменение языка - это метапрограммирование . Forth - это метакомпилятор, потому что Forth - это язык, специально разработанный для метапрограммирования. [3] Программирование на Forth расширяет Forth добавление слов к словарю Forth создает новый диалект Forth . Forth - это специализированный метакомпилятор для диалектов языка Forth.

История [ править ]

Первый компилятор-компилятор, использующий это имя, был написан Тони Брукером в 1960 году и использовался для создания компиляторов для компьютера Atlas в Университете Манчестера , включая компилятор Atlas Autocode . [ необходима цитата ]

Ранняя история метакомпиляторов тесно связана с историей Рабочей группы 1 SIG / PLAN по компиляторам, управляемым синтаксисом. Группа была основана в первую очередь благодаря усилиям Говарда Меткалфа в районе Лос-Анджелеса. [8] Осенью 1962 года Ховард Меткалф разработал два интерпретатора для написания компиляторов. Один использовал метод анализа снизу вверх, основанный на методе, описанном Ледли и Уилсоном. [9] Другой использовал подход сверху вниз, основанный на работе Гленни, для генерации случайных английских предложений из контекстно-свободной грамматики. [10]

В то же время Вал Шорре описал две «мета-машины». Один генеративный и один аналитический. Генеративная машина была реализована и произвела случайные алгебраические выражения. Meta I, первый метакомпилятор, был реализован Шорре на IBM 1401 в Калифорнийском университете в январе 1963 года. Его оригинальные интерпретаторы и метамашины были написаны непосредственно на псевдомашинном языке. META II , однако, был написан на метаязыке более высокого уровня, способном описывать собственную компиляцию на псевдо-машинном языке. [11] [12] [13]

Ли Шмидт из Bolt, Beranek и Newman в марте 1963 г. написал метакомпилятор, в котором использовался ЭЛТ-дисплей на PDP-1 с разделением времени. [14] Этот компилятор создавал реальный машинный код, а не интерпретирующий код, и был частично загружен из Meta I. [ необходима ссылка ]

Шорре загрузил Meta II из Meta I весной 1963 года. Статья об усовершенствованной системе метакомпилятора, представленная на конференции ACM в Филадельфии 1964 года, является первой статьей по метакомпилятору, доступной в качестве общего справочника. Синтаксис и техника реализации системы Шорре заложили основу для большинства последующих систем. Система была реализована на маленьком 1401 и использовалась для реализации небольшого АЛГОЛ- подобного языка. [ необходима цитата ]

Немедленно последовало множество подобных систем. [ необходима цитата ]

Роджер Рутман из AC Delco разработал и внедрил LOGIK, язык для моделирования логического проектирования, на IBM 7090 в январе 1964 года. [15] Этот компилятор использовал алгоритм, который производил эффективный код для булевых выражений. [ необходима цитата ]

Другая статья в протоколе ACM 1964 года описывает Meta III , разработанный Шнайдером и Джонсоном из Калифорнийского университета в Лос-Анджелесе для IBM 7090. [16] Meta III представляет собой попытку создать эффективный машинный код для большого класса языков. Meta III была полностью реализована на ассемблере. Два компилятора были написаны на Meta III: CODOL, демонстрационный компилятор для написания компиляторов, и PUREGOL, диалект АЛГОЛА 60 (называть его АЛГОЛОМ было чистой злостью).

В конце 1964 года Ли Шмидт запустил метакомпилятор EQGEN с PDP-1 на Beckman 420. EQGEN был языком генерации логических уравнений.

В 1964 году System Development Corporation начала серьезную работу по разработке метакомпиляторов. Это усилие включает мощные метакомпиляторы, Bookl и Book2, написанные на Lisp, которые обладают обширными возможностями поиска по дереву и резервного копирования. Результатом одной из систем Q-32 в SDC является Meta 5. [17] Система Meta 5 включает резервное копирование входного потока и достаточно других средств для анализа любого контекстно-зависимого языка. Эта система была успешно выпущена для широкого круга пользователей и имела множество приложений для обработки строк, помимо компиляции. Он имеет множество сложных «выталкивающих» стеков, средств настройки атрибутов и тестирования, а также механизмов вывода. Эта Meta 5 успешно переводит JOVIAL программы на PL / I программы демонстрируют свою мощь и гибкость.

Роберт МакКлюр из Texas Instruments изобрел компилятор-компилятор под названием TMG (представлен в 1965 году). TMG использовался для создания ранних компиляторов для таких языков программирования, как B , PL / I и ALTRAN . Вместе с метакомпилятором Вэла Шорра он стал первым источником вдохновения для последней главы книги Дональда Кнута « Искусство компьютерного программирования» . [18]

Система LOT была разработана в 1966 году в Стэнфордском исследовательском институте и была очень похожа на Meta II. [19] В нем были новые специальные конструкции, позволяющие генерировать компилятор, который, в свою очередь, мог компилировать подмножество PL / I. Эта система имела широкие возможности для сбора статистики и использовалась для изучения характеристик нисходящего анализа.

SIMPLE - это специализированная система транслятора, предназначенная для помощи в написании препроцессоров для PL / I. SIMPLE, написанная на PL / I, состоит из трех компонентов: исполнительного модуля, синтаксического анализатора и семантического конструктора. [20]

ДЕРЕВО-META компилятор был разработан в Стэнфордском исследовательском институте в Менло - Парк, штат Калифорния. Апрель 1968 г. Ранняя история метакомпилятора хорошо задокументирована в руководстве TREE META. TREE META шла параллельно с некоторыми разработками SDC. В отличие от более ранних метакомпиляторов, он отделял обработку семантики от обработки синтаксиса. Правила синтаксиса содержали деревопостроение операций, объединяющих распознанные языковые элементы с узлами дерева. Затем представление входных данных в виде древовидной структуры было обработано простой формой неанализируемых правил. В правилах неразборчивого анализа использовалось распознавание узлов и тестирование атрибутов, которые при сопоставлении приводили к выполнению связанного действия. Вдобавок подобный элемент дерева также может быть протестирован в неанализируемом правиле. Непроанализированные правила также были рекурсивным языком, способным вызывать непроанализированные правила, передавая элементы дерева до того, как было выполнено действие неанализируемого правила.

Концепция метармашины, первоначально выдвинутая Гленни, настолько проста, что были разработаны три версии аппаратного обеспечения и одна фактически реализована. Последний в Вашингтонском университете в Сент-Луисе. Эта машина была построена из макромодульных компонентов и имеет коды, описанные Шорре.

CWIC (компилятор для написания и реализации компиляторов) - последний известный метакомпилятор Schorre. Он был разработан в Systems Development Corporation Эрвином Буком, Дьюи Валом Шорром и Стивеном Дж. Шерманом. Используя всю мощь (lisp 2) языка обработки списков, алгоритмы оптимизации могли работать с синтаксически сгенерированными списками и деревьями до генерации кода. CWIC также имеет встроенную в язык таблицу символов.

С возрождением предметно-ориентированных языков и потребностью в генераторах синтаксических анализаторов, которые просты в использовании, понятны и просты в обслуживании, метакомпиляторы становятся ценным инструментом для сложных проектов разработки программного обеспечения.

Другими примерами генераторов парсеров в духе yacc являются ANTLR , Coco / R , CUP, [ необходима цитата ] GNU Bison , Eli, [21] FSL, [ необходима ссылка ] SableCC , SID (устройство для улучшения синтаксиса), [22] и JavaCC . Хотя генераторы чистого синтаксического анализатора полезны, они решают только часть синтаксического анализа проблемы построения компилятора. Инструменты с более широким охватом, такие как PQCC , Coco / R и DMS Software Reengineering Toolkit обеспечивают значительную поддержку для более сложных действий после анализа, таких как семантический анализ, оптимизация и генерация кода.

Метаязыки Schorre [ править ]

Самые ранние метакомпиляторы Schorre, META I и META II, были разработаны Д. Вэл Шорре из Калифорнийского университета в Лос-Анджелесе. Затем последовали и другие метакомпиляторы на основе Шорре. Каждый из них добавляет улучшения в анализ языка и / или генерацию кода.

В программировании обычно используется имя языка программирования для обозначения как компилятора, так и языка программирования, причем контекст определяет значение. Программа на C ++ компилируется с помощью компилятора C ++. Это также относится к следующему. Например, META II - это и компилятор, и язык.

Метаязыки в линейке метакомпиляторов Schorre - это функциональные языки программирования, которые используют нисходящую грамматику для анализа синтаксических уравнений со встроенными конструкциями преобразования вывода.

Синтаксическое уравнение:

<имя> = <тело>;

это скомпилированная тестовая функция, возвращающая успех или неудачу . <имя> - это имя функции. <body> - это форма логического выражения, состоящая из тестов, которые могут быть сгруппированы, иметь альтернативы и выходные продукты. В других языках тест похож на bool: успех - это правда, а неудача - ложь .

Определение языка программирования сверху вниз аналитически естественно. Например, программа может быть определена как:

 программа = $ декларация;

Определение программы как последовательности из нуля или более деклараций.

В языках Schorre META X есть главное правило. Приведенное выше правило программы является примером правила вождения. Правило программы - это тестовая функция, которая вызывает объявление, тестовое правило, которое возвращает успех или неудачу . Оператор $ loop многократно вызывает объявление, пока не будет возвращена ошибка . Оператор $ всегда успешен, даже если нет объявления. Вышеупомянутая программа всегда возвращала успех. (В CWIC длительный сбой может обходить объявление. Длительный сбой является частью системы обратного отслеживания CWIC)

Наборы символов этих ранних компиляторов были ограничены. Символ / использовался для оператора альтернативы (или). «A или B» записывается как A / B. Круглые скобки () используются для группировки.

А (В / С)

Описывает конструкцию A, за которой следует B или C. В качестве логического выражения это будет

А иили С)

Последовательность XY имеет подразумеваемые значения X и Y. () Группируются и / или оператора. Порядок оценки всегда слева направо, так как последовательность входных символов определяется порядком проведения тестов.

Специальные операторные слова, первый символ которых - "." используются для ясности. .EMPTY используется в качестве последнего альтернативного варианта, когда нет необходимости в предыдущем альтернативном варианте.

X (A / B / .EMPTY)

Указывает, что за X необязательно следует A или B. Это особая характеристика этих метаязыков, являющихся языками программирования. Вышесказанное позволяет избежать обратного отслеживания. Другие системы конструкторов компиляторов могли объявить три возможные последовательности и предоставить синтаксическому анализатору возможность выяснить это.

Характеристики метапрограммированных метаязыков, описанных выше, являются общими для всех метакомпиляторов Schorre и производных от них.

META I [ править ]

META I был вручную скомпилированным метакомпилятором, который использовался для компиляции META II. Мало что известно о META I, за исключением того, что первоначальная компиляция META II произвела почти идентичный код с кодом компилятора META I, написанного вручную.

META II [ править ]

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

Продукция вывода произвела форму ассемблерного кода непосредственно из правила синтаксиса.

ДЕРЕВО-МЕТА [ править ]

TREE-META представила операторы построения дерева : < node_name > и [ < number > ], перемещающие выходные производственные преобразования в правила неразборчивого анализа. Операторы построения дерева использовались в правилах грамматики, напрямую преобразуя входные данные в абстрактное синтаксическое дерево . Неанализируемые правила - это также тестовые функции, которые соответствуют шаблонам дерева. Неанализируемые правила вызываются из правила грамматики, когда абстрактное синтаксическое дерево должно быть преобразовано в выходной код. Построение абстрактного синтаксического дерева и неразборчивых правил позволяло выполнять локальную оптимизацию путем анализа дерева синтаксического анализа.

Перенос результатов вывода на неразборчивые правила позволил четко разделить анализ грамматики и создание кода. Это сделало программирование более простым для чтения и понимания.

CWIC [ править ]

В 1968-1970 годах Эрвин Бук, Дьюи Вэл Шорр и Стивен Дж. Шерман разработали CWIC. [4] (Компилятор для написания и реализации компиляторов) в Центре истории информационных технологий Института Чарльза Бэббиджа корпорации System Development Corporation (вставка 12, папка 21) ,

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

Язык синтаксиса следует за предыдущей линией метакомпиляторов Дьюи Вэл Шорре. Он больше всего напоминает TREE-META с операторами построения дерева на языке синтаксиса. Неразборчивые правила TREE-META расширены для работы с объектно-ориентированным языком генерации, основанным на LISP 2 .

CWIC включает три языка:

  • Синтаксис : преобразует исходные данные программы в структуры списков с использованием формулы преобразования грамматики. Анализируемая структура выражения передается генератору путем помещения вызова генератора в правило. Дерево представлен список, первый элемент представляет собой объект узла. В языке есть операторы < и > специально для составления списков. Двоеточие : оператор используется для создания узловых объектов. : ADD создает узел ADD. Восклицательный знак ! Оператор объединяет несколько проанализированных записей с узлом, чтобы создать дерево. Деревья, созданные с помощью правил синтаксиса, передаются функциям генератора, возвращая успех или неудачу. Язык синтаксиса очень близок к TREE-META. Оба используют двоеточие для создания узла. CWIC в дерево здание восклицательный! <Номер> функционирует так же , как ДЕРЕВО-META - х [<число>].
  • Генератор : именованная серия правил преобразования, каждое из которых состоит из неанализируемого правила сопоставления с образцом. и выходная продукция, написанная на языке, подобном LISP 2. перевод был в двоичный машинный код IBM 360. Другие возможности обобщенного вывода языка генератора. [4]
  • MOL-360 : независимый язык реализации среднего уровня для семейства компьютеров IBM System / 360, разработанный в 1968 году и используемый для написания базовой библиотеки поддержки.

Язык генераторов [ править ]

Язык генераторов имел семантику, аналогичную Лиспу . Дерево синтаксического анализа считалось рекурсивным списком. Общая форма функции языка генератора:

 имя-функции (first-unparse_rule) => first-production_code_generator (second-unparse_rule) => второй-production_code_generator (third-unparse_rule) => третий-production_code_generator ...

Код для обработки данного дерева включал в себя функции языка программирования общего назначения, а также форму: <stuff>, которая выводила (заполняла) выходной файл. Вызов генератора можно использовать в unparse_rule. Генератору передается элемент шаблона unparse_rule, в который он помещен, и его возвращаемые значения перечислены в (). Например:

 expr_gen (ADD [expr_gen (x), expr_gen (y)]) => <AR + (x * 16) + y;> releasereg (y); вернуть x; (SUB [expr_gen (x), expr_gen (y)]) => <SR + (x * 16) + y;> releasereg (y); вернуть x; (MUL [expr_gen (x), expr_gen (y)]) => . . . (х) => r1 = getreg (); нагрузка (r1, x); return r1;...

То есть, если дерево разборавыглядит как (ADD [<something1>, <something2>]), expr_gen (x) будет вызываться с <something1> и вернет x. Переменная в правиле неразборки - это локальная переменная, которую можно использовать в production_code_generator. expr_gen (y) вызывается с <something2> и возвращает y. Здесь вызов генератора в неанализируемом правиле передается элементу в той позиции, которую он занимает. Надеюсь, что в приведенном выше примере x и y будут регистрами по возвращении. Последние преобразования предназначены для загрузки атома в регистр и возврата регистра. Первая продукция будет использоваться для генерации инструкции 360 «AR» (Добавить регистр) с соответствующими значениями в общих регистрах. Приведенный выше пример - это только часть генератора. Каждое выражение генератора оценивается как значение, которое затем обрабатывается.Последнее преобразование с таким же успехом можно было записать так:

 (x) => return load (getreg (), x);

В этом случае load возвращает свой первый параметр, регистр, возвращаемый функцией getreg (). функции load и getreg - другие генераторы CWIC.

CWIC имя языков домена конкретных раньше срока языка предметно-ориентированный существует [ править ]

От авторов CWIC:

"Метакомпилятор помогает задаче создания компилятора, автоматизируя его некреативные аспекты, те аспекты, которые одинаковы независимо от языка, на который производимый компилятор должен переводить. Это делает возможным создание языков, соответствующих спецификации конкретная проблема. Это снижает стоимость производства процессоров для таких языков до такой степени, что становится экономически целесообразным начать решение проблемы с языкового дизайна ". [4]

Примеры [ править ]

  • ANTLR
  • GNU Bison
  • Коко / Р , Коко-2
  • DMS Software Reengineering Toolkit , система преобразования программ с генераторами парсеров
  • Студия грамматики Эпсилон
  • Генератор парсеров лимона
  • LRStar: генератор парсера LR (*)
  • МЕТА II
  • parboiled , библиотека Java для создания парсеров.
  • Парсер Packrat
  • PackCC , парсер packrat с поддержкой левой рекурсии .
  • PQCC , компилятор-компилятор, который больше, чем генератор парсера.
  • Устройство улучшения синтаксиса (SID)
  • SYNTAX , интегрированный набор инструментов для создания компилятора.
  • ДЕРЕВО-МЕТА
  • Yacc
  • Xtext
  • XPL
  • JavaCC

См. Также [ править ]

  • Разбор грамматики выражений
  • LL парсер
  • Парсер LR
  • Простой парсер LR
  • Парсер LALR
  • Парсер GLR
  • Анализ домена
  • Доменный язык
  • История создания компилятора
    • История построения компилятора # Самостоятельные компиляторы
  • Метакомпиляция
  • Трансформация программы

Ссылки и примечания [ править ]

  1. ^ "Синтаксически управляемый компилятор для АЛГОЛА 60" Эдгар Т. Айронс, Сообщения ACM, том 4, выпуск 1, январь 1961 г.
  2. ^ a b Metacompiler: ( информатика ) компилятор, который используется в основном для создания компиляторов для других языков программирования. "Научно-технический словарь Словарь научных и технических терминов МакГроу-Хилла, 6-е издание" . Компании McGraw-Hill.
  3. ^ a b c d Википедия, бесплатная энциклопедия - Метапрограммирование
  4. ^ a b c d e f g h Книга, Эрвин; Дьюи Вэл Шорре; Стивен Дж. Шерман (июнь 1970 г.). «Система CWIC / 36O, компилятор для написания и реализации компиляторов». Уведомления ACM SIGPLAN . 5 (6): 11–29. DOI : 10.1145 / 954344.954345 . S2CID 44675240 . 
  5. ^ a b С. Стивен Карр, Дэвид А. Лютер, Шериан Эрдманн, Система компилятора-компилятора TREE-META: система мета-компилятора для Univac 1108 и General Electric 645 , Технический отчет Университета Юты RADC-TR-69-83 .
  6. ^ Питер Моссес, "SIS: система компилятора-генератора, использующая денотационную семантику", отчет 78-4-3, кафедра компьютерных наук, Орхусский университет, Дания, июнь 1978 г.
  7. ^ Соседи, JM Software Construction using Components . Технический отчет 160, Департамент информации и компьютерных наук, Калифорнийский университет, Ирвин, 1980.
  8. ^ Ховард Меткалф, "Параметризованный компилятор на основе механической лингвистики" Planning Research Corporation R-311, 1 марта 1963 г., также в Annual Review in Automatic Programming, Vol. 4
  9. ^ Роберт Ледли и Дж. Б. Уилсон, «Автоматическое программирование, языковой перевод посредством синтаксического анализа», Коммуникации Ассоциации вычислительной техники, Vol. 5, № 3, с. 145–155, март 1962 г.
  10. AE Glennie, «О синтаксической машине и построении универсального компьютера», Технический отчет № 2, AD 240–512, Вычислительный центр Технологического института Карнеги, 1960.
  11. ^ Шорре, Д.В., META II, синтаксически-ориентированный язык написания компиляторов , Труды 1964 Национальной конференции ACM 1964, стр. 41.301-41.3011, 1964
  12. ^ Дьюи, Вэл Шорре (1963). "Синтаксис - Направленный СМАЛГОЛ для 1401". Национальная конференция ACM, Денвер, Колорадо .
  13. ^ Мета I описана в статье, представленной на конференции ACM в Колорадо в 1963 году. См. СМАЛГОЛ.
  14. ^ LO Шмидт, "Статус Bitt ACM SegPlan" Специальная группа по интересам по языкам программирования ", Письмо Рабочей группы 1, 1964.
  15. ^ Роджер Рутман, «LOGIK. Компилятор, управляемый синтаксисом для компьютерного битового моделирования», магистерская диссертация, Калифорнийский университет в Лос-Анджелесе, август 1964 г.
  16. ^ FW Schneider и (GD Johnson, "Синтаксически-управляемое написание компилятора, компилятор для генерации эффективного кода", Труды 19-й Национальной конференции Ассоциации вычислительной техники, 1964 г.
  17. ^ Д. Оппенгейм и Д. Хаггерти, «META 5: инструмент для управления строками данных», Труды 21-й Национальной конференции Ассоциации вычислительной техники, 1966.
  18. ^ Кнут, Дональд (1990). П. Дерансарт; М. Журдан (ред.). «Генезис атрибутных грамматик» (PDF) . Труды Международной конференции по атрибутивным грамматикам и их приложениям (Париж, Франция) . Конспект лекций по информатике. Нью-Йорк: Springer-Verlag. 461 : 1–12. CiteSeerX 10.1.1.105.5365 . DOI : 10.1007 / 3-540-53101-7_1 . ISBN   978-3-540-53101-2.
  19. ^ Чарльз Р. Киркли и Джонс Ф. Рулифсон, "Система LOT синтаксически управляемой компиляции", Внутренний отчет Стэнфордского исследовательского института ISR 187531-139, 1966.
  20. ^ Джордж JE (1967a). Синтаксический анализатор, распознаватель, синтаксический анализатор и система семантической интерпретации, Стэнфордский центр линейных ускорителей, 15 ноября 1967 г.
  21. ^ Роберт В. Грей и др. , «Эли: полная гибкая система построения компилятора». Сообщения ACM 35 : 2: 121-130, 1992; см. также http://eli.colorado.edu/. Архивировано 28 марта 2019 г. на Wayback Machine.
  22. ^ JM Foster, " Программа улучшения синтаксиса ". Компьютерный журнал 11 : 1: 31-34, 1968

Дальнейшее чтение [ править ]

  • Брукер, Р.А. ; MacCallum, IR; Morris, D .; Рол, JS (1963), "Компилятор-компилятор", Годовой обзор в автоматическом программировании , 3 : 229-275, DOI : 10.1016 / S0066-4138 (63) 80009-9
  • Брукер, Р.А., Моррис, Д. и Рол, Дж.С., Опыт работы с компилятором компилятора , Компьютерный журнал, Vol. 9, стр. 350. (февраль 1967 г.).
  • Джонсон, Стивен С. , Якк - еще один компилятор-компилятор , Computer Science Technical Report 32, Bell Laboratories, Мюррей-Хилл, Нью-Джерси, июль 1975 г.
  • МакКиман, Уильям М .; Хорнинг, Джеймс Дж .; Уортман, Дэвид Б. (1970). Генератор компилятора . Энглвуд Клиффс, Нью-Джерси: Прентис-Холл. ISBN 978-0-13-155077-3. Проверено 13 декабря 2012 .

Внешние ссылки [ править ]

  • Computer50.org , Автокоды Брукера
  • Catalog.compilertools.net , Каталог инструментов для построения компиляторов
  • Labraj.uni-mb.si , Лиза
  • Ресурсы Skenz.it , Jflex и Cup (на итальянском языке)