Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Shpory_tyap (1).doc
Скачиваний:
23
Добавлен:
17.04.2019
Размер:
1.05 Mб
Скачать

64

1. Понятие языка. Языки естественные и искусственные. Формализованные и формальные языки.

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

Язык характеризуется:

- набором используемых знаков;

- образования из этих знаков таких языковых конструкций, как “слова”, “фразы” и “тексты” (в широком толковании этих понятий);

- синтаксических, семантических и прагматических правил использования этих языковых конструкций.

В процессе развития человеческого общества люди выработали большое число языков, например:

- языки (в настоящее время в мире их насчитывают более 2000);

- мимики и жестов;

- чертежей, рисунков, схем;

- (математики, химии, биологии и т.д.);

- искусства (живописи, музыки, скульптуры, архитектуры и т.д.);

- (азбука Брайля для слепых, азбука Морзе, Эсперанто, морской семафор и т.д.);

- языки (блок-схемы, языки программирования).

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

Пример. Запишем более кратко, сжато, точно (формализованно) факт "целое число x делится на целое число y без остатка". На математическом языке это будет иметь вид "Число x кратно числу y". Факт, что числа x, y – целые, уже можно специально, как выше, не оговаривать, так как математическое понятие кратности это уже предполагает (аксиома). Запишем еще более кратко и формализованно на алгоритмическом языке Паскаль: "x mod y = 0". Здесь уже условие кратности область изменения аргументов не нужно оговаривать – они декларированы в языке Паскаль (в описаниях типов и операции mod).

Все языки можно разделить на естественные и искусственные.

Естественными называются “обычные”, “разговорные” языки, которые складываются стихийно и в течение долгого времени. История каждого такого языка неотделима от истории народа, владеющего им. Естественный язык, предназначенный, прежде всего, для повседневного общения, имеет целый ряд своеобразных черт:

- все слова имеют не одно, а несколько значений;

- встречаются слова с неточным и неясным содержанием;

- отдельных слов и выражений зависят не только от них самих, но и от их окружения (контекста);

- синонимы (разное звучание - одинаковый смысл) и омонимы (одинаковое звучание - разный смысл);

- и те же предметы могут иметь несколько названий;

- слова, не обозначающие никаких предметов;

- соглашения относительно употребления слов не формулируются явно, а только предполагаются и для каждого правила есть исключения и т.д.

Основными функциями естественного языка являются:

- (функция общения);

- (познавательная функция);

- (функция формирования личности);

- (функция воздействия).

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

Любой язык –– и естественный и искусственный –– обладает набором определенных правил. Они могут быть явно и строго сформулированными (формализованными), а могут допускать различные варианты их использования.

Формализованный (формальный) язык –– язык, характеризующийся точными правилами построения выражений и их понимания. Он строится в соответствии с четкими правилами, обеспечивая непротиворечивое, точное и компактное отображение свойств и отношений изучаемой предметной области (моделируемых объектов).

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

Большинство формальных языков (созданных конструкций) строится по следующей схеме: сначала выбирается алфавит, или совокупность исходных символов, из которых будут строиться все выражения языка; затем описывается синтаксис языка, то есть правила построения осмысленных выражений. Буквами в алфавите формального языка могут быть и буквы алфавитов естественных языков, и скобки, и специальные знаки и т.п. Из букв, по определенным правилам можно составлять слова и выражения. Осмысленные выражения получаются в формальном языке, только если соблюдены определенные в языке правила образования. Для каждого формального языка совокупность этих правил должна быть строго определена и модификация любого из них приводит чаще всего к появлению новой разновидности (диалекта) этого языка.

Пример. Опишем элементы естественного, например, русского языка в терминах формальных грамматик. Алфавит языка X = {А, а, Б, б, ... , Я, я, ., ,, :, ;, ., !, ?, ", ", (, )}, T={<корни>, <приставки> и т.д.}, N = {предложение, подлежащее, сказуемое, глагол, местоимение и т.д.}, n0 = "предложение" . Например, пусть

Т = {арбуз, банан, красный, греет, загорает, бок},

N = {сказуемое, подлежащее, определение, дополнение, группа подлежащего, группа сказуемого},

n0 = {предложение} ,

P = {p1: предложение (группа подлежащего), (группа сказуемого ),

p2: группа подлежащего (определение)(подлежащее) ,

p3: группа сказуемого (сказуемое) (дополнение) ,

p4: определение "красный" ,

p5: подлежащее "арбуз" ,

p6: подлежащее "банан" ,

p7: сказуемое "греет" ,

p8: дополнение "банан" ,

p9: дополнение "бок"} .

Тогда справедливы следующие выводы:

предложение (группа подлежащего)(группа сказуемого)

(определение) (подлежащее) (группа сказуемого)

(определение) (подлежащее) (сказуемое) (дополнение)

"красный" (подлежащее) (сказуемое )(дополнение)

"красный арбуз" (сказуемое) (дополнение)

"красный арбуз греет" (дополнение)

"красный арбуз греет бок".

Таким образом, мы по формальным правилам построили предложение естественного языка.

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

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

2. Синтаксис, семантика и прагматика.

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

  1. Сама программа-транслятор считается описанием языка. Тут сразу точно описаны и тексты (правильная программа — та, на которой транслятор не выдает ошибки), и их интерпретация (интерпретация программы — то, как исполняется ее текст после перевода транслятором).

Именно так пытались поступать на заре программирования, когда, скажем, легендарный язык FORTRAN создавался одновременно с первым транслятором с данного языка.

  1. Определением языка считается формальная лингвистическая система (грамматика). Впервые этот подход был последовательно применен в Алголе. Встречавшиеся вам при изучении языков синтаксические диаграммы являются непосредственными потомками того, что было сделано в Алголе.

  2. Определением языка считается соответствие между структурными единицами текста и правилами интерпретации. Этот вариант был полностью реализован при определении языка Алгол 68.

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

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

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

Таким образом, мы видим, что каждый язык имеет три стороны: синтаксис (второй вариант), семантика (третий вариант), прагматика (первый вариант).

Синтаксис алгоритмического языка — совокупность правил, позволяющая:

  1. формально проверить текст программы (выделив множество синтаксически правильных программ);

  2. разбить эти программы на составляющие конструкции и в конце концов на лексемы.

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

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

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

  1. Все определения становятся явными (изгоняются такие понятия, как "не определено", "определяется реализацией" и т. п.).

  2. Появляются дополнительные конструкции, описатели и др., обусловленные реализацией. Они обязательно учитывают:

- особенности вычислительной машины и среды вычислений;

- особенности принятой схемы реализации языка;

- обеспечение эффективности вычислений;

- ориентацию на специфику пользователей.

Прагматика иногда предписывается стандартом языка, иногда нет. Это зависит от того, для каких целей предназначены язык и его реализация.

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

Синтаксический перевод

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

Большинство методов синтаксического разбора попадают в один из двух классов, так называемых метода "сверху-вниз" и метода "снизу-вверх". В первом методе построение дерева начинается с корня и продолжается в направлении листьев, в то время как во втором методе построение начинается с листьев и развивается по направлению к корню. Популярность анализаторов "сверху-вниз" объясняется тем, что эффективный анализатор можно легко построить "вручную". Анализаторы "снизу-вверх" могут работать с большим классом грамматик и схем перевода, поэтому в программах-генераторах анализаторов все больше используются алгоритмы разбора "сверху-вниз".

3. Классификация языков по н. Хомскому.

Хомский предложил классификацию формальных грамматик по типу выражения правил и предложил выделить 4 основных типа, называемые в целом Иерархией Хомского:

Грамматика типа 0 - генеративная, самая сложная, никаких ограничений на вид ее правил не накладывается. Грамматика типа 0, порождающая (generative grammar), - в классической записи это четверка G=(N,∑, P, S), где N, ∑ - алфавит (N - нетерминальные символы, ∑ - терминальные символы метаязыка); S - начальный символ нетерминального множества, Р - правила репродукции (rewriting rules).

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

Грамматика типа 1 - называют контекстно-зависимыми грамматиками, и в них возможность замены цепочки символов может определяться контекстом. Используются для генерации элементов естественных языков и подъязыков.

Грамматика типа 2 - контекстно-свободные, причем в левой части нетерминала могут быть всем, чем угодно. Они распознаются в информатике так называемыми автоматами с магазинной памятью (стековые автоматы). Используются для генерации элементов языков программирования (выражений, команд).

Грамматика типа 3 - называют регулярными, самые простые и ограниченные грамматики, распознаются конечными автоматами. Используется для простых элементов языков (числа, константы, переменные).

4. Нотация Бэкуса-Наура

(больше известная как БНФ или Форма Бэкуса-Наура) - формальный математический прием для описания языка, разработанный Джоном Бэкусом (а также, возможно, Питером Науром) для описания синтаксиса языка программирования Algol 60.

(Легенда гласит, что она была вначале разработана Джоном Бэкусом на основе более ранних работ математика Эмиля Поста, а затем заимствована и несколько улучшена Питером Науром для Algol 60, что принесло ей широкую известность. Поэтому Наур называет БНФ Нормальной Формой Бэкуса, тогда как все остальные называют ее Формой Бэкуса-Наура).

Она используется для формального определения грамматики языка таким образом, что не остается разногласий или неоднозначности касательно того, что является допустимым, а что нет. На самом деле БНФ настолько однозначна, что вокруг подобных грамматик было построено немало математических теорий, и в действительности можно механически построить парсер (модуль синтаксического разбора - прим. пер.) для языка, задав для него грамматику в виде БНФ. (Существуют некоторые виды грамматик, для которых это невозможно, однако обычно их можно вручную преобразовать к пригодному для этого виду).

Программы, которые делают это, обычно называются "компиляторами компиляторов".

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

Правила называются правилами продукции и выглядят следующим образом:

Код:

  символ : = альтернатива1 | альтернатива2 ...

Правило продукции просто устанавливает, что символ слева от ":=" должен быть заменен одной из альтернатив в правой части. Альтернативы разделяются знаком "|". (В одном из вариантов используется знак "::=" вместо ":=", но смысл его тот же). Альтернативы обычно состоят из символов и так называемых терминалов. Терминалы  это просто фрагменты конечной строки, не являющиеся символами. Они называются терминалами, потому что для них нет правил продукции: они завершают процесс построения строк. (Символы часто называют нетерминалами).

Еще одна вариация грамматики БНФ заключает терминалы в кавычки, чтобы отличать их от символов. Некоторые грамматики БНФ явно указывают, где допустимы пробелы, зарезервировав для этого специальный символ, тогда как другие грамматики предоставляют догадываться об этом самому читателю.

В БНФ имеется специальный символ "@", который означает, что символ может быть удален. Если вы заменяете символ на "@", вы просто удаляете символ. Это полезно, поскольку иногда трудно завершить процесс замещения, не используя этот трюк.

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

Реальный пример

Ниже представлена простая грамматика БНФ:

Код:

    S  := ';-' FN | FN

    FN := DL | DL '.' DL

    DL := D | D DL

    D  := '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'

Все символы здесь  сокращения: S - начальный символ (start symbol), FN - число с дробной частью (fractional number), DL - список цифр (digit list), D - цифра (digit).

Допустимые предложения языка, описываемого данной грамматикой, - это все числа, возможно, дробные, возможно, отрицательные. Чтобы построить число, начинаем с начального символа:

Код:

  S

Затем заменяем символ S одной из его продукций. Мы решили не ставить знак "-" перед числом, так что используем простую продукцию FN и заменяем S на FN:

Код:

  FN

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

Код:

    DL . DL

    D . DL

    3 . DL

    3 . D DL

    3 . D D

    3 . 1 D

    3 . 1 4

Здесь мы вывели дробное число 3.14.

5. Формальная грамматика. Типы формальной грамматики.

Формальная грамматика или просто грамматика в теории формальных языков — способ описания формального языка, то есть выделения некоторого подмножества из множества всех слов некоторого конечного алфавита.

Определение формальной грамматики и языка

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

Определение: Конечное множество символов, неделимых в данном рассмотрении, называется словарем или алфавитом, а символы, входящие в множество, - буквами алфавита.

Например, алфавит A = {a, b, c, +, !} содержит 5 букв, а алфавит B = {00, 01, 10, 11} содержит 4 буквы, каждая из которых состоит из двух символов.

Определение: Последовательность букв алфавита называется словом или цепочкой в этом алфавите. Число букв, входящих в слово, называется его длиной.

Например, в алфавите A слово a=ab++c имеет длину l(a) = 5, а слово b=00110010 в алфавите B имеет длину l(b) = 4.

Если задан алфавит A, то обозначим A* множество всевозможных цепочек, которые могут быть построены из букв алфавита A. При этом предполагается, что пустая цепочка, которую обозначим знаком $, также входит в множество A*. Пустая цепочка – это цепочка, не содержащая ни одной буквы. Присоединение к некоторой цепочке a пустой цепочки, справа или слева от от нее, не изменяет цепочку a.

a $ = $ a = a

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

Определение: Формальной грамматикой G называется следующая совокупность четырех объектов:

G = {N, T, S, P}, где T - терминальный алфавит (словарь); буквы этого алфавита называются терминальными символами; из них строятся цепочки, порождаемые грамматикой;

для обозначения букв терминального словаря, которые называют также терминальными символами, в дальнейшем условимся использовать строчные буквы латинского алфавита;

N - нетерминальный, вспомогательный алфавит (словарь); буквы этого алфавита используются при построении цепочек; они могут входить в промежуточные цепочки, но не должны входить в результат построения;

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

S - начальный символ или аксиома грамматики S N.

P - множество правил вывода или порождающих правил вида  , где и  - цепочки, построенные из букв алфавита N È T, который называют полным алфавитом (словарем) грамматики G.

В множество правил грамматики могут также входить правила с пустой правой частью вида <Е> . Чтобы избежать неопределенности из-за отсутствия символа в правой части правила, условимся использовать символ пустой цепочки, записывая такое правило в виде <Е> $.

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

Определение: Пусть r =  - правило грамматики Г и = ' " - цепочка символов, причем', " (T ) *. Тогда цепочка = ' " может быть получена из цепочки путем применения правила r (т.е. заменой в m цепочки на ). В этом случае говорят, что цепочка непосредственно выведена из цепочки и обозначают .

Определение: Если задана совокупность цепочек = (w0, w1,...,wn), таких что существует последовательность непосредственных выводов:

w0 w1, w1 w2, ... ,wn-1 wn,

то такую последовательность называют выводом wn из w0 в грамматике G и обозначают w0 * wn.

Определение: Множество конечных цепочек терминального алфавита T грамматики G, выводимых из начального символа S, называется языком, порождаемым грамматикой G и обозначается L( G).

L(G) = {w* | S *w }.

Рассмотрим несколько примеров, иллюстрирующих введенные понятия:

Пример 1:

Задана грамматика Г1.1, требуется определить язык, порождаемый этой грамматикой:

G1.1: T = {a, b, c}, N = {S}, P = {S abc}.

Схема грамматики содержит одно правило, поэтому G1.1 порождает язык из одного слова

L(G1.1) = {abc}.

Пример 2:

Задана грамматика G1.2 и требуется определить язык, порождаемый этой грамматикой.

G1.2 : T = {a, b, c}, N = {S, B, C}

P = {S aB,

B Cd,

B dc,

C $}.

Построим все выводы в этой грамматике. Это можно сделать двумя способами. Вначале применим правила 1,2,4, а затем построим второй вывод, используя правила 1 и 3. В результате получим:

<I> a<B> a<C>d ad,

<I> a<B> adc.

Построим все выводы в этой грамматике. Это можно сделать 2мя способами. В начале применим правила 1, 2, 4, а затем построим второй вывод, используя правила 1 и 3.

В результате S -> aB -> aCd -> ad

S -> aB -> adc

Следовательно язык, порождаемый этой грамматикой, состоит из двух цепочек L(G1.2) = {adc, ad}.

Пример 3:

Задана грамматика G1.3 и требуется определить язык, порождаемый этой грамматикой.

G1.3 : N = {S, A}, T = {0, 1},

P = {S 0A1,

A 0A1,

A $}.

Схема приведенной грамматики содержит три правила. Второе правило содержит нетерминальный символ А как в левой, так и в правой части правила. Такие правила называют рекурсивными. Применение такого правила к цепочке, содержащей нетерминал А, приводит к получению новой цепочки, в которую снова входит А. Таким образом, замену нетерминала А правой частью правила можно выполнять многократно, что позволяет строить сколь угодно длинные цепочки. Чтобы вывод с применением рекурсивного правила не был бесконечным, в схеме грамматики должно быть хотя бы одно правило с символом А в левой части. Такое правило завершает рекурсию, исключая А из выводимой цепочки. В рассматриваемой грамматике для завершения вывода используется правило А ® $. Рассмотрим построение выводов с помощью правил грамматики G1.3. Применяя первое и третье правила, получаем:

S 0A1 01.

Применив первое, второе, а затем третье правило, имеем

S 0A1 00A11 0011.

Применив второе правило k раз, получим в результате цепочку, содержащую k нулей и k единиц. Следовательно, язык, порождаемый грамматикой G1.3, содержит всевозможные цепочки, в которых число нулей равно числу единиц.

Пример 4:

Задана грамматика G1.4 и требуется построить язык, порождаемый этой грамматикой.

G1.4 : T = {a, b}, N = {S, A},

P = { S aA, A bA}.

Попытка построения вывода в этой грамматике приводит нас к цепочке:

S aA abA abbA …,

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

Определение: Если язык, порождаемый грамматикой G, не содержит ни одной конечной цепочки (конечного слова), то он называется пустым.

Типы формальных грамматик

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

Грамматики типа 0, которые называют грамматиками общего вида, не имеют никаких ограничений на правила порождения. Любое правило

r = 

может быть построено с использованием произвольных цепочек  (T N)*. Например,

TW WT или xAbCD xHD.

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

1 A 2 1 2,

где 1,2 - цепочки, возможно пустые, из множества (T N)*, символ А  и цепочка ω (T N)*. Цепочки 1 и2 остаются неизменными при применении правила, поэтому их называют контекстом (соответственно левым и правым), а грамматику – контекстно-зависимой.

Грамматики типа 1 значительно удобнее на практике, чем грамматики типа 0, поскольку в левой части правила заменяется всегда один нетерминальный символ, который можно связать с некоторым синтаксическим понятием, в то время как в грамматике типа 0 можно заменять сразу несколько символов, в том числе и терминальных.

Например, грамматика:

G1.5: T = {a, b, c, d}, N = {S, A, B}

P = {S aAS,

AS AAS,

AAA ABA,

A b,

bBA bcdA,

bS ba}

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

S aAS aAAS abAS abbS abba.

Грамматики типа 2 называют контектно-свободными, т. к. 2 и 6 правила имеют непустой левый контекст, а 3 и 5 содержат оба контекста. Правила вывода таких грамматик имеют вид:

A,

где A N и (T N)*.

Очевидно, что эти правила получаются из правил грамматики типа 1 при условии 1 = 2 = $. Поскольку контекстные условия отсутствуют, то правила КС-грамматик получаются проще, чем правила грамматик типа 1. Именно такие грамматики используются для описания языков программирования. Примером КС-грамматики может служить следующая грамматика:

G1.6: T = {a, b}, N = {S},

P = {S aSa,

SbSb,

S aa,

Sbb}.

Эта грамматика порождает язык, который состоит из цепочек, каждая из которых в свою очередь состоит из двух частей, цепочки * и зеркального отображения этой цепочки '.

L( G1.6 ) = { ' |  +},

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

SaSaabSbaabaSabaababbaba.

Грамматики типа 3 называют автоматными грамматиками (А - грамматиками). Правила вывода в таких грамматиках имеют вид:

Aa или AaB или ABa,

где a T, и A, B, причем грамматика может иметь только правила вида A aB - правосторонние правила, либо только вида ABa - левосторонние правила.

Примерами автоматных грамматик могут служить правосторонняя грамматика G1.7 и левосторонняя грамматика G1.8

G1.7: T = {a, b}, N = {S, A},

P = {S aS,

SaA,

AbA,

AbZ,

Z $ }.

G1.8:

T= {a, b}, N = {S, A},

P = {SAb,

AAb,

AZa,

ZZa,

Z $ }.

Эти грамматики порождают один и тот же язык. Если обозначать цепочки, состоящие из k одинаковых символов x как xk, например x4 = xxxx, то порождаемый этими грамматиками язык можно определить следующим образом:

L(G1.8) = { anbm | n,m > 0}.

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

Например, если грамматика типа 2 содержит правило вида

А ® a1 a2 B a3 a4,

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

А ® a1 a2 a3 a4 B,

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

Если обозначить множество языков типа k выражением {Lтипаk}, то отношение между множеством языков различных типов можно определить с помощью следующего включения:

{ L типа3 } Ì { L типа2 }{ L типа1 }{ L типа0}.

При этом доказано, что существуют языки типа 0, не являющиеся языками типа 1, языки типа 2, не являющиеся языками типа 1, и языки типа 3, не являющиеся языками типа 2.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]