Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СПО ЛЕКЦИИ.docx
Скачиваний:
25
Добавлен:
27.09.2019
Размер:
160.65 Кб
Скачать

Лекция №4

Языки классифицируются в соответствии с типами грамматик, с помощью которых они порождены. Для простоты классификации языков построим сводную таблицу классификации грамматик по Хомскому, табл. 1.

Таблица 1

Сводная таблица классификации грамматик по Хомскому

Тип грамматик

Классы, входящие в тип

Вид правил

Ограничения

0

Фразовая структура

  

  V+,   V*

1

Контекстно-зависимая

1A2  12

1, 2  V*

A  N,   V+

Неукорачивающая

  

,   V+

  

2

Контекстно-свободная

укорачивающая (НКС)

A  

A  N,   V+

Контекстно-свободная

укорачивающая (УКС)

A  

A  N,   V*

3

Леволинейная

A  B или

A  

A, B  N,

  T*

Праволинейная

A  B или

A  

A, B  N,

  T*

Поскольку один и тот же язык в общем случае может быть порожден достаточно большим числом грамматик, которые могут относиться к различным классификационным типам, то для классификации языка выбирается грамматика с максимально возможным значением типа. Например, если язык L может быть задан грамматикой G1 и G2 (тип 1), грамматикой G3 (тип 2) и грамматикой G4 (тип 3), то сам язык должен быть отнесен к типу 3, и являться регулярным языком.

От классификационного типа языка зависит не только то, с помощью какой грамматики можно построить предложения этого языка, но также и то, насколько сложно распознать эти предложения, сложность распознавателя языка напрямую зависит от классификационного типа языка.

Сложность языка убывает с возрастанием номера типа.

Тип 0: языки с фразовой структурой.

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

Тип 1: контекстно-зависимые языки.

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

Языки и грамматики, относящиеся к типу 1, применяются в анализе и переводе текстов на естественных языках. Распознаватели, построенные на их основе, позволяют анализировать тексты с учетом контекстной зависимости в предложениях входного языка, но они не учитывают содержание текста, поэтому для точного перевода требуется вмешательство человека.

Эти языки могут также использоваться в системах проверки орфографии и правописания в языковых процессорах.

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

Тип 2: контекстно-свободные языки.

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

В общем случае время на распознавание предложений языка типа 2 полиномиально зависит от длины входной цепочки символов (либо кубические, либо квадратичные зависимости).

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

Тип 3: регулярные языки.

Время на распознавание предложений этого языка сугубо линейно зависит от длины входной цепочки.

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

Регулярные языки – очень удобное средство. Для работы с ними можно использовать регулярные множества и выражения, конечные автоматы.

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

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

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

Такой алгоритм распознавателя уже может быть реализован в программном обеспечении компьютера – зная длину входной цепочки, всегда можно сказать, за какое максимально возможное время будет принято решение о принадлежности цепочки языку и какие вычислительные ресурсы для этого потребуются. Но в компиляторах такие распознаватели не реализуются.

Для языков типа 2 распознавателями являются односторонние недетерминированные автоматы с магазинной (стековой) внешней памятью – МП-автоматы.

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

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

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

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

Сами языки программирования не могут быть полностью отнесены к типу КС-языков, поскольку предполагают контекстную зависимость в тексте исходной программы, например, такую, как необходимость предварительного описания переменных. Поэтому кроме синтаксического разбора все компиляторы предполагают дополнительный семантический анализ текста исходной программы. Этого можно было бы избежать, если использовать распознаватель типа 1 КЗ-распознаватель, но скорость распознавания в этом случае была бы очень низкой. Поэтому лучше комбинированный вариант из КС-распознавателя и семантического анализатора.

Для языков типа 3 распознавателями являются односторонние недетерминированные автоматы без внешней памяти – конечные автоматы (КА). Конечные автоматы – это распознаватели с линейной сложностью алгоритма работы, кроме того, они имеют важную особенность: любой недетерминированный КА всегда может быть преобразован в детерминированный. Это обстоятельство существенно упрощает разработку программного обеспечения, обеспечивающего функционирование распознавателей.

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

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

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

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

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

Рис.1.2. Иерархическая структура грамматик, языков и распознавателей