Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Layt_teor_osnovy_form_yazykov.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
1.17 Mб
Скачать

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

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

О п р е д е л е н и е 1.2. Продукцией или правилом подстановки называется упорядоченная пара (U,х), которая обычно записывается так:

U::=х,

где U - символ, а х - непустая конечная цепочка символов.

U называется левой частью, а х - правой частью продукции. Вместо термина продукция в дальнейшем мы чаще будем пользоваться более коротким термином-правилом.

О п р е д е л е н и е 1.3. Грамматикой G|Z| называется конечное, непустое множество правил; Z - это символ, который должен встретиться в левой части по крайней мере хотя бы одного правила. Он называется начальным символом. Все символы, которые встречаются в левых и правых частях правил, образуют словарь V.

Если из контекста ясно, какой символ является начальным символом Z, мы будем писать G вместо G|Z|.

П р и м е р 1.2. Грамматика G1[<число>] содержит 13 правил:

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

Таким образом, V=VNVT.Как правило, нетерминалы мы будем заключать в угловые скобки "<" и ">", чтобы отличить их от терминалов. В грамматике G1 символы 0,1,2,3,4,5,6,7,8,9 - терминальные, а <число>,<чс> и <цифра> - нетерминальные. Мы будем пользоваться надстрочными литерами в том случае, когда нам надо отличить различные вхождения одного и того же нетерминала. Так, можно написать <чс1> ::= <чс2> <цифра> вместо <чс> ::= <чс> <цифра>.

Множество правил U::=х, U::=у,..., U::=z с одинаковыми левыми частями будем записывать сокращенно как U::=х|у|...|z.

Например, грамматику G1 можно записать следующим образом:

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

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

<цифра> ::=0|1|2|3|4|5|6|7|8|9

Эта форма записи называется нормальной формой Бэкуса или формой Бэкуса-Наура. Существует несколько других способов записи для описания нормальных языков. Мы их обсудим позднее.

Теперь, когда есть грамматика, как определить язык, соответствующий этой грамматике? Что является предложением этого языка? Для того чтобы ответить на эти вопросы, нам надо определить символы "=>" и "=>+", которыми мы интуитивно пользовались ранее. Неформально мы пишем v=>w, если можно вывести w из v, заменив нетерминальный символ в v на соответствующую правую часть некоторого правила.

О п р е д е л е н и е 1.5. Пусть G - грамматика. Мы говорим, что цепочка v непосредственно порождает цепочку w, и обозначаем это как

v=>w,

если для некоторых цепочек х и у можно написать

v=хUу, w=хuу,

где U::=u - правило грамматики G. Мы также говорим, что w непосредственно выводима из v или что w непосредственно приводится к v.

Цепочки х и у могут, конечно, быть пустыми. Следовательно, для любого правила U::=u грамматики G имеет место U=>u. В следующей таблице даны некоторые примеры непосредственных выводов, при этом используем грамматику G1 и обозначения из предыдущего определения.

Рис.1.2. Примеры непосредственных выводов.

О п р е д е л е н и е 1.6. Говорят, v порождает w или w приводится к v, что записывается как v=>+w, если существует последовательность непосредственных выводов

v=u0=>u1=>u2=>...=>u[n]=w,

где n>0. Эта последовательность называется выводом длины n. Говорят также, что w является словом для v. И, наконец, пишут v=>*w, если v=>+w или v=w.

Приведем примеры вывода. Рассмотрим первую строку рис.1.2. Из нее видно, что <число> =>+ <чс>; длина вывода равна 1. Используя еще и строку 2 этой таблицы, получаем: <число> =>+ <чс><цифра>; длина вывода равна 2. Если мы посмотрим вниз все строки рис.1.2., то увидим, что:

<число> => <чс> => <чс><цифра> => <цифра><цифра> => 2<цифра> => 22

Таким образом, <число>=>+22 и длина вывода равна 5.

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

Каким будет язык, описанный грамматикой G[<число>]? В следующем определении утверждается, что этим конкретным языком является множество последовательностей из одной и более цифр.

О п р е д е л е н и е 1.7. Пусть G[Z] - грамматика. Цепочка х называется сентенциальной формой, если х выводима из начального символа Z, т.е. если Z=>*х. Предложение - это сентенциальная форма, состоящая только из терминальных символов. Язык L(G [Z]) - это множество предложений:

L(G)={х|Z=>*х и хVT+}.

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

П р и м е р 1.3. Определим грамматику для языка, содержащего вариации уже знакомого нам предложения "the big elephant ate the peanut". Эта грамматика G2[<предложение>] имеет вид

Множество терминальных символов есть { he, the, big, ate, elephant, peanut }. Язык L(G2) является множеством последовательностей этих терминальных символов, выводимых из начального символа <предложение>. Вот некоторые из таких предложений:

О п р е д е л е н и е 1.8. Пусть G[Z] - грамматика. И пусть w=хuу - сентенциальная форма. Тогда u называется фразой сентенциальной формы w для нетерминального символа U, если Z=>*хUу и U=>+u; и далее, u называется простой фразой, если Z=>*хUу и U=>u.

Следует быть осторожным с термином фраза. Тот факт, что U=>+u, вовсе не означает, что u является фразой сентенциальной формы хuу; необходимо также иметь Z=>*хUу. В качестве иллюстрации рассмотрим сентенциальную форму <чс>1 грамматики G1 (пример 1.2). Значит ли, что <чс> является фразой, если существует правило <число>::=<чс>? Конечно, нет, поскольку невозможен вывод цепочки <число>1 из начального символа <число>. Каковы же фразы сентенциальной формы <чс>1? Имеет место вывод

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

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

(1.1) <число>=>*<чс> и <чс>=>+<чс>1

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

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

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

Грамматика G1 примера 1.2. описывает бесконечный язык, т.е. язык, состоящий из бесконечного числа предложений. Это обусловлено тем, что правило <сч> ::= <чс><цифра> содержит <чс> и в левой, и в правой частях, т.е. в некотором смысле символ <чс> сам себя определяет. В общем случае, если U=>+ ...U..., мы говорим, что грамматика рекурсивна по отношению к U. Если U=>+U..., то имеет место левая рекурсия, если U=>+...U, то имеет место правая рекурсия. Правило называется лево (право) рекурсивным, если оно имеет вид U::=U... (U::=...U). Если язык бесконечен, то определяющая его грамматика должна быть рекурсивной.

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