Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции ИНФ.doc
Скачиваний:
26
Добавлен:
06.11.2018
Размер:
1.56 Mб
Скачать

14. Формальные языки и грамматики

14.1. Введение в теорию формальных языков и грамматик

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

Любой язык программирования (алгоритмический язык ) можно понимать как множество цепочек символов, задаваемое некоторым множеством правил. Множество цепочек символов, построенных по определенным правилам, образует формальный язык. Формальная грамматика включает набор грамматических правил, с помощью которых можно порождать и анализировать цепочки формального языка [10].

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

< предложение>, < сказуемое >, < подлежащее >, < дополнение >,

< прилагательное>, < существительное >, < точка >

Пусть имеем словарь, состоящий из 5 символов:

{ Дом, Дуб, Заслоняет, Старый, . }

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

  1. <предложение>:  <подлежащее> <сказуемое>

<дополнение> .

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

  1. <подлежащее>:  <прилагательное> <существительное >

  2. <дополнение>:  <прилагательное><существительное >

  3. <сказуемое>:  ЗАСЛОНЯЕТ

  4. <прилагательное>:  СТАРЫЙ

  5. <cуществительное >:  ДОМ

  6. <cуществительное >:  ДУБ

Применим предложенные правила для порождения ( вывода )

предложения СТАРЫЙ ДУБ ЗАСЛОНЯЕТ СТАРЫЙ ДОМ.

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

<предложение>:  <подлежащее> <сказуемое> <дополнение>.

(Применили 1правило).

<предложение>:  <прилагательное> <существительное >

<сказуемое> < дополнение >. ( Применили 2 правило ).

<предложение>:  СТАРЫЙ <существительное >

<сказуемое> < дополнение >. ( Применили 5 правило ).

<предложение>:  СТАРЫЙ ДУБ <сказуемое> < дополнение >. ( Применили 7 правило ).

<предложение>:  СТАРЫЙ ДУБ ЗАСЛОНЯЕТ < дополнение >. ( Применили 4 правило ).

<предложение>:  СТАРЫЙ ДУБ ЗАСЛОНЯЕТ прилагательное> <существительное >. ( Применили 3 правило ).

<предложение>:  СТАРЫЙ ДУБ ЗАСЛОНЯЕТ СТАРЫЙ <существительное >. (Применили 5 правило )

<предложение>:  СТАРЫЙ ДУБ ЗАСЛОНЯЕТ СТАРЫЙ ДОМ. ( Применили 6 правило ).

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

СТАРЫЙ ДОМ ЗАСЛОНЯЕТ СТАРЫЙ ДОМ.

СТАРЫЙ ДОМ ЗАСЛОНЯЕТ СТАРЫЙ ДУБ.

СТАРЫЙ ДУБ ЗАСЛОНЯЕТ СТАРЫЙ ДУБ.

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

Рассмотрим процедуру вывода (порождения) языка грамматикой на примере дерева. Дерево показывает какие правила применялись к различным промежуточным элементам.

<предложение>

<подлежащее> <сказуемое> <дополнение> .

<прилагат.> <сущест. 1> < прилагат.> <cущест. 2>

старый дуб заслоняет старый дом

Дерево представляет собой синтаксическую структуру предложения. Из него видно, что результирующая цепочка не зависит от порядка, в котором делались замены промежуточных элементов. Элементы грамматики, такие как подлежащее, существительное и другие, называются вспомогательными или нетерминальными символами. В контекстно-свободной грамматике может быть любое конечное число нетерминальных символов. Символы - дуб, дом, старый, заслоняет, . , в рассмотренной грамматике играют роль слов из словаря языка и называются терминальными ( основными ) символами или просто терминалами. Может существовать любое конечное число терминалов в контекстно-свободной грамматике. В языках программирования терминальными являются используемые в них слова и символы: DO, IF, +,...

В общем виде правила грамматики можно записать :

нетерминал  любая конечная цепочка терминальных и нетерминальных символов или одних терминалов.

Цепочка справа от стрелки может быть пустой, что обозначается в

грамматике следующим образом: < F>  . Такое правило называется эпсилон - правилом.

В отдельных языках программирования правила выглядят в соответствии с записью

< оператор >  IF < логическое выражение > THEN < оператор >

Один из нетерминальных символов всегда выделяется в качестве начального. Его называют аксиомой грамматики. С него всегда должен начинаться вывод цепочек языка.

Контекстно-свободная грамматика (КСГ) задается:

конечным множеством терминалов; - конечным множеством нетерминалов; конечным множеством правил вида < A >  , где А - нетерминал, - цепочка терминальных и нетерминальных символов ( возможно пустая ) или цепочка терминальных символов; нетерминал А называется левой частью правила, а - правой; одним нетерминальным символом, выделенным в качестве начального (аксиомой грамматики).

Проанализируем грамматику, правила которой имеют вид:

1. S  a A b S 2. S  b

3. A  A S c 4. A  

Из записи следует: { A,S } - словарь нетерминальных символов;

{a, b, c} - словарь терминальных символов;  - пустая цепочка и, следовательно, не является символом грамматики. Правило 4 можно записать в виде А .

Рассмотрим еще один способ записи правил формальной грамматики, называемый формой Бэкуса-Наура:

  1. <S>:= a <A> b <S> | b 2. <A>:= <A> <S> c | 