Скачиваний:
21
Добавлен:
02.05.2014
Размер:
124.93 Кб
Скачать

Министерство образования РФ

Уфимский Государственный Авиационный Технический Университет

Кафедра ТК

Лабораторная работа №2

“ Проектирование лексического анализатора ”

Выполнил: ст.гр УТС-412

Ковалев Е.Н.

Проверил: доцент кафедры ТК

Карамзина А.Г.

Уфа 2007

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

Вариант 1: входной язык содержит арифметические выражения, разделенные символом ‘;’. Арифметические выражения состоят из идентификаторов, десятичных чисел с плавающей точкой (в обычной и логарифмической форме), знака присваивания (:=), знаков операций (+, – ,*, /) и круглых скобок.

КС-грамматика входного языка в форме Бэкуса-Наура:

Условные обозначения:

x1 – все символы кроме «^»

x2 – все символы кроме: 0..9, a..z, ^

х3 – все символы кроме: =

x4 – все символы кроме: 0..9, е, ^ , .

x5 – все символы кроме: ^ , .

х6 – все символы кроме: 0..9

х7 – все символы кроме: +, –

х8 – все символы кроме: 0..9, е, ^

х9 – все символы кроме: .

х10– все символы кроме: 0..9, ^

x11 – символы a..z

x12 – символы 0..9

x13 – символы 1..9

x14 – символы a..z,0..9

х15 – все символы

^-знак пробела

G({0..9, a..z, ; , : , ^ , +, –, /, *, (, ), .}, {S, F, T, I, P1, P2, Z, C1, D1, D2, D3, L1, L2, L3, L4, L5, L6, E},P,S)

P:

F®(|)

T®;

I®x11|Ix14

P1®:

P2®P1=

Z®+|–|*|/

C1®x13|C1x12

D1®0

D2®D1.|C1.

D3®D2x12|D3x12

L1®C1e|D3e

L2®Ll+|L1–

L3®L20

L4®L2x13

L5®L3.|L4.

L6®L5x12|L6x12

S®F^|T^|I^|P2^|Z^|C1^|D1^|D3^|L4^|L6^

E®Fx1|Tx1|P2x1|Ix2|P1x3|Zx2|C1x4|D1x5|D2x6|D3x8|L1x7|L2x6|L3x9|L4x5|L5x6|L6x10|Ex15

Граф переходов КА

Результаты работы программы:

Cодержимое исходного файла:

Таблица лексем:

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

Листинг программы:

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, ComCtrls, Grids;

type

TAutoState = (AUTO_H,AUTO_F,AUTO_T,AUTO_I,AUTO_P1,AUTO_P2,AUTO_Z,AUTO_C1,AUTO_D1,

AUTO_D2,AUTO_D3,AUTO_L1,AUTO_L2,AUTO_L3,AUTO_L4,AUTO_L5,AUTO_E,AUTO_L6);

TForm1 = class(TForm)

PageControl1: TPageControl;

TabSheet1: TTabSheet;

Button2: TButton;

Memo1: TMemo;

TabSheet2: TTabSheet;

Memo2: TMemo;

OpenDialog1: TOpenDialog;

StringGrid1: TStringGrid;

Button1: TButton;

Button4: TButton;

Label1: TLabel;

procedure FormCreate(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure Button4Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);

begin

Memo1.Text:='';

Memo2.Text:='';

StringGrid1.Cells[0,0]:='Номер';

StringGrid1.Cells[1,0]:='Значение';

StringGrid1.Cells[2,0]:='Лексема';

end;

procedure TForm1.Button2Click(Sender: TObject);

var ind,pos,dl,i,j,i1,fl,zn:integer;

st,str,sInput:string;

iState:TAutoState;

begin

if OpenDialog1.Execute then Memo1.Lines.LoadFromFile(OpenDialog1.FileName) ;

for i:=0 to 2 do

for j:=1 to 999 do

StringGrid1.Cells[i,j]:=' ';

j:=Memo1.Lines.Count;

ind:=1;

pos:=1;

for i:=1 to j do

begin

str:='';

sInput:=Memo1.Lines[i-1];

sInput:=sInput+' ';

dl:=Length(sInput);

iState:=AUTO_H;

fl:=0;

zn:=0;

for j:=1 to dl do

begin

st:=sInput[j];

case iState of

AUTO_H:

case sInput[j] of

'(',')': begin iState:=AUTO_F;str:=str+st; end;

';': begin iState:=AUTO_T;str:=str+st; end;

'a'..'z': begin iState:=AUTO_I;str:=str+st; end;

':': begin iState:=AUTO_P1;str:=str+st; end;

'+','-','*','/':begin iState:=AUTO_Z;str:=str+st; end;

'1'..'9': begin iState:=AUTO_C1;str:=str+st; end;

'0': begin iState:=AUTO_D1;str:=str+st; end;

' ': begin iState:=AUTO_H;str:='';end;

else begin iState:= AUTO_E;str:=str+st; end;

end;

AUTO_F:

case sInput[j] of

' ': begin iState:=AUTO_H;fl:=1;zn:=1;end;

else begin iState:=AUTO_E;str:=str+st; end;

end;

AUTO_T:

case sInput[j] of

' ':begin iState:=AUTO_H;fl:=1;zn:=8; end;

else begin iState:=AUTO_E;str:=str+st; end;

end;

AUTO_I:

case sInput[j] of

' ': begin iState:=AUTO_H;fl:=1;zn:=2;end;

'a'..'z','0'..'9':begin iState:=AUTO_I;str:=str+st; end;

else begin iState:=AUTO_E; str:=str+st; end;

end;

AUTO_P1:

case sInput[j] of

'=':begin iState:=AUTO_P2;str:=str+st;end;

else begin iState:=AUTO_E;str:=str+st; end;

end;

AUTO_P2:

case sInput[j] of

' ':begin iState:=AUTO_H;fl:=1;zn:=3;end;

else begin iState:=AUTO_E;str:=str+st; end;

end;

AUTO_Z:

case sInput[j] of

' ': begin iState:=AUTO_H;fl:=1;zn:=4;end;

else begin iState:=AUTO_E;str:=str+st; end;

end;

AUTO_C1:

case sInput[j] of

' ': begin iState:=AUTO_H;fl:=1;zn:=5;end;

'0'..'9':begin iState:=AUTO_C1;str:=str+st; end;

'e':begin iState:=AUTO_L1;str:=str+st; end;

'.':begin iState:=AUTO_D2;str:=str+st; end;

else begin iState:=AUTO_E; str:=str+st; end;

end;

AUTO_D1:

case sInput[j] of

' ': begin iState:=AUTO_H;fl:=1;zn:=6; end;

'.': begin iState:=AUTO_D2;str:=str+st; end;

else begin iState:=AUTO_E;str:=str+st; end;

end;

AUTO_D2:

case sInput[j] of

'0'..'9': begin iState:=AUTO_D3;str:=str+st; end;

else begin iState:=AUTO_E;str:=str+st; end;

end;

AUTO_D3:

case sInput[j] of

' ': begin iState:=AUTO_H;fl:=1;zn:=7; end;

'e':begin iState:=AUTO_L1;str:=str+st; end;

'0'..'9': begin iState:=AUTO_D3;str:=str+st; end;

else begin iState:=AUTO_E;str:=str+st; end;

end;

AUTO_L1:

case sInput[j] of

'+','-':begin iState:=AUTO_L2;str:=str+st; end;

else begin iState:=AUTO_E;str:=str+st; end;

end;

AUTO_L2:

case sInput[j] of

'0':begin iState:=AUTO_L3;str:=str+st;end;

'1'..'9': begin iState:=AUTO_L4;str:=str+st; end;

else begin iState:=AUTO_E;str:=str+st; end;

end;

AUTO_L3:

case sInput[j] of

'.':begin iState:=AUTO_L5;str:=str+st; end;

else begin iState:=AUTO_E;str:=str+st; end;

end;

AUTO_L4:

case sInput[j] of

' ':begin iState:=AUTO_H;fl:=1;zn:=9;end;

'.':begin iState:=AUTO_L5;str:=str+st; end;

else begin iState:=AUTO_E;str:=str+st; end;

end;

AUTO_L5:

case sInput[j] of

'0'..'9':begin iState:=AUTO_L6;str:=str+st; end;

else begin iState:=AUTO_E;str:=str+st; end;

end;

AUTO_L6:

case sInput[j] of

' ':begin iState:=AUTO_H;fl:=1;zn:=10;end;

'0'..'9':begin iState:=AUTO_L6;str:=str+st; end;

else begin iState:=AUTO_E;str:=str+st; end;

end;

AUTO_E: begin

if sInput[j]<>' 'then

begin

iState:=AUTO_E;

str:=str+st;

end

else

begin

iState:=AUTO_H;

Memo2.Lines.Append(str);

str:='';

end;

end;

end;

if fl=1 then

begin

StringGrid1.Cells[0,ind]:=IntToStr(ind);

StringGrid1.Cells[1,ind]:=str;

case zn of

1: StringGrid1.Cells[2,ind]:='Круглая скобка';

2: StringGrid1.Cells[2,ind]:='Идентификатор';

3: StringGrid1.Cells[2,ind]:='Оператор присваивания';

4: StringGrid1.Cells[2,ind]:='Арифметическая операция';

5, 6: StringGrid1.Cells[2,ind]:='Целое число';

7: StringGrid1.Cells[2,ind]:='Дробное число';

8: StringGrid1.Cells[2,ind]:='Разделитель';

9: StringGrid1.Cells[2,ind]:='Логарифмическое число с целой степеью';

10: StringGrid1.Cells[2,ind]:='Логарифмическое число с дробной степеью';

end;

str:='';

ind:=ind+1;

fl:=0;

end;

end;

end;

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

close;

end;

procedure TForm1.Button4Click(Sender: TObject);

begin

close;

end;

end.

Соседние файлы в папке Курсовая по СПО ГОТОВАЯ 33