
- •Теоретические основы формальных языков и их трансляции (магистратура)
- •1. Грамматики и языки.
- •1.1. Обсуждение грамматик.
- •1.2. Символы и цепочки.
- •1.3. Формальное определение грамматики и языка.
- •1.4. Синтаксические деревья и неоднозначность.
- •1.5. Задача разбора.
- •1.6. Некоторые отношения применительно к грамматикам.
- •1.7. Практические ограничения, налагаемые на грамматики.
- •1.9. Некоторые проблемы теории формальных языков.
- •2. Регулярные выражения и конечные автоматы.
- •2.1. Диаграммы состояний.
- •2.2. Детерминированный конечный автомат.
- •2.4. Построение ка из нка.
- •3. Нисходящие распознаватели.
- •3.1. Нисходящий разбор с возвратами.
- •3.2. Проблемы нисходящего разбора и их решение.
- •5.3. Лексический анализ.
- •5.4. Синтаксический анализ.
- •5.5. Генерация кода.
- •5.6. Оптимизация кода.
- •5.7. Анализ и исправление ошибок.
- •5.8. Принципиальная модель компилятора.
- •1.1. Обсуждение грамматик
Теоретические основы формальных языков и их трансляции (магистратура)
ВВЕДЕНИЕ.
Языки программирования или, как их часто называют, алгоритмические языки, являясь средством общения человека с электронными вычислительными машинами, начали развиваться одновременно с появлением последних, т.е. примерно пять десятилетий назад. С момента своего появления языки программирования, а также методы их описания, изучения и использования интенсивно развивалось, и в настоящее время составляют обширную и важную область прикладной математики.
Являясь новой областью математики, теория формальных языков, к которым относятся и языки программирования, еще не вполне оформилась как математическая дисциплина. В противоположность многим разделам классической математики методы изучения формальных языков разработаны недостаточно, а используемые в этих методах классы объектов не всегда удовлетворительно отражают свойства языков. В настоящем пособии освещаются наиболее существенные синтаксические особенности алгоритмических языков и используемые в настоящее время методы их описания и изучения.
1. Грамматики и языки.
1.1. Обсуждение грамматик.
Рассмотрим предложение " The big elephant ate the peanut". Если мы знаем английский, то поймем, что это предложение английского языка. Его можно изобразить в виде схемы, которая представлена на рисунке 1.1.
Рис.1.1. Синтаксическое дерево.
Схема предложения, такая, например, как на рис.1.1 , называется синтаксическим деревом. Оно описывает синтаксис, или структуру, предложения, разлогая его на составные части. Таким образом, мы видим, что <предложение> состоит из <подлежащее>, за которым следует <сказуемое>; <подлежащее> состоит из <артикль>, за которым следует < прилагательное >, за которым в свою очередь следует <существительное> и т.д.
Для того чтобы описать структуру, мы использовали новые символы - "синтаксические единицы" или "синтаксические классы", такие, как <предложение>. Эти символы заключаются в угловые скобки "<" и ">", чтобы отличить их от слов самого языка.
Мы узнаем, что " The big elephant ate the peanut" является предложением, либо, основываясь на интуиции, либо применяя соответствующие правила грамматики, выученные в школе; конечно, каждый из нас мог бы составить неформальное синтаксическое дерево для любого простого английского предложения. Однако для того, чтобы иметь возможность механически разбирать предложения, мы должны дать точные формальные правила, которые описывают структуру предложений. Для этой цели мы создадим метаязык, т.е. некий язык, на котором можно описывать другие языки. В английских школах в курсе французского языка английский язык используется при описании французского языка. Следовательно, английский играет роль метаязыка. В учебниках английского языка английский язык используется для описания самого себя.
В настоящий момент нас в основном интересует описание синтаксиса (структуры) языков программирования, а не их семантики (смысла); схемы, такие, как на рис. 1.1., не передают смысла предложения. Такое синтаксическое описание мы называем грамматикой языка.
Метаязык, который мы будем использовать, впервые был предложен Хомским для описания естественных языков. Конкретная система записи, которой мы воспользуемся, принадлежит Бэкусу. По мнению Хомского, этот метаязык полезен лишь для описания небольших подмножеств, состоящих из простых предложений, и не совсем удовлетворителен даже для описания структуры простых формальных языков, таких как Фортран и Паскаль. Однако, мы воспользуемся им, поскольку в нем наилучшим образом сочетается мощность и целесообразность практического использования.
Еще раз рассмотрим предложение "The big elephant ate the peanut". Как мы отмечали, рис.1.1 показывает, что < предложение > состоит из < подлежащее >, за которым следует <сказуемое>. Если сократить фразу "может состоять из", заменив ее символом ::=, то наша грамматика могла бы содержать, например, такие правила:
Заметим, что грамматика может содержать более одного правила, в котором описывается образование конкретной синтаксической единицы. Например, на рис. 1.1 есть два правила, которые показывают, из чего может состоять <существительное>.
Если имеется множество правил, то ими можно воспользоваться для того, чтобы вывести, или породить, предложение по следующей схеме. (По этой причине такие правила часто называют правилами вывода, или продукциями.) Начнем с синтаксической единицы <предложение>, найдем правило, в котором <предложение> слева от ::=, и подставим вместо <предложение> цепочку, которая расположена справа от ::=, т.е. <предложение> => < подлежащее > <сказуемое>
Таким образом, мы заменяем синтаксическую единицу на одну из цепочек, из которых она может состоять. Повторим процесс. Возьмем одну из синтаксических единиц в цепочке < подлежащее > <сказуемое>, например < подлежащее >; найдем правило, где < подлежащее > находится слева от ::=, и заменим < подлежащее > в исходной цепочке на соответствующую цепочку, которая находится справа от ::=. Это дает
<подлежащее> <сказуемое> => <артикль> <прилагательное >
<существительное> <сказуемое>
Символ "=>" означает, что один символ слева от => в соответствии с правилом грамматики заменяется цепочкой, находящейся справа от =>. Полный вывод предложения будет таким:
Этот вывод предложения запишем сокращенно, используя новый символ "=>+" :
<предложение> =>+ the big elephant ate the peanut
На каждом шаге можно заменить любую синтаксическую единицу. В приведенном выше выводе мы всегда заменяли самую левую из них. Обратите также внимание на то, что такое правило, как <предложение> ::= <подлежащее><сказуемое>, можно использовать для описания многих различных предложений; для этого необходимо только иметь различные способы образования синтаксических единиц <подлежащее> и <сказуемое>.
Из семи правил
мы можем образовать целых девять предложений!
Одно из назначений грамматики как раз и состоит в том, чтобы описать все предложения языка с помощью приемлемого числа правил. Это важно, если учесть тот факт, что обычно количество предложений в языке бесконечно.
После такого введения мы почти готовы описать формальные понятия грамматик и языков, но далее нам все-таки придется прежде определить некоторые термины, которыми мы пока пользовались неформально.