Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lektsii_YaPiMT_ispravlennoe.docx
Скачиваний:
4
Добавлен:
01.03.2025
Размер:
272.13 Кб
Скачать

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

Можно формально определить язык как подмножество множества всех предложений из «слов» или символов некоторого основного словаря.

Например, язык Си состоит из программ, которые являются последовательностями, состоящими из { , } , if , for , while, ….

Алфавит это непустое множество элементов. Назовём элементы алфавита символами(алфавит не обязан быть конечным или счётным, но во всех практических приложениях он будет конечным) (может счётным.

Всякая конечная последовательность символов алфавита А называется цепочкой.

Вот несколько цепочек в алфавите A = {a,b,c}: a , b , c , ab , aabb. Мы также допускаем существование пустой цепочки λ(е), т.е. цепочки не содержащей ни одного слова. Порядок символов в цепочке важен. Так цепочка аб, не то же самое что и ба. Длинна цепочки х - |x| - равна числу символов в цепочке.: | λ|=0, |a|=1, |abc|=3.

Будем использовать буквы a, b, c, как имена символов алфавита, в то время как x, y, z, w – для обозначения цепочек символов.

Если х и у - цепочки, то их конкатенация ху является цепочкой, полученная путём дописывания символов цепочки у вслед за символами цепочки х. Если х= dе и у=ес, то ху= dеес .

Т.к. пустая цепочка λ не содержит символов, то λх=х λ=х.

Если z=xy – цепочка, то х голова, а у – хвост z. И ноканец, х – правильная голова, если у – непустая цепочка ( не λ ), у – правильный хвост, если х – не λ.

Если х=абс, то λ, а, аб, абс – голова, все правильные, кроме абс. (Будем обозначать множество цепочек заглавными буквами).

Произведение АB двух множеств цепочек А и B определяется как AB= { xy| x A,y B} . Пусть А={a,b} и B={c,d}, то AB={ac, ad, bc, bd}

Т.к. λх=х λ=х для любой цепочки, то { λ}A=A{ λ}=A (множество из пустых цепочек можно и слева, и справа домножать).

Определим степень цепочки:

x0 – пустая цепочка λ

x1 =х

x2=хх

x3=ххх

xn=xxn-1=xn-1x (n>0)

Аналогично определяется степень алфавита А:

А0={ λ}, A1=1, … , An=AAn-1=An-1A, n>0

Определим 2 операции:

Итерацию А* множества А: А*=А0 A+ и усечённую итерацию А+ множества А : А+=А1 A2An

Таким образом, если A={a,b}, то А* включает цепочки λ, а, б, аа, аб, ба, ааа, ааб, бб, ….

А+=АА*=А*А

Определение 1:

Продукцией или правилами подстановки называется упорядоченная пара(u,х), которая записывается так u::=х, где u – символ, а х – непустая конечная цепочка символов, где u – называется левой частью правила, х – правой.

Определение 2:

Грамматикой G[z] называется конечное, непустые множество правил.

z – это символ, который должен встретиться в левой части по крайней мере одного правила.

Он называется начальным символом. Все символы, которые встречаются в левых и правых частях правил, образуют словарь V.

Пример:

Грамматика G1[<число>]

<число>::=<пчс>

<пчс>::=<пчс><цифра>

<пчс>::=<цифра>

<цифра>::=0

<цифра>::=1

<цифра>::=9

Словарь V для этой грамматики следующий:

V={0,1,2,3,4,5,6,7,8,9, <цифра>,<пчс>,<число>}.

Определение 3:

В заданной грамматике G символы, которые встречаются в левой части правил, называются нетерминальными. Они образуют множество нетерминальных символов VN. Символы , которые не входят в множество VN, называется терминальными. Они образуют множество VT. Таким образом V=VN VT.

Нетерминалы будем заключать в угловые скобки < >, чтобы отличить их от терминалов.

В грамматике G1 символы 0,1,2,3,…,9 – терминалы; число, ПЧС, цифра - нетерминалы.

Множество правил с одинаковой левой частью будем записывать V:: x|y|…|z.

Тогда G1 будет выглядеть следующим образом:

<число>::=<пчс>

<пчс>::=<пчс><цифра>/<цифра>

<цифра>::=0|1|2|3|…|9

Такая форма записи называется нормальной формой Бэкуса (НФБ) или формой Бэкуса – Наура.

Определение 4:

Пусть G – грамматика. Мы говорим, что цепочка V непосредственно порождает цепочку wu и обозначаем V=>w , если для некоторых цепочек х и у можно написать : V=xUy, w=хuу где U::=u – правило грамматики G. Мы также говорим, что w - непосредственно выводима из V, цепочки х и у могут быть пустыми.

Пример:

V

w

Использованные пр.

x

y

<число>=>

<пчс>=>

<пчс><цифра>=>

<цифра><цифра>=>

7<цифра>=>

<пчс>

<пчс><цифра>

<цифра><цифра>

7<цифра>

75

1

2

3

6

6

λ

λ

λ

λ

7

λ

λ

<цифра>

<цифра>

λ

Определение 5:

Говорят V порождает w V=>+w, если существует последовательность непосредственных выводов V=u0=>u1=>u2=>…=>un=w n>0. Эта последовательность называется выводом длины n.

Говорят, также, что цепочка u является выводом V. Наконец пишут V=>*w, если V=>+w или V=w;

Пример:

<число>=><пчс>=><пчс><цифра>=><цифра><цифра>=>7<цифра>=>75, таким образом <число>=>75 и длинна вывода = 5.

Если в цепочке есть хотя бы 1 нетерминал, из неё можно вывести новую цепочку. Однако, если нетерминальные символы отсутствуют, то вывод надо закончить.

Каким будет язык, отписанный грамматикой G1[<число> ] ?

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

Определение 6:

Пусть G[z] – грамматика. Цепочка х называется сентенциальной формой, если х выводима из начального символа z, z=>*x.

Предложение – это сентенциальная форма, состоящая из терминальных символов.

Определение 7:

Язык L(G[z]) – это множество предложений:

L(G)={x| z=>*x и x VT+ }.

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

Определение 8:

Пусть G[z] – грамматика. И пусть w = х U у – тогда u называется фразой синтециональной формы w для нетерминального символа U, если z=>* xUу и U=u+ (простая U=>u).

Следует быть осторожным с терминалом фраза. Тот факт, что U=u+ вовсе не означает, что u является фразой сентенциальной формы хuу, необходим z=>* xUу.

В качестве примера рассмотрим сентенциальную форму <пчс>1.

Значит ли, что <пчс> - является фразой, если существует правило <число>::=<пчс>? – нет, т.к. невозможно вывод <число>1 начального символа <число>. Имеет место вывод:

<число>=><пчс>=><пчс><цифра>=><пчс>1.

Таким образом:

<число>=>*<пчс> и <пчс>=>+<пчс>1

<число>=>*<пчс><цифра> и <цифра>=1

Тогда <пчс>1 и 1 фразы; 1 – простая фраза.

Определение 9:

Основой всякой сентенциальной формы называется самая левая простая фраза.

Грамматика G1 описывает бесконечный язык, т.к. существует правило <пчс>::=<пчс><цифра>.

В общем случае, если U=>+U…, мы говорим, что грамматика рекурсивна. Если U=>+U… то левая рекурсия, U=>+U – правая.

Определение 10:

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

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

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

Отправляясь от начального символа <число> нарисуем его куст, для того, чтобы указать первый непосредственный вывод:

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

Строим три синтаксические диаграммы, каждый раз применяя непосредственный вывод.

При чтении слева направо концевые узлы образуют цепочку, вывод которой представлен деревом. Можно восстановить вывод по синтаксическому дереву при помощи обработки процесса. Самый правый концевой указывает непосредственный вывод 7<цифра>=>75, чтобы пройти по синтаксическому дереву до куста 7<цифра> мы отсекаем куст от дерева – удаляем его. Продолжаем процесс всегда восстанавливая последний непосредственный вывод. Концевые узлы дерева образуют выводимую сентенциальную форму.

Определение 11:

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

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

Пример:

{aibicj|i,j ≥1} {aibicj| i,j ≥1}

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