Конспект лекций москва 2004 удк 519. 713(075)+519. 76(075) ббк 22. 18я7

Вид материалаКонспект

Содержание


7.3. Расширенная форма Бекуса – Наура (РБНФ)
Идентификатор = буква  буква цифра.
7.4. Синтаксическая диаграмма
8. Структура цепочек. СУ-схемы
G. Пусть дана грамматика G
L называется неоднозначным, если для него не существует однозначной грамматики. Например, L={a
Подобный материал:
1   ...   7   8   9   10   11   12   13   14   ...   21

7.3. Расширенная форма Бекуса – Наура (РБНФ)


Часто применяется так называемая расширенная БНФ – РБНФ, в которой используются метасимволы (,); [,]; {,}. Введение метасимволов позволяет сделать запись более лаконичной. Синтаксис РБНФ следующий:
  1. Нетерминалы записываются как последовательность символов.
  2. Терминалы (последовательности символов) заключаются в кавычки.
  3. Знак , используемый в математической записи грамматик, обозначается как =.
  4. Альтернативы, как и в математической записи грамматик, разделяются знаком .
  5. Конструкция, заключенная в  ,  , является необязательной.
  6. Конструкция, заключенная в  , , может повторяться произвольное число раз, от 0 (эквивалент * в регулярных выражениях).
  7. ( ) служат для факторизации, т.е. конструкция  может быть представлена в виде (). Это позволяет использовать конструкцию выбора на более глубоком уровне.
  8. В конце каждого описания ставится точка.

Например, идентификатор в РБНФ можно описать так:

Идентификатор = буква  буква цифра.

буква = 'А’ | ‘В’ | ‘С’ |….| ‘Z’.

цифра = ‘0’ | ‘1’ | ... | ‘9’.

Существительное описывается как

существительное = основа ( окончание единственного числа окончание множественного числа).

Фактически, в правой части правил в РБНФ записывается некоторое регулярное выражение, в котором могут использоваться нетерминалы (т.е. расширение возможностей относительно выразительной мощности обычных регулярных выражений, т.к. обычные регулярные выражения позволяют описывать А-языки, а РБНФ – КС-языки).

7.4. Синтаксическая диаграмма


Синтаксическая диаграмма – графическая форма представления РБНФ. Для каждого нетерминала рисуется своя диаграмма. Приняты следующие обозначения:
    1. Нетерминалы заключаются в прямоугольники.
    2. Терминалы заключаются в овалы.
    3. Образы нетерминалов и терминалов соединяются линиями (со стрелками или без них, далее используются стрелки для указания направления движения) так, чтобы множество путей соответствовало множеству цепочек из терминалов и нетерминалов, задаваемому правилами РБНФ, для которых строится диаграмма.

Диаграммы для конструкции выбора и итерации представлены на рис. 18, а и б, соответственно. Скругленный прямоугольник может быть заменен как прямоугольником (в случае нетерминала), так и овалом ( в случае терминала). Набор диаграмм для идентификатора приведён на рис.19.



Рис.18

В большинстве случаев существует не единственная форма представления для одних и тех же объектов.





Р


ис.19

Легко показать, что выразительная мощность РБНФ и БНФ совпадает:

Условная запись РБНФ

Условная запись БНФ для данной РБНФ

А= (12).

<А> ::=<>< 1>< ><2>

А= [ ] .

<А> ::=<>< >< >

А= { } .

<А> ::= <>

::= <> < B>

8. Структура цепочек. СУ-схемы


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

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

Например, для цепочки ad2+c структура (рис.20) будет выражать порядок действий (знак использован для обозначения возведения в степень).



Рис.20

Структура этой же цепочки может быть представлена также в виде скобочной записи: (( (a)  ( (d)(2)) )+ (c) ).

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

Пусть дана грамматика G13 с множеством правил:

S T + ST

T M  T  M

M (S)  i

ализируемая цепочка x = i + i  i. Для неё можно построить несколько выводов, различающихся порядком замены нетерминалов, например: S  T +S  T + T  T+ M  TT + M  M   M + M  M i + M  Mi + M  ii + i  i , или S T +S  M + S  i + Ti + M  T i + i  T i + i  Mi + i  i.

Легко заметить, что по существу эти выводы различаются незначительно. Для придания единообразия процессу построения вывода определим: вывод, в котором на каждом шаге правило применяется к самому правому (левому) нетерминалу, называется правым (левым) выводом. Второй из приведенных выводов для цепочки i + i  i является левым выводом, т.к. на каждом шаге правило применяется к самому левому нетерминалу.

Одна из форм представления вывода – синтаксические дерево.

Правила построения синтаксического дерева.
  1. Каждому правилу вывода A12…nR, где i – некоторые лексемы, сопоставляется куст.





A







1

2



n



  1. Строим дерево с корнем, растущее вниз. Корню дерева приписываем начальный символ.
  2. Для каждого применяемого правила в выводе приклеиваем соответствующий куст к вершине построенного дерева.
  3. Повторяем шаг 3 до тех пор, пока всем висячим вершинам будут сопоставлены терминалы.

Для грамматики G13 кусты, соответствующие правилам грамматики, приведены на рис. 21,а; синтаксическое дерево для цепочки i + i  i в этой грамматики представлено на рис. 21,б.

Теорема 12. Каждому выводу некоторой терминальной цепочки соответствует единственное синтаксическое дерево. Каждому синтаксическому дереву соответствует единственный правый (левый) вывод.

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

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

Цепочка xL(G) называется неоднозначной в G, если для неё существует более одного синтаксического дерева в G. Грамматика G называется неоднозначной, если L(G) содержит неоднозначные в G цепочки.



а)

б)


Рис.21

Язык L называется неоднозначным, если для него не существует однозначной грамматики.

Например, L={anbncm, anbmcm , n,m 1} – неоднозначный язык в классе КС-грамматик.

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

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

Для задания структуры цепочек часто используются СУ-схемы, т.е. схемы синтаксически управляемого перевода.

СУ- схема T=< Vвх,Vвых, VN, I, R>, где Vвх – входной алфавит , Vвых – выходной алфавит , VN – множество нетерминалов, I – начальный нетерминал, R={ A1,2}, где A VN, 1(Vвх VN)*, 2(Vвых VN)*, а «,» – метасимвол, разделяющий 1 и 2. При этом количество и состав нетерминалов в 1 и 2 совпадают. Если в 1 более одного вхождения некоторого нетерминала А, то устанавливается соответствие между всеми вхождениями А в 1 и 2: А(1), А(2)…А(n).

СУ-схема называется простой, если порядок вхождений нетерминалов в 1 совпадают с порядком вхождений нетерминалов в 2.

Вывод в СУ-схеме строится из пары начальных символов . Определение выводимости в СУ-схеме подобно определению выводимости (выводимость за один шаг обозначаем )для обычных грамматик:

11 22 (из 11 непосредственно выводима 22)  11 А 2, 21 1 2 1=1 А 2, 2 =1 2 2, и А1,2 R, при этом вхождения А в 1 и 1 –соответствующие.

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

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

Перевод, порождаемый СУ-схемой Т:

(T) = {/ + & xVвх*, yVвых*}.

Из СУ-схемы T можно извлечь две грамматики Gвх=< VN,Vвх, I, Rвх>, где Rвх={A 1/ A1,2 R} и Gвых=< VN, Vвых, I, Rвых>, где Rвых={A 2/ A1,2 R}.

СУ-схемы позволяют задавать структуры на уровне описания языка, где (T) = {/ x – входная цепочка, y – выходная цепочка}.

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


S T+S, (T+S);

S T,T;

TMT, (MT);

TM, M;

M (S), (S);

M i, ( i ).

Применение данной СУ- схемы к цепочке i+ii проиллюстрируем выводом (приводится левый вывод):



 < i + T, ( ( i ) + T) >  < i + M  T , ( ( i ) + ( M  T ) ) >   < i + i  T, ( ( i ) + ( ( i )  T ) )>  < i+ i  M, ( ( i ) + ((i)M))> 

 < i + i  i , ( ( i ) + ( ( i )  ( i ) ) ) >

В результате получается перевод цепочки, отражающий порядок её построения.

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

S T+S, +TS;

S T, T;

T MT, MT;

T M, M;

M (S), S;

M i, i.

Применение этой схемы к цепочке i+ii:

<Т+S,+TS>.

Следует обратить внимание, что в обоих случаях применяемые СУ-схемы были простыми.