- •Раздел 5. Языки и грамматики Вступление
- •1) Знаковой системы , т. Е. Множества допустимых последовательностей знаков;
- •2) Множества смыслов этой системы;
- •3) Соответствия между последовательностями знаков и смыслами, делающими "осмысленными" допустимые последовательности знаков.
- •5.1. Формальные грамматики и их свойства
- •5.2. Контекстно - свободные грамматики
- •5.3. Контекстно-свободные грамматики. Общий алгоритм разбора.
- •5.3.1. Сформулируйте точно и докажите это утверждение для произвольной контекстно-свободной грамматики.
- •5.3.2. Постройте грамматику, в которой выводимы слова
- •5.3.3. Доказать, что не существует кс-грамматики, в которой были бы выводимы слова вида 00..0011..1122..22, в которых числа нулей, единиц и двоек равны, и только они.
- •5.3.4. Приведите пример другой грамматики, задающей тот же язык.
- •5.3.6. Рассмотрим грамматику с единственным нетерминалом k, нетерминалами 1, 2, 3 и правилами
- •5.3.7. Тот же вопрос для грамматики
- •5.4. Метод рекурсивного спуска.
- •5.4.1. Привести пример, когда эта процедура будет некорректной для k.
- •5.4.3. Доказать, что если Посл (l) не пересекается с Нач(m) и множество всех m‑слов непусто, то ReadK корректна.
- •5.4.4. Считая, что ReadL, ReadM и ReadN корректны (для l, m и n) и что множества Нач(l), Нач(m) и Нач(n) не пересекаются, написать процедуру, корректную для k.
- •5.4.5. Используя сказанное, составьте процедуру распознавания выражений для грамматики (уже рассматривавшейся в примере 3):
- •5.4.6. Пусть в грамматике имеются два правила с нетермииналом k в левой части, имеющих вид
- •If (Next принадлежит Нач (k)) then begin
- •If (Next принадлежит Нач (k)) then begin
- •If b and (Next принадлежит Нач (l)) then begin
- •5.4.7. Доказать корректность приведенной выше нерекурсивной программы непосредственно, без ссылок на рекурсивную.
- •5.5. Алгоритм разбора для ll(1)-грамматик.
- •5.5.1. Для каждого выводимого слова (из терминалов) существует его левый вывод.
- •5.5.2. В грамматике с 4 правилами
- •5.5.3. Является ли грамматика
- •5.5.4. Написать ll(1)-грамматику для того же языка.
- •5.5.6. Доказать, что если слово выводимо в ll(1)-грамматике, то его левый вывод единствен.
- •5.5.8. Используя сказанное, построить алгоритм проверки выводимости слова из терминалов в ll(1)-грамматике, не являющейся леворекурсивной.
5.2. Контекстно - свободные грамматики
КС - языки являются наиболее изученными классом. Это объясняется тем, что с одной стороны, КС-грамматики оказались весьма подходящим аппаратом для описания строения естественных языков и особенно языков программирования. С другой стороны, благодаря относительной простоте и содержательности структуры КС-языков и наличию удобных средств её описания исследование КС-языков представляет значительный практический интерес.
Появление понятия КС-грамматики практически совпало с разработкой мета языка Бэкуса (или нормальной формы Бэкуса), который был впервые использован при описании языка программирования АДГОЛ - 60 и быстро стал общепринятым средством формального описания языков программирования. Описание языка с помощью нормальных форм Бэкуса представляет собой совокупность так называемых "металингвистических формул" - выражений вида Х::=Y1Y2... Yn, где Х - некоторый текст, заключенный в угловые скобки и называемый металингвистической переменной, а Y1, ... , Yn - последовательность металингвистических переменных и основных символов языка (букв, цифр, разделителей, неделимых слов типа "begin" и т. п.). Знак ::= называется металингвистической связкой и читается как "есть" или "это". Знак - это металингвистическая связка "или". Металингвистическая переменная представляет собой имя конструкции языка.
Металингвистическая формула в целом - это описание различных синтаксических вариантов построения конструкций Х, стоящей в левой части, через другие конструкции и символы языка, указанные в правой части. Перечисление вариантов представления производится с использованием связки "или".
Пример 1. Множество идентификаторов Паскаль - это множество цепочек из букв и цифр, начинающихся с буквы. Тогда понятие идентификатора может быть описано с помощью следующих нормальных форм Бэкуса (металингвистических формул), в которых цепочка из букв и цифр сокращенно называется БЦ-цепочкой:
идентификатор ::= буквабукваБЦ-цепочка
БЦ-цепочка::= буквацифрабуквабукваБЦ-цепочкацифра
БЦ-цепочка
буква::= a b c ... z
цифра::=0 1 2 ... 9
Основные символы языка - это 26 букв латинского алфавита и десять цифр.
Пример 2. Язык арифметических выражений (без констант и с фиксированным множеством переменных a, b, c) в метаязыке Бэкуса описывается следующим образом:
арифметическое выражение :: = терм арифметическое выражение+терм арифметическое выражение - терм
терм::= множитель терм* множитель терм / множитель
множитель ::= арифметическое выражение переменная
переменная :: = a b c
Уже из этих примеров ясно, что нормальные формы Бекуса нетрудно преобразовать в выражения КС-грамматики. При этом основные символы соответствуют терминальным символам грамматики, металингвистические переменные - нетерминальным символам, связка ::= соответствует знаку , а без связки можно обойтись, если формулу Х::=Y1Y2... Yn заменить системой формул Х::=Y1, ... , Х::=Yn. Если указанные преобразования провести для последнего примера заменив арифметическое выражение на символ I, терм на Т, множитель - на М, переменную - на L, то получим следующую КС-грамматику:
I T;
I I - T;
I M;
I T * M;
I T / M;
M I;
M L;
L a; L b; L c.
Указанное соответствие является взаимно однозначным и всякая КС - грамматика преобразуется в нормальную форму Бэкуса. Такое простое соответствие между двумя видами описаний одного и того же класса языков является свидетельством близости теоретических и практических целей исследования порождающих грамматик и их использования для формализации алгоритмических языков программирования.