Logo GenDocs.ru

Поиск по сайту:  


Загрузка...

Разработка языка программирования и компилятора для него - файл 1.doc


Разработка языка программирования и компилятора для него
скачать (218 kb.)

Доступные файлы (1):

1.doc218kb.18.12.2011 17:15скачать

содержание
Загрузка...

1.doc

Реклама MarketGid:
Загрузка...
СОДЕРЖАНИЕ:


1.

Техническое задание

3

2.

Введение

5

3.

Описание программы

6

4.

Текст программы

8

5.

Пример работы программы

28

6.

Вывод

29


^ ТЕХНИЧЕСКОЕ ЗАДАНИЕ.
Введение

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

Задание на курсовую работу.
Требования к программе

Целью данной курсовой работы является создание однопроходного компилятора, выполняющего сканирование исходного текста пользователя и преобразование в файл ассемблера, пригодной для компилирования в исполняемый файл.

Язык должен включать в себя следующие возможности:

  • простые типы данных (Integer, Boolean, Char);

  • структурные типы (одномерный и двумерный массивы простых значений);

  • операторы:

1. Оператор ввода.

2. Оператор присваивания.

3. Оператор вывода.

4. Оператора цикла (while).

5. Оператор выбора.

Операторы в программе должны разделяться символом “;” . Предусмотрены сообщения об ошибках на этапе компиляции и на этапе исполнения (Ошибка выхода индекса массива за пределы заданных значений и ошибка ввода некорректного числового значения).

Язык описывается следующими правилами продукции в форме Бэкуса-Науэра:

G[P]

^ PROG ::= PEREMENNIE; BLOK;

PEREMENNIE ::= <var> {I:<type>}

BLOK ::= <begin> {OPERATOR;} <end>

OPERATOR ::= REA | WRIT | BLOK | CICLEW | KONDIF | P | CICLER | CICLEF

KONDIF ::= <if> EXPR Z EXPR <then> OP [ <else> OPERATOR ]

CICLEW ::= <while> EXPR Z EXPR <do> OPERATOR

CICLER ::= <repeat> OPERATOR <until>

CICLEF::= <for> CIVE <to> I <do> OPERATOR

WRIT ::= <write> <(> EXPR <)>

REA ::= <read> <(> I <)>

CIVE ::= I<:=> EXPR

EXPR ::= T {+ T | - T }

T ::= F {* F | / F }

F ::= I | ( EXPR )

Z ::= ‘>’ | ‘<’ | ‘=’ | ‘>=’ | ‘<>’ | ‘<=’

I ::= 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0
^ Требование к надёжности.

Реакция на ошибки, возникающие при компиляции неправильного исходного текста.
Условия эксплуатации.

Исправная работа ЭВМ. Для нормальной эксплуатации данного программного продукта необходим оператор, ознакомленный с правилами разработанного языка.


^

Используемые технические и информационные средства.


Данная программа предназначена для выполнения на IBM – совместимых компьютерах под управлением операционной системы MS - Windows 98/XP/NT/ME/2000.

Минимальные системные требования: Pentium 166 MMX, 64Mb RAM, 20Mb HDD.





Введение



Место компилятора в программном обеспечении

Компиляторы составляют существенную часть программного обеспечения ЭВМ. Это связано с тем, что языки высокого уровня стали основным средством разработки программ. Только очень незначительная часть программного обеспечения, требующая особой эффективности, программируется с помощью ассемблеров. В настоящее время распространено довольно много языков программирования. Наряду с традиционными языками, такими, как Фортран, широкое распространение получили так называемые "универсальные языки" (Паскаль, Си, Модула-2, Ада и другие), а также некоторые специализированные (например, язык обработки списочных структур Лисп). Кроме того, большое распространение получили языки, связанные с узкими предметными областями, такие, как входные языки пакетов прикладных программ.
Структура компилятора

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

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

^

Лексический анализ


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

^

Генерация кода


Задача генератора кода - построение эквивалентной машинной программы по программе на входном языке. Обычно в качестве входного для генератора кода служит некоторое промежуточное представление программы. В свою очередь, генерация кода состоит из ряда специфических, относительно независимых подзадач: распределение памяти (в частности, распределение регистров), выбор команд, генерация объектного (или загрузочного) модуля. Конечно, независимость этих подзадач относительна: например, при выборе команд нельзя не учитывать схему распределения памяти, и, наоборот, схема распределения памяти (регистров, в частности) необходимо ведет к генерации той или иной последовательности команд. Однако удобно и практично эти задачи все же разделять и при этом особо обращать внимание на их взаимодействие.

^ ОПИСАНИЕ ПРОГРАММЫ
Общие сведения.

Программа является однопроходным компилятором. Данная программа предназначена для выполнения на IBM – совместимых компьютерах под управлением операционной системы MS - Windows 98/XP/NT/ME/2000. Компилятор написан в среде программирования Delphi 7.
^ Основные процедуры и функции
Процедура CHETAT – сканер - предназначена для выявления во входном тексте ключевых слов, чисел, разделителей, идентификаторов.

Процедура PROG – осуществляет синтаксический разбор результата разбора сканера.

Процедуры, описывающие структуры

^ Процедура PEREMENNIE - var

Процедура BLOK – begin/end

Процедура OPERATOR – выбор операции

Процедура CICLEW – цикл While

Процедура REA - Read

Процедура WRITE - Write

Процедура KONDIF – Условие IF

Процедура CIVE - присваивание

Процедура EXPR – Описание выражения

^

Используемые технические средства.


Данная программа предназначена для выполнения на IBM – совместимых компьютерах под управлением операционной системы MS - Windows 98/XP/NT/ME/2000.

Минимальные системные требования: Pentium 166 MMX, 128Mb RAM, SVGA 2Mb.
^ Вызов и загрузка.

Программа вызывается при запуске файла Comp.exe.

Входные данные.

Входными данными является текстовый файл, содержащий код программы на разработанном языке.

^ Выходные данные.

Выходными данными является текстовый файл, содержащий код программы на языке ассемблера.

Руководство пользователю:

Для работы данной программы необходимо чтобы в папке с EXE файлом находилась папка Prog, которая содержит файл с именем Fail и расширение TXT.

Данный файл должен содержать исходный текс программы. После запуска программы COMP.exe будет произведено сканирование файла. Программа выделит литералы, идентификаторы, реальные и целые числа, разделители и служебные слова выведя на экран таблицы литералы, идентификаторы, реальные и целые числа, и общий выходной поток. После создания таблиц программа проводит семантический и синтаксический анализы данного языка грамматики.

^ Листинг Программы

unit Unit1;
interface
uses

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

Dialogs, StdCtrls;
type

PtrRec=^Rec;

Rec=Record

Element:string;

pNext:PtrRec;

end;
Vxod_pot=^Recc;

Recc=record

Inf1,Inf2:string;

Inf3:integer;

pNextt:Vxod_pot;

end;
Iden_Tip=^Res;

Res=Record

Tip,Iden:string;

pSled:Iden_Tip;

end;

ff=file of char;

fd=TextFile;

mas=array [1..1] of char;

TForm1 = class(TForm)

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Label5: TLabel;

Label6: TLabel;

Label7: TLabel;

Label8: TLabel;

Label9: TLabel;

Label10: TLabel;

Label11: TLabel;

procedure FormCreate(Sender: TObject);

private

{ Private declarations }

Procedure Next();

Procedure error();

Procedure Prog();

Procedure Blok();

Function Operator():boolean;

Function elem():string;

Procedure Cive(); //Присваивание

Procedure Peremennie(); //Разбор переменных

Function Expr():boolean; //выражение

Procedure CicleW(); //цикл While

Procedure CicleF(); //цикл For

Procedure CicleR();

Function Cond():boolean;

Procedure CondIF();

Procedure Rea();

Procedure Writ();

Function InTabl():boolean;

Procedure OprTipa();

public

{ Public declarations }

end;
var

pBeginn,pEndd,pAdd,pnl,pe:Vxod_pot;

Nach,Kon,Ser,Ser_Tip:Iden_Tip;

pRb,pRe,pRa:PtrRec;

pCb,pCe,pCa:PtrRec;

pLb,pLe,pLa:PtrRec;

pIb,pIe,pIa:PtrRec;

a:^mas;

Raz:array [1..15] of char=(')', '(', '*', '+', ',', '-', '.', '/', '[', ']', ':', ';', '<', '>', '=' );

Razd:array [16..20] of string=('<>', ':=', '>=', '<=','..');

slo:array[1..35] of string =('PROGRAM','DATE','VAR','PROCEDURE','FUNCTION','BEGIN','END',

^ 'FOR','TO','DO','WHILE','REPEAT','UNTIL', 'CASE','OF',

'IF','THEN','ELSE','AND','OR','XOR','NOT','IN',

'INTEGER','REAL', 'BOOLEAN','CHAR','STRING','ARRAY',

'FALSE','TRUE','WRITE','WRITELN','READ','READLN');

f:ff;

fa:fd;

p,n,m,j,pp,u,h,mm:integer;

se:string;

k,Ns:byte;

s:char;

flag,fl,gag,fo:byte;

flagstop,Vft:Boolean;

ss,tip:string;

Form1: TForm1;
implementation
{$R *.dfm}

{-------=======-------}

Procedure Creat_Queue(Var pBegin,pEnd,pAux:PtrRec; s:string);

Begin

New(pBegin);

pBegin^.pNext:=nil;

pBegin^.Element:=s;

pEnd:=pBegin;

end;

{-------=======-------}

Procedure Add_Queue(Var pBegin,pEnd,pAux:PtrRec; s:string);

Begin

New(pAux);

pAux^.pNext:=nil;

pAux^.Element:=s;

pEnd^.pNext:=pAux;

pEnd:=pAux;

End;

{-------=======-------}

Procedure Creat_Queue_Vxod_pot();

Begin

New(pBeginn);

pBeginn^.pNextt:=nil;

pEndd:=pBeginn;

end;

{-------=======-------}

Procedure Add_Queue_Vxod_pot(s1,s2:string;s3:integer);

Begin

New(pAdd);

pAdd^.pNextt:=nil;

pAdd^.Inf1:=s1;

pAdd^.Inf2:=s2;

pAdd^.Inf3:=s3;

pEndd^.pNextt:=pAdd;

pEndd:=pAdd;

End;

{-------=======-------}

Procedure Soz_tip();

Begin

New(Nach);

Ser_Tip:=Nach;

Nach^.pSled:=nil;

Nach^.Tip:='';

Nach^.Iden:='';

Kon:=Nach;

end;

{-------=======-------}

Procedure Dob_Tip(s1,s2:string);

Begin

New(Ser);

Ser^.pSled:=nil;

Ser^.Tip:=s2;

Ser^.Iden:=s1;

Kon^.pSled:=Ser;

Kon:=Ser;

End;

{-------=======-------}

Procedure Srav_Iden (s:string);

Begin

Ser:=Nach;

While Ser^.pSled<>Nil do

Begin

if Ser^.Iden=s then

Form1.error

else

Ser:=Ser^.pSled;

end;

if Ser^.Iden=s then

Form1.error;

Dob_Tip(s,'');

end;

{-------=======-------}

Procedure Srav (Var pBegin,pEnd,pAux:PtrRec; s:string);

Begin

fo:=1;

pAux:=pBegin;

While pAux^.pNext<>Nil do

Begin

if pAux^.element=s then

begin

fo:=0;

break;

end

else

pAux:=pAux^.pNext;

end;

if pAux^.element=s then fo:=0;

if fo=1 then

Add_Queue(pBegin,pEnd,pAux,s);

end;

{-------=======-------}

Procedure Vivodd();

begin

ss:='';

pAdd:=pBeginn;

pBeginn:=pBeginn^.pNextt;

dispose(pAdd);

pAdd:=pBeginn;

While pAdd^.pNextt<>Nil do

Begin

ss:=ss+pAdd^.Inf1+' '+pAdd^.Inf2+' '+IntToStr(pAdd^.Inf3)+#13;

pAdd:=pAdd^.pNextt;

end;

ss:=ss+pAdd^.Inf1+' '+pAdd^.Inf2+' '+IntToStr(pAdd^.Inf3)+#13;

end;

{-------=======-------}

Procedure Vivod(Var pBegin,pEnd,pAux:PtrRec);

begin

ss:='';

pAux:=pBegin;

pBegin:=pBegin^.pNext;

dispose(pAux);

pAux:=pBegin;

If pBegin<>Nil then

Begin

While pAux^.pNext<>Nil do

Begin

ss:=ss+pAux^.Element+#13;

pAux:=pAux^.pNext;

end;

ss:=ss+pAux^.Element+#13;

end;

end;

{-------=======-------}

Procedure Vivod_Identif();

begin

ss:='';

Ser:=Nach;

Nach:=Nach^.pSled;

dispose(Ser);

Ser:=Nach;

If Nach<>Nil then

Begin

While Ser^.pSled<>Nil do

Begin

ss:=ss+ser^.Iden+' '+ser^.Tip+#13;

Ser:=Ser^.pSled;

end;

ss:=ss+ser^.Iden+' '+ser^.Tip+#13;

end;

end;

{-------=======-------}

Procedure Dobavlenie_Tipov(s:string);

Begin

While Ser_Tip^.pSled<>Nil do

Begin

Ser_Tip:=Ser_Tip^.pSled;

Ser_Tip^.Tip:=s;

end;

Ser_Tip^.Tip:=s;

end;

{-------=======-------}

procedure Chetat ();

begin

assign (f,'LOL\fail.txt');

reset(f);

p:=filesize(f);

getmem(a,p*sizeof(char));

p:=1;

while not Eof(f) do

begin

read(f,s);

a^[p]:=s;

inc(p);

end;

close(f);

k:=1;

pp:=1;

n:=1;

j:=1;

mm:=1;

Ns:=1;

while n<>p do

Begin

case k of

1:Begin

se:='';

If a^[n]=#39 then

Begin

while a^[n+1]<>#39 do

Begin

se:=se+a^[n+1];

inc(n);

end;

inc(n,2);

Srav (pLb,pLe,pLa,se);

Add_Queue_Vxod_pot('$L',se,ns);

end

else

If a^[n]='{' then k:=2

else

If (a^[n]=#13) or (a^[n]=#10) or (a^[n]=' ') then k:=3

else

If (a^[n] in ['0'..'9']) then k:=4

else

If (a^[n] in ['a'..'z']) or (a^[n] in ['A'..'Z']) then K:=5

else

If (a^[n] in [#40..#47]) or (a^[n] in [#58..#62]) or (a^[n]=#91) or (a^[n]=#93) then k:=6;

end;

2:Begin

while a^[n+1]<>'}' do

inc(n);

inc(n,2);

k:=1;

end;

3: Begin

If a^[n]=#10 then

Inc(ns);

inc(n);

k:=1;

end;

4:begin

gag:=0;

fl:=0;

se:='';

while (a^[n]in['0'..'9']) or (a^[n]='.') do

begin

if (a^[n]='.') and (a^[n+1]='.') then

begin

inc(n,2);

gag:=1;

break;

end

else

Begin

if (a^[n]='.') and (a^[n+1]in['0'..'9']) then fl:=1;

se:=se+a^[n];

inc(n);

end;

end;

if fl=0

then

Begin

Srav (pCb,pCe,pCa,se);

Add_Queue_Vxod_pot('$C',se,ns);

end

else

Begin

Srav (pRb,pRe,pRa,se);

Add_Queue_Vxod_pot('$R',se,ns);

end;

if gag=1 then

Add_Queue_Vxod_pot('$D','..',ns);

k:=1;

end;

5:Begin

se:='';

gag:=0;

while ((a^[n]<>' ') and (not(a^[n] in [#40..#47])) and (not(a^[n] in [#58..#62])) and (a^[n]<>#91) and (a^[n]<>#93) and (a^[n]<>#10) and (a^[n]<>#13)) do

^ Begin

se:=se+upcase(a^[n]);

inc(n);

end;

Flag:=0;

For u:=1 to 35 do

If se=slo[u] then

Begin

Flag:=1;

break;

end;

If flag=1 then Add_Queue_Vxod_pot('$W',se,ns);

If flag=0 then

Begin

Add_Queue_Vxod_pot('$I',se,ns);

end;

k:=1;

end;

6:Begin

ss:='';

ss:=a^[n]+a^[n+1];

m:=16;

while (ss<>Razd[m]) and (m<=20) do

inc(m);

If m=21 then

Begin

m:=1;

While a^[n]<>Raz[m] do

inc(m);

Add_Queue_Vxod_pot('$D',Raz[m],ns);

inc(n);

end

else

Begin

Add_Queue_Vxod_pot('$D',Razd[m],ns);

inc(n,2);

end;

k:=1;

end;

End;

End;

freemem(a,p*sizeof(char)); ShowMessage('Скан закончился');

form1.Prog();

ShowMessage('Рекурсия закончилась');

end;


{==============--------------=======--------------==============

-------синтаксический анализ-------

==============--------------=======--------------==============}


Procedure TForm1.Prog();

Begin

pe:=pBeginn;

pe:=pe^.pNextt;

if Form1.elem() <>'PROGRAM' then

Form1.error();

Form1.Next();

if Form1.elem<>'$I' then

Form1.error();

Form1.Next();

if Form1.elem<>';' then

Form1.error();

Form1.Next();

if Form1.elem='VAR' then

Form1.Peremennie;

if Form1.elem='BEGIN' then

Form1.Blok();

if Form1.elem<>'.' then

Form1.error();

End;
{-------=======-------}
Procedure TForm1.Blok(); //Разбор Begin...End

Begin

Form1.Next;

While Form1.elem<>'END' do

Begin

if Not Form1.Operator() then

Form1.error();

if Form1.elem<>';' then

Form1.error();

Form1.Next();

End;

if Form1.elem<>'END' then

Form1.error();

Form1.Next();

End;
{-------=======-------}
Function TForm1.Operator():boolean; // Разбор операторов

Begin

Result:=false;

if Form1.elem='BEGIN' then

Form1.Blok()

else

if Form1.elem='FOR' then

Form1.CicleF()

else

if Form1.elem='WHILE' then

Form1.CicleW()

else

if Form1.elem='REPEAT' then

Form1.CicleR()

else

if Form1.elem='$I' then

Form1.Cive()

else

if Form1.elem='IF' then

Form1.CondIF()

else

if (Form1.elem='READLN') or (Form1.elem='READ') then

Form1.Rea()

else

if (Form1.elem='WRITELN') or (Form1.elem='WRITE') then

Form1.Writ()

else

Form1.error();

Result:=true;

End;
{-------=======-------}
Procedure TForm1.Cive(); //Присваивание

Begin

if not Form1.InTabl() then

Form1.error;

Vft:=false;

Form1.OprTipa;

Form1.Next();

if Form1.elem<>':=' then

Form1.error();

Form1.Next();

if Not Form1.Expr() then

Form1.error();

Vft:=false;

End;

{-------=======-------}
Procedure TForm1.Peremennie; //Разбор переменных Var

Var

flagarray:byte;

Begin

Form1.Next();

While Form1.elem<>'BEGIN' do

Begin

While Form1.elem <>':' do

Begin

if Form1.elem <>'$I' then

Form1.error();

Srav_Iden(pe^.Inf2);

Form1.Next();

if Form1.elem=',' then

Form1.Next()

else

if Form1.elem<>':' then

Form1.error();

End;

flagarray:=0;

Form1.Next();

if (Form1.elem <>'INTEGER') and (Form1.elem<>'CHAR') and (Form1.elem<>'BOOLEAN') and (Form1.elem<>'REAL') and (Form1.elem<>'STRING') and (Form1.elem<>'DATE') then

if Form1.elem<>'ARRAY' then

Form1.error()

else

begin

Form1.Next();

if Form1.elem<>'[' then

Form1.error();

Form1.Next();

if Form1.elem<>'$C' then

Form1.error();

Form1.Next();

if Form1.elem<>'..' then

Form1.error();

Form1.Next();

if Form1.elem<>'$C' then

Form1.error();

Form1.Next();

if Form1.elem<>']' then

Form1.error();

Form1.Next();

if Form1.elem <>'OF' then

Form1.error();

Form1.Next();

flagarray:=1;

if (Form1.elem<>'INTEGER') and (Form1.elem<>'CHAR') and (Form1.elem<>'BOOLEAN') and (Form1.elem<>'REAL') and (Form1.elem<>'STRING') and (Form1.elem<>'DATE') then

Form1.error();

end;

If flagarray=0 then Dobavlenie_Tipov(pe^.Inf2)

else

Dobavlenie_Tipov('MAS'+pe^.Inf2);

Form1.Next();

if Form1.elem()<>';' then

Form1.error();

Form1.Next;

if (Form1.elem<>'BEGIN') and (Form1.elem<>'$I') then

Form1.error();

End;

End;
{-------=======-------}
Function TForm1.Expr():boolean; //выражение

Begin

Result:=false;

if (Form1.elem='$I') or (Form1.elem='$C') or (Form1.elem='$R') or (Form1.elem='$L')or (Form1.elem='FALSE')or (Form1.elem='TRUE') then

begin

OprTipa();

Form1.Next();

end

else

if Form1.elem='(' then

begin

Form1.Next();

if Not Form1.Expr() then

Form1.error();

if Form1.elem<> ')' then

Form1.Next();

Form1.error();

end

else

Form1.error();

if (Form1.elem='+') or (Form1.elem='-') or (Form1.elem='/') or (Form1.elem='*') then

Begin

OprTipa();

Form1.Next();

if Not Form1.Expr() then

Form1.error();

end;

Result:=True;

End;
{-------=======-------}
Procedure TForm1.CicleW(); //цикл While

Begin

if Not Form1.Cond() then

Form1.error();

if Form1.elem<> 'DO' then

Form1.error();

Form1.Next();

if Not Form1.Operator() then

Form1.error();

End;
{-------=======-------}
Procedure TForm1.CicleR(); //цикл Repeat

Begin

Form1.Next();

While Form1.elem<> 'UNTIL' do

Begin

Form1.Operator;

Form1.Next();

end;

if Not Form1.Cond() then

Form1.error();

End;
{-------=======-------}
Function TForm1.Cond():boolean;

Begin

Result:=false;

Form1.Next();

if Form1.elem='$I' then

Begin

Form1.OprTipa;

if tip<>'BOOLEAN' then

Form1.Next();

if (Form1.elem<>'>') and (Form1.elem<>'<') and (Form1.elem<>'=') and (Form1.elem<>'<>') and (Form1.elem<>'>=') and (Form1.elem<>'<=') and (Tip<>'BOOLEAN')then

Form1.error();

If tip<>'BOOLEAN' then

Form1.Next();

if (Form1.elem<>'$C') and (Form1.elem<>'$R') and (Form1.elem<>'$L') and (Form1.elem<>'$I') and (Tip<>'BOOLEAN') then

Form1.error();

Form1.OprTipa;

Form1.Next();

End

else

if Form1.elem='NOT' then

Begin

if Not Form1.Cond() then

Form1.error();

End

else

if Form1.elem='(' then

begin

Vft:=false;

if Not Form1.Cond() then

Form1.error();

if Form1.elem<> ')' then

Form1.error();

Vft:=false;

Form1.Next();

end

else

Form1.error();

if (Form1.elem='AND') or (Form1.elem='OR') then

Begin

Vft:=false;

if Not Form1.Cond() then

Form1.error();

Vft:=false;

End;

Result:=true;

End;
{-------=======-------}
Procedure TForm1.CondIF(); // Условие If

Begin

if Not Form1.Cond() then

Form1.error();

if Form1.elem<>'THEN' then

Form1.error();

Form1.Next();

if Not Form1.Operator then

Form1.error();

if Form1.elem='ELSE' then

Begin

Form1.Next();

if Not Form1.Operator then

Form1.error();

End;

End;
{-------=======-------}
Procedure TForm1.CicleF(); //цикл For

Begin

Form1.Next();

if Form1.elem<>'$I' then

Form1.error();

Form1.Cive();

if Form1.elem<>'TO' then

Form1.error();

Form1.Next();

if Not Form1.Expr then

Form1.error();

if Form1.elem<>'DO' then

Form1.error();

Form1.Next();

if Not Form1.Operator then

Form1.error();

End;
{-------=======-------}
Procedure TForm1.Writ(); //Оператор ввода

Begin

Form1.Next();

if Form1.elem<>'(' then

Form1.error();

Form1.Next();

While Form1.elem<>')' do

Begin

if Not Form1.Expr() then

Form1.error();

if (Form1.elem<>',') and (Form1.elem<>')') then

Form1.error();

if (Form1.elem=',') then

Form1.Next();

End;

Form1.Next();

End;
{-------=======-------}
Procedure TForm1.Rea(); //Оператор вывода

Begin

Form1.Next();

if Form1.elem<>'(' then

Form1.error();

Form1.Next();

While Form1.elem<>')' do

Begin

if Form1.elem<>'$I' then

Form1.error();

Form1.Next();

if (Form1.elem<>',') and (Form1.elem<>')') then

Form1.error();

if (Form1.elem=',') then

Form1.Next();

End;

Form1.Next();

End;
{-------=======-------}
Procedure TForm1.Next(); // Переход к следующиму

Begin

if pe^.pNextt=Nil then

flagstop:=true

else

pe:=pe^.pNextt;

End;
{-------=======-------}
Function TForm1.elem():string;

Begin

if pe<>Nil then

Begin

if (pe^.Inf1='$D') or (pe^.Inf1='$W') then

Result:=pe^.Inf2

else

Result:=pe^.Inf1;

Ns:=pe.Inf3;

End;

End;
{-------=======-------}
Procedure TForm1.error(); //Ошибка

Begin

ShowMessage('Ошибка в '+IntToStr(Ns)+' строке!!!');

Exit;

End;
{==============--------------=======--------------==============

-------синтаксический анализ-------

==============--------------=======--------------==============}
{==============--------------=======--------------==============

-------симантический анализ--------

==============--------------=======--------------==============}
Procedure OprTipMas();

begin

Form1.Next();

If Form1.elem<>'[' then

Form1.error();

Form1.Next();

if (Form1.elem<>'$I') and (Form1.elem<>'$C') then

Form1.error();

if Form1.elem='$I' then

Begin

if Not form1.InTabl then

Form1.error();

if Ser^.Tip<>'INTEGER' then

Form1.error();

End;

Form1.Next();

If Form1.elem<>']' then

Form1.error();

end;

{-------=======-------}

Procedure RazborDate();

Begin

if Length(pe.Inf2)<>10 then

Form1.error;

if not (StrToInt(pe^.Inf2[1]+pe^.Inf2[2]) in [1..31]) then

Form1.error;

if pe^.Inf2[3] <>'.' then

Form1.error;

if not (StrToInt(pe^.Inf2[4]+pe^.Inf2[5]) in [01,02,03,04,05,06,07,08,09,10,11,12]) then

Form1.error;

if pe^.Inf2[6]<>'.' then

Form1.error;

if not (pe^.Inf2[7] in ['0'..'9']) then

Form1.error;

if not (pe^.Inf2[8] in ['0'..'9']) then

Form1.error;

if not (pe^.Inf2[9] in ['0'..'9']) then

Form1.error;

if not (pe^.Inf2[10] in ['0'..'9']) then

Form1.error;

end;

Function TForm1.InTabl():boolean;

Begin

Result:=false;

Ser:=Nach;

While Ser^.pSled<>Nil do

If (Ser^.Iden=pe^.Inf2) then

Begin

Result:=true;

Break;

end

else

Ser:=Ser^.pSled;

If (Ser^.Iden=pe^.Inf2) then

Result:=true;

End;

{--------==========-----------}

Procedure TForm1.OprTipa;

Begin

If Vft=true then

Begin

if tip='INTEGER' then

Begin

if Form1.elem='$I' then

Begin

if Not Form1.InTabl then

Form1.error;

if (Tip<>Ser^.Tip) and (Ser^.Tip<>'MASINTEGER') then

Form1.error;

if Ser^.Tip='MASINTEGER' then

OprTipMas();

End

else

if (Form1.elem<>'+') and (Form1.elem<>'-') and (Form1.elem<>'*') and (Form1.elem<>'$C') then

Form1.error;

End;
if tip='REAL' then

Begin

if Form1.elem='$I' then

Begin

if Not Form1.InTabl then

Form1.error;

if ('REAL'<>Ser^.Tip) and ('INTEGER'<>Ser^.Tip) and (Ser^.Tip<>'MASREAL') then

Form1.error;

if Ser^.Tip='MASINTEGER' then

OprTipMas();

if Ser^.Tip='MASREAL' then

OprTipMas();

End

else

if (Form1.elem<>'+') and (Form1.elem<>'-') and (Form1.elem<>'*') and (Form1.elem<>'/') and (Form1.elem<>'$C') and (Form1.elem<>'$R') then

Form1.error;

End;
if tip='STRING' then

Begin

if Form1.elem='$I' then

Begin

if Not Form1.InTabl then

Form1.error;

if ('STRING'<>Ser^.Tip) and ('CHAR'<>Ser^.Tip) and (Ser^.Tip<>'MASSTRING') and (Ser^.Tip<>'MASCHAR') then

Form1.error;

if Ser^.Tip='MASSTRING' then

OprTipMas();

if Ser^.Tip='MASCHAR' then

OprTipMas();

End

else

if (Form1.elem<>'+') and (Form1.elem<>'$L') then

Form1.error;

end;
if tip='CHAR' then

Begin

if Form1.elem='$I' then

Begin

if Not Form1.InTabl then

Form1.error;

if ('CHAR'<>Ser^.Tip) and (Ser^.Tip<>'MASCHAR') then

Form1.error;

if Ser^.Tip='MASCHAR' then

OprTipMas();

End

else

if (Form1.elem<>'$L') and (Form1.elem<>'+') then

Form1.error;

if Form1.elem='$L' then

if Length(pe.Inf2)<>1 then

Form1.error;

end;
if tip='DATE' then

Begin

if Form1.elem='$I' then

Begin

if Not Form1.InTabl then

Form1.error;

if ('DATE'<>Ser^.Tip) and (Ser^.Tip<>'MASDATE') then

Form1.error;

if Ser^.Tip='MASDATE' then

OprTipMas();

End

else

if Form1.elem<>'$L' then

Form1.error;

if Form1.elem='$L' then

RazborDate();

end;
if tip='BOOLEAN' then

Begin

if Form1.elem='$I' then

Begin

if Not Form1.InTabl then

Form1.error;

if ('BOOLEAN'<>Ser^.Tip) then

Form1.error;

End

else

if (Form1.elem<>'FALSE') and (Form1.elem<>'TRUE') and (Ser^.Tip<>'MASBOOLEAN') then

Form1.error;

if Ser^.Tip='MASBOOLEAN' then

OprTipMas();

end;

End;

if Vft=false then

begin

if Form1.elem='$I' then

Begin

if Not Form1.InTabl then

Form1.error;

if Ser^.Tip='MASINTEGER' then

Begin

OprTipMas();

tip:='INTEGER';

end

else if Ser^.Tip='MASSTRING' then

Begin

OprTipMas();

tip:='STRING';

end

else if Ser^.Tip='MASREAL' then

Begin

OprTipMas();

tip:='REAL';

end

else if Ser^.Tip='MASBOOLEAN' then

Begin

OprTipMas();

tip:='BOOLEAN';

end

else if Ser^.Tip='MASCHAR' then

Begin

OprTipMas();

tip:='CHAR';

end

else if Ser^.Tip='MASDATE' then

Begin

OprTipMas();

tip:='DATE';

end

else Tip:=Ser^.Tip;

End;

if Form1.elem='$C' then

Tip:='INTEGER';

if Form1.elem='$R' then

Tip:='REAL';

if Form1.elem='$L' then

Tip:='STRING'

End;

Vft:=True;

End;
{-------=======--------------=======--------------=======-------}

{ ------симантический анализ------ }

{-------=======--------------=======--------------=======-------}
procedure TForm1.FormCreate(Sender: TObject);

begin

Soz_tip();

Creat_Queue(pCb,pCe,pCa,se);

Creat_Queue(pRb,pRe,pRa,se);

Creat_Queue(pLb,pLe,pLa,se);

Creat_Queue(pIb,pIe,pIa,se);

Creat_Queue_Vxod_pot();

Chetat ();

Vivod(pCb,pCe,pCa);

Label1.Caption:=ss;

Vivod(pRb,pRe,pRa);

Label2.Caption:=ss;

Vivod(pLb,pLe,pLa);

Label3.Caption:=ss;

Vivodd();

Label5.Caption:=ss;

Vivod_Identif();

Label11.Caption:=ss;

end;

end.

^ РЕЗУЛЬТАТ ПРОГРАММЫ:




Вывод:

В этой курсовой работе была проделана работа по созданию компилятра. Программа была написана в среда программирования Borland Delhi7.

В этой программе предусмотренны следующие этапы:

  1. Ввод текста (предпологаемый язык пргораммирования);

  2. Сканирование этого текста – занесение лексем в соответствующие таблицы;

  3. Завершение программы.



Скачать файл (218 kb.)

Поиск по сайту:  

© gendocs.ru
При копировании укажите ссылку.
обратиться к администрации
Рейтинг@Mail.ru