
- •Московский автомобильно-дорожный государственный технический университет (мади)
- •I.Формальные языки и грамматики
- •I.1. Цепочки символов
- •I.2. Операции над цепочками символов
- •I.3. Понятие языка
- •I.4. Способы задания языка
- •I.5. Синтаксис и семантика языка
- •I.6. Определение грамматики
- •I.7. Пример грамматики
- •I.8. Принцип рекурсии в правилах грамматики
- •I.9. Способы задания грамматик
- •I.9.1. Использование метасимволов
- •I.9.2. Запись правил грамматики в графическом виде
- •I.10. Распознаватель
- •I.10.1. Схема распознавателя
- •I.10.2. Задача разбора
- •I.11. Классификация грамматик
- •I.12. Классификация языков
- •I.13. Примеры классификаций языков и грамматик
- •I.14. Цепочки вывода
- •I.14.1. Понятие о выводе
- •I.14.2. Сентенциальная форма грамматики
- •I.14.3. Левосторонние и правосторонние выводы
- •I.14.4. Дерево вывода и методы его построения
- •I.15. Однозначности и эквивалентности грамматик
- •I.15.1. Однозначные и неоднозначные грамматики
- •I.15.2. Проверка однозначной и эквивалентной грамматик
- •I.15.3. Правила, задающие неоднозначность в грамматиках
- •II. Принципы построения трансляторов
- •II.1. Определения транслятора
- •II.2. Определение компилятора
- •II.3. Определения интерпретатора
- •II.4. Этапы трансляции
- •II.5. Фазы компиляции
- •II.6. Ти ( таблицы идентификаторов)
- •II.6.1. Назначение и особенности построения
- •II.6.2. Простейшие методы
- •II.6.3. Построение ти по методу бинарного дерева
- •II.6.5. Выбор Хэш-функции при построении ти
- •II.6.7. Построение ти по методу цепочек
- •II.7. Лексические анализаторы
- •II.7.1. Назначение ла
- •II.7.2. Определение границ лексем
- •II.7.3. Выполнение действий, связанных с лексемами
- •II.7.4. Применение конечных автоматов (ка) для построения ла
- •II.7.5. Алгоритм построения ка
- •II.7.6. Пример применения ка для построения ла
- •II.8. Принципы построения синтаксических анализаторов (са)
- •II.8.1. Значение са
- •II.8.2. Автоматы с магазинной памятью
- •II.9. Принципы построения семантического анализатора (с-а)
- •II.9.1. Назначение с-а
- •II.9.2. Проверка соблюдения во входной программе семантических соглашений
- •II.9.3. Дополнение внутреннего представления программы
- •II.9.4. Проверка смысловых норм языка программирования
- •II.10. Принципы генерации кода
- •II.11. Оптимизация кода
I.7. Пример грамматики
Это грамматика G, которая определяет язык целых десятичных цифр со знаком
G=({0,l,2,3,… ,9,-,+},{<число>,<чс>,<цифра>},Р,<число>)
Р:
<<число> → <чс> | +<чс> | —<чс>
<<чс> → <цифра> | <чс>|<цифра>
<<цифра> → 0 | 1 | 2 | …| 9
Составляющие элементы этой грамматики:
1) множество терминальных символов VT содержит двенадцать элементов: это десять
десятичных цифр и два знака;
2) множество нетерминальных символов VN содержит три символа: символы
<число> и <цифра>;
3) множество правил содержит 10 правил, которые записаны в три строки
Целевым символом является число. Символ <чс> бессмыслен.
В названии нетерминальных символов не обязательно быть осмысленным. Они применяются для удобства понимания символов грамматики. Их набор произволен. Набор терминальных символов всегда строго соответствует алфавиту языка, определяемого грамматикой. В языках целых десятичных чисел со знаком, в котором нетерминальные символы обозначаются большими латинскими буквами.
G' =( { 0 , 1 , 2 , 3 , …, 9 , - , +}, {S, T, F }, Р, S)
Р:
S → Т | +Т | —Т
Т → F | TF
F → 0 | l | 2 …| 9
Здесь изменилось лишь множество нетерминальных символов VN={STF}, а язык заданный грамматикой не изменился, поэтому грамматики G и G’ считаются эквивалентными.
I.8. Принцип рекурсии в правилах грамматики
Особенность формальных грамматик – это определение бесконечных множеств цепочек языка с помощью конечного набора числа правил, что достигается за счет рекурсий. Она в правиле грамматики выражается в том, что один из нетерминальных символов определяется сам через себя. Она может быть непосредственно явной, тогда символ определяется сам через себя в одном правиле, либо косвенно неявной, тогда тоже самое происходит через цепочку правил.
В рассмотренной ранее G
<чс> → <чс> <число>
G’
T→TH
Чтобы рекурсия не была бесконечной для участвующего в ней терминального символа грамматики должны существовать так же и другие правила, которые определяют его, минуя его самого, могут содержать множество рекурсий символа, в противном случае этот символ был бы не нужен. Такими правилами являются:
G
<чс> → <чс>
G’
T→F
Для большего понимания смысла рекурсии обращаются к семантики языка. В рассмотренных примерах это язык целых десятичных чисел со знаком.
Понятие числа.
Любая цифра сама по себе есть число, любые 2 цифры тоже число и т.д. Если строить определение числа таким методом, то оно никогда не будет законченным (разряд числа ничем не ограничен). Каждый раз порождая новое число просто дописывают цифру справа уже написанному ряду цифр, а этот ряд цифр уже является числом. Понятие числа можно определить другим способом.
<< … >>
Число – это любая цифра либо другое число, к которому справа дописана любая цифра. Это и составляет основу правил грамматики G и G’ и отраженно в правилах
G
<чс> → <цифра>| <чс> <цифра>
G’
T→F| TF
Другие правила в этих грамматиках позволяют добавить к числу знак и дают определение цифре (3я строка правил)
<<цифра>>
Рекурсия всегда присутствует в грамматиках любых языков программирования, в них содержится множество правил, построенных с помощью рекурсий.