Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теория языков программирования методов трансляции.-1.pdf
Скачиваний:
13
Добавлен:
05.02.2023
Размер:
1.36 Mб
Скачать

41

9.Оптимизация кода.

10.Исправление ошибок.

3.Теория языков

3.1. Способы определения языков

Мы определяем язык L как множество цепочекконечной длины в алфавите å.

Первый вопрос - как описать язык L в том случае, когда он бесконечен. Если L состоит из конечного числа цепочек, то самый очевидный способ – составить список всех цепочек.

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

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

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

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

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

распознавателем.

3.2. Грамматики

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

42

(предложениям) языка полезную структуру. Мы будем пользоваться формализмом грамматик Хомского.

В грамматике, определяющей язык L, используются два конечных непересекающихся множества символов – множество нетерминальных символов, которое обычно обозначается буквойN, и множество терминальных символов, обозначаемое å. Из терминальных символов образуются слова (цепочки) определяемого языка. Нетерминальные символы служат для порождения слов языка L определённым способом.

Сердцевину грамматики составляет конечное множество Р правил образования, которое описывает процесс порождения цепочек языка. Правило это просто пара цепочек или элемент множества, иначе говоря, (NÈå)* N (NÈå)* ´ (NÈå)*. Первой компонентой правила является любая цепочка, содержащая хотя бы один нетерминал, а второй компонентой – любая цепочка.

Пример.

Например, правилом может быть пара(AB, CDE). Если уже установлено, что некоторая цепочкаa порождается грамматикой и a содержит AB, т.е. левую часть этого правила, качестве своей подцепочки, то можно образовать новую цепочкуb, заменив одно вхождение AB в a на CDE.

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

Соглашение. Правило (a, b) будем записывать a®b.

Определение.

Грамматикой называется четвёрка G=(N, Σ, P, S),

где

N – конечное множество нетерминальных символов или нетерминалов (иногда называемых вспомогательными символами, синтаксическими переменными или понятиями);

å- непересекающееся с N конечное множество терминальных символов (терминалов);

P– конечное подмножество множества (NÈå)*N(NÈå)*´(NÈå)* , элемент (a, b) множества P называется правилом (или продук-

цией) и записывается a®b;

S – выделенный символ из N, называемый начальным (исходным) символом.

Примером грамматики служит четвёркаG1 = ({A, S}, {0, 1}, P, S), где P состоит из правил

43

S→0A1 0A→00A1

A→e.

Нетерминальными символами являются А и S, а терминальными - 1

и 0.

Грамматика определяет язык рекурсивным образом. Рекурсивность проявляется в задании особого рода цепочек, называемых вводимыми цепочками грамматики G=(N,Σ,P,S), где

1)S - вводимая цепочка;

2)если αβγ – выводимая цепочка и β→d содержится в Р, то adg

тоже выводимая цепочка.

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

Терминология.

Пусть G=(N, Σ, P, S) – грамматика. Отношение ÞG на множестве (NÈå)* (φÞGΨ означает Ψ, непосредственно выводимая из φ ) и практикуется: если αβγ – цепочка из (NÈå)* и βδ – правило из Р, то αβγ

ÞG αδγ.

Транзитивное замыкание отношенияÞG обозначим черезÞG+ и трактуется – Ψ, выводимая из φ нетривиальным образом.

Рефлексивное и транзитивное замыкание отношенияÞG (ÞG*) φÞG* Ψ, Ψ, выводимая из φ.

Далее, если ясно, о какой грамматике идёт речь, то индекс G будет опускаться.

Таким образом, L(G) = {w | wÎå*,SÞ*w} через Þk будем обозна-

чать k-ю степень отношения Þ. Иначе говоря a Þk b, если существует

a0 ,a1 ,...,ak , состоящая

из k+1 цепочек, для

которых

a = a0 ,...,ai -1 ,ai при 1£ i

£ к и ak =b. Эта последовательность цепо-

чек называется выводом длины k цепочки b из цепочки a в грамматике

G.

Отметим, что *b тогда и только тогда, когда i b для некото-

рого i≥0, и +b тогда и только тогда, когда a Þi b для некоторого i≥1.

Пример.

Рассмотрим грамматику G1 из ранее приведённого примера

SÞ0A1Þ00A11Þ0011.

44

На первом шаге S заменяется на А01 в соответствии с правилом

S→A01.

На втором шаге 0A заменяется на 00A1. На третьем шаге A заменяется на e.

Можно сказать, что SÞ30011

SÞ+0011

SÞ*0011,

и что 0011 принадлежит языку L(G1).

Соглашение: a®b1

 

a®b2

 

…….

 

a®bn

обозначим

a®b1 ½b2 ½….½bn .

Кроме того, примем ещё следующие соглашения относительно символов и цепочек, связанных с грамматикой:

(1)a, b ,c, d и цифры 0,1,2,..,9 обозначают терминальные символы;

(2)A, B, C, D, S обозначают нетерминалы, S – начальный символ;

(3)U, V,...,Z обозначают либо нетерминалы, либо терминалы;

(4)a, b,.. обозначают цепочки, которые могут содержать как терминалы, так и нетерминалы;

(5)u, v,...,z обозначают цепочки, состоящие только из терминалов.

Пример.

Пусть G0 = ({E, T, F},{a, +, * (, )}, P, E), где P состоит из правил:

E→E+T | T

T→T*F | F F→(E) | a.

Пример вывода в этой грамматике: EÞE+T ÞT+T ÞF+T Þa+T Þa+T*F Þa+F*F Þa+a*F

Þa+a*a,

т.е. язык G0 представляет собой множество арифметических выражений, построенных из символов a, +, *, (и).