Курсовые проекты / курса не мои / Юджен / Курсовая по СПО ГОТОВАЯ 33 / отчёт3
.docМинистерство образования РФ
Уфимский Государственный Авиационный Технический Университет
Кафедра ТК
Лабораторная работа №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.