- •Лекция № 3 теория языков и формальных грамматик
- •3.1 Способы определения языков
- •3.2 Формальные грамматики
- •3.3 Грамматики с ограничениями на правила
- •Лекция № 4 способы записи синтаксиса языка. Распознаватели
- •4.1 Метаязык Хомского
- •4.2 Метаязык Хомского-Щутценберже
- •4.3 Бэкуса-Наура формы (бнф)
- •4.4 Расширенные Бэкуса-Наура формы (рбнф)
- •4.5 Диаграммы Вирта
- •Диаграмм Вирта
- •4.6 Распознаватели
- •Лекция № 5 демонстрационный язык программирования dpl
- •5.1 Синтаксис и семантика dpl
- •5.1.1 Элементарные конструкции
- •5.1.2 Составные конструкции. Организация программы
- •5.1.3 Краткое описание семантики языка
- •5.3 Описание пользовательского синтаксиса с использованием диаграмм Вирта
- •6.2 Транслитератор
- •6.3 Грамматики и распознаватели для лексического анализа
- •6.3.1 Связь между диаграммой Вирта и конечным автоматом
- •В эквивалентный конечный автомат
- •Задающая идентификатор
- •6.3.2 Связь между диаграммами Вирта и праволинейными грамматиками. Преобразование правой рекурсии в итерацию
- •Грамматик в диаграммы Вирта
- •В итеративную диаграмму Вирта
- •Идентификатора в итеративную диаграмму Вирта
- •Идентификатора в итеративную диаграмму Вирта (окончание)
- •6.3.3 Связь между диаграммами Вирта и грамматиками с левой рекурсией. Преобразование левой рекурсии в итерацию
- •В итеративную диаграмму Вирта
- •6.4 Методы лексического анализа
- •6.4.1 Организация непрямого лексического анализатора
- •Лексического анализатора
- •6.4.2 Организация прямого лексического анализатора
- •Прямого лексического анализатора
- •Лекция № 7 лексический анализатор демонстрационного языка программирования
- •7.1 Транслитератор dpl
- •7.1.1 Общая организация транслитератора
- •7.1.2 Программная реализация транслитератора
- •7.2 Непрямой лексический анализатор dpl
- •7.2.1 Диаграммы Вирта для отдельных автоматов непрямого лексического анализатора
- •7.2.1 Программная реализация отдельных автоматов
- •7.2.3 Общая структура непрямого лексического анализатора
- •7.3 Прямой лексический анализатор dpl
- •Прямого лексического анализатора
- •Прямого лексического анализатора (продолжение)
- •Прямого лексического анализатора (окончание)
- •Лекция № 8 общие принципы организации синтаксического разбора
- •8.1 Назначение синтаксического разбора
- •8.2 Классификация методов синтаксического разбора
- •Синтаксического разбора
- •8.3 Методы разбора
- •С операции умножения
- •Распознавателя самых нижних ветвей дерева выступает лексический анализатор
- •8.4 Последовательность разбора
- •8.5 Использование просмотра вперед
- •8.6 Использование возвратов
- •8.7 Выводы
- •Лекция № 9 использование автоматов с магазинной памятью для нисходящего разбора слева направо
- •9.1 Организация автомата с магазинной памятью
- •9.1.1 Операции автомата
- •9.1.2 Распознаватель скобочных выражений
- •9.2 Общая связь между грамматиками и автоматами с магазинной памятью
- •9.3 Связь между s-грамматикой и автоматом с магазинной памятью
- •9.3.1 Обобщенный алгоритм построения нисходящего амп
- •9.4 Построение автомата с магазинной памятью по q-грамматике
- •9.4.1 Построение нисходящего автомата
- •Заменить (αr), Сдвиг
- •Вытолкнуть, Сдвиг.
- •Вытолкнуть.
- •9.4.2 Примеры построения амп по q-грамматике
- •Список использованных источников
- •Содержание
4.1 Метаязык Хомского
Метаязык Хомского вышел из недр математической логики. Он имеет следующую систему обозначений:
– символ «» отделяет левую часть правила от правой (читается как «порождает» и «это есть»);
– нетерминалы обозначаются буквой А с индексом, указывающим на его номер;
– терминалы – это символы используемые в описываемом языке;
– каждое правило определяет порождение одной новой цепочки, причем один и тот же нетерминал может встречаться в нескольких правилах слева.
Описание идентификатора на метаязыке Хомского будет выглядеть следующим образом:
1. A1 A 23. A1 W 45. A1 s
2. A1 B 24. A1 X 46. A1 t
3. A1 C 25. A1 Y 47. A1 u
4. A1 D 26. A1 Z 48. A1 v
5. A1 E 27. A1 a 49. A1 w
6. A1 F 28. A1 b 50. A1 x
7. A1 G 29. A1 c 51. A1 y
8. A1 H 30. A1 d 52. A1 z
9. A1 I 31. A1 e 53. A2 0
10. A1 J 32. A1 f 54. A2 1
11. A1 K 33. A1 g 55. A2 2
12. A1 L 34. A1 h 56. A2 3
13. A1 M 35. A1 i 57. A2 4
14. A1 N 36. A1 j 58. A2 5
15. A1 O 37. A1 k 59. A2 6
16. A1 P 38. A1 l 60. A2 7
17. A1 Q 39. A1 m 61. A2 8
18. A1 R 40. A1 n 62. A2 9
19. A1 S 41. A1 o 63. A3 A1
20. A1 T 42. A1 p 64. A3 A3A1
21. A1 U 43. A1 q 65. A3 A3A2
22. A1 V 44. A1 r
4.2 Метаязык Хомского-Щутценберже
Приведенный в предыдущем разделе пример описания идентификатора показывает громоздкость метаязыка Хомского, что позволяет эффективно использовать его только для описания небольших абстрактных языков. Более компактное описание возможно с применением метаязыка Хомского-Щутценберже, использующего следующие обозначения метасимволов:
– символ «=» отделяет левую часть правила от правой (вместо символа “”);
– нетерминалы обозначаются буквой А с индексом, указывающим на его номер;
– терминалы – это символы используемые в описываемом языке;
– каждое правило определяет порождение нескольких альтернативных цепочек, отделяемых друг от друга символом «+», что позволяет, при желании, использовать в левой части только разные нетерминалы.
Введение возможности альтернативного перечисления позволило сократить описание языков. Описание идентификатора будет выглядеть следующим образом:
1. A1 = A + B + C + D + E + F + G + H + I + J + K + L + M + N + O + P + Q + R + S + T + U + V + W + X + Y + Z + a + b + c + d + e + f + g + h + i + j + k + l + m + n + o + p + q + r + s + t + u + v + w + x + y + z
2. A2 = 0 + 1 + 2 + 4 + 5 + 6 + 7 + 8 + 9
3. A3 = A1 + A3A1 + A3A2
4.3 Бэкуса-Наура формы (бнф)
Метаязыки Хомского и Хомского-Щутценберже использовались в математической литературе при описании простых абстрактных языков. Метаязык, предложенный Бэкусом и Науром, впервые использовался для описания синтаксиса реального языка программирования Алгол 60. Наряду с новыми обозначениями метасимволов, в нем использовались содержательные обозначения нетерминалов. Это сделало описание языка нагляднее и позволило в дальнейшем широко использовать данную нотацию для описания реальных языков программирования. Были использованы следующие обозначения:
– символ «::=» отделяет левую часть правила от правой;
– нетерминалы обозначаются произвольной символьной строкой, заключенной в угловые скобки «<» и «>»;
– терминалы – это символы, используемые в описываемом языке;
– каждое правило определяет порождение нескольких альтернативных цепочек, отделяемых друг от друга символом вертикальной черты «|».
Пример описания идентификатора с использованием БНФ:
1. <буква> ::= А|В|С|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y| Z|a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z
2. <цифра> ::= 0|1|2|3|4|5|6|7|8|9
3. <идентификатор> ::= <буква> | <идентификатор> <буква> | <идентификатор> <цифра>
Правила можно задавать и раздельно:
<идентификатор> :: = <буква>
<идентификатор> :: = <идентификатор> <буква>
<идентификатор> :: = <идентификатор> <цифра>
