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

1.5. Синтаксический анализ а-языков

Схема алгоритма и программа, анализирующая принадлежность цепочки заданному А-языку, строиться тривиально по графу состояний А-грамматики. Каждой вершине графа, кроме заключительной и “ошибочной”, соответствует блок выбора очередного символа анализируемой цепочки. Каждому ребру, точнее пометке ребра, блок анализа символа с последующим переходом к тому или иному блоку выбора. Каждому пути по графу соответствует путь по схеме и программе. Процесс построения анализатора рассмотрим на примере анализатора чисел с фиксированной точкой.

Числа с фиксированной точкой имеют целую и дробную частей и могут описываться, например, следующей автоматной грамматикой:

S+N-N0F1C…9C0T

T.D

N1C…9C0T

C0F…9F0C…9C.D

D0D…9D0F…9F

Граф состояний, соответствующий данной грамматике, показан на рис. 1.6.

Для приведения грамматики к вполне детерминированной форме предварительно выполняется ее модификация: вводится предконечное состояние F’,символ конца цепочки - , затем все правила вида: Aa заменяются на AaF’ и добавляется правило F’F.

Для обозначения ошибочного состояния вводится нетерминал - E.

Теорема: Для любой А-грамматики существует эквивалентная ей А-грамматика во вполне детерминированной форме.

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

Пусть имеется А-грамматика G=<S,VT,VN,R>. Эта грамматика приводится к модифицированной форме. В результате получим:VT=,…; VN=S,F',F,….

А-грамматика во вполне детерминированной форме из модифицированной строится следующим образом: 1.G=<VT,VN,<S>,R>, <S>=S,<F>=F, <F'>=F'

Если в исходной грамматике имеется правило вида: AaB, то в новой, построенной грамматике, будет правило:<A>a<B>.

Если в исходной грамматике имеются правила вида: AaB1…aBn, то в результирующей грамматике будет правило: <A>a<B1…Bn>.

Для появившихся новых нетерминалов добавляются правила вида: <B1…Bn>c<C1…Cn>, если в исходной грамматике имеются правила следующего вида:

B1cC1,….B1cCn. . .

BncC1,….BncCn..

При этом в новый нетерминал нетерминалы Ci включаются один раз. В результате такого построения для любого терминала а существует единственное правило вида: <…A…>a<…B…>.

Используя описанный алгоритм, приведем к вполне детерминированной формe А-грамматику чисел с фиксированной точкой:

<S>+<N>-<N> 0<FT>1<C>…9<C>

<T>.<D>

<N>1<C>…9<C>0<T>

<C>0<FC>.…9<FC>.<D>

<D>0<FD>…9<FD>

<F><F>

<FT><F>.<D>

<FC><F>0<FC>…9<FC>.<D>

<FD><F>0<FD>…9<FD>

Переобозначим нетерминалы следующим образом:

<S> - S, <N> - A, <FT> - B, <C> - C, <D> - D, <T> - G,

<FC> - H, <FD> - I.

Получим:

S+A-A0B1C..9C

A1C..9C0G

C0H..9H.D

G.D

D0I…9I

B.D;F

H0H…9H.D

I0I…9I;F Граф для полученной грамматики имеет вид:

Рис. 1.7

Анализатор- это программа, позволяющая определить принадлежность цепочки языку, порождаемому некоторой грамматикой. Ниже приведена программа, анализирующая правильность написания чисел с фиксированной точкой (автомат Глини) на языке Turbo Pascal.

Type Tsost: (S,A,B,C,D,G,H,I,F,E);

Var Sost : Tsost; (*Текущее соcтояние*)

St : String[255];(*Входная строка-цепочка символов языка*)

j : integer;(*Тек. номер позиции в строке*)

k : char;(*Тек. символ строки*)

x,z,q : real;(*x- число,z – знак, q- значение порядка дробной части числа*)

Begin

J:=1; sost:=S; read(st);

X:=0; z:=+1.; q:=0.1;

While((sost<>F) and(sost<>E)and(j<>length(st))) do

Begin

k:=st[j};

Inc(j);

Case sost of

S: case k of

-‘: begin

sost:=A;

z:=-1;

end;

+’: begin

sost:=A;

end;

0’: begin

sost:=B;

end;

1’..’9’: begin

sost:=C;

x:=x*10.+(ORD(k)-48)

{48=ORD(0)}

end;

else

begin writeln(‘Ошибка-ожидается знак или цифра’);

sost:=E;

end;

end;{case}

A: case k of

0’ : begin

sost:=G;

end;

1’..’9’ : begin

sost:=C;

x:=x*10.0+(ORD(k)-48);

end;

else begin writeln(‘Ошибка в целой части числа’);

sost:=E;

end:

end;{case}

B:case k of

.’ : begin

sost:=D;

end;

;’ : sost:=F;

else(*сообщение об ошибке и sost:=E*)

end;{case}

C: case k of

0’..’9’: begin

sost:=H;

x:=x*10.0+(ORD(k)-48);

end;

.’ : begin

Sost:=E;

еnd;

else begin writeln(‘Ошибка! Ожидается точка’);

sost:=E;

end;

end;{case}

G: if k=’.’ Then sost:=D

еlse begin writeln(‘Ошибка! Ожидается точка’);

sost:=E;

end;

H: case k of

0’..’9’ : begin

Sost:=H;

x:=x*10.+(ORD(k)-48);

end;

.’ : sost:=D;

else begin writeln(‘Ошибка! Ожидается точка или цифра’);

sost:=E;

end;

end;{case}

D: case k of

0’..’9’ : begin

sost:=I;

x:=x+(ORD(k)-48)*q; q:=q/10;

else begin writeln(‘Ошибка!’);

sost:=E;

end;

end;{case}

I: case k of

0’..’9’: begin

sost:=I;

x:=x+(ORD(k)-48)*q: q:=q/10:

end;

;’ : sost:=F;

else begin writeln(‘Ошибка!’);

sost:=E;

end;

end;{case}

end{case по состояниям};

end {while};

if sost=F then begin X:=x*z; writeln(‘Число сформировано’,x) ;end;

if sost=E then writeln(‘Обнаружена ошибка’);

end.

Семантикой для данного анализатора является значение числа.

Способы включения семантики:

1) применение функции Val(S:String; Var x; Var Code:Integer) (добавляется в состояние F);

2) последовательное формирование числа при переходе автомата в соответствующие состояния:

x:=0, z:=1, q:=0.1

x:=z*(x*10+(значение текущей цифры числа х))

x:=x+(значение текущей цифры числа х)*q, где x – формируемое число, z- знак числа, q – значение порядка текущей цифры дробной части числа.

Алгоритм построения анализатора:

1. Составляется автоматная грамматика.

2. Если полученная грамматика недетерминированная, то она приводится к вполне детерминированной форме.

3. По полученной грамматике строится граф состояний.

4. В соответствие с графом пишется программа.

5. Осуществляется добавление семантических правил в анализатор.

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