Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






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






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

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

S®+Nï -Nï 0Fï 1Cï …ï 9Cï 0T

T®.D

N®1Cï …ï 9Cï 0T

C®0Fï …ï 9Fï 0Cï …ï 9Cï.D

D®0Dï …ï 9Dï 0Fï …ï 9F.

Для приведения грамматики к вполне детерминированной форме предварительно выполняется ее модификация: вводится предконечное состояние 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.5 – Граф состояний А-грамматики чисел с фиксированной точкой

 

Анализатор - это программа, позволяющая определить принадлежность цепочки языку, порождаемому некоторой грамматикой. Ниже приведена программа, анализирующая правильность написания чисел с фиксированной точкой (автомат Глини) на языке 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}

F: writeln(‘Число сформировано’);

X: =x*z;

E: writeln(‘Обнаружена ошибка’);

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

end {while};

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) Осуществляется добавление семантических правил в анализатор.

 


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.015 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал