Условные операторы и описание простых типов языка Си. Предиктивный анализатор

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

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 01.06.2013
Размер файла 1,3 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

i:=1;j:=0;

while i<=length(temp) do begin

term[j]:=temp[i];

Terminals:=Terminals+[term[j]];

j:=j+1;

i:=i+2;

end;

end;

procedure TForm1.Button2Click(Sender: TObject);

var

i,j,k:byte;

symbol,s,ch:char;

temp:string;

Help:set of char;

begin

GetTerminal;

Help:=[];//вспомогательное множество

i:=0;

while notterm[i]<>'' do

i:=i+1;

//число строк в таблице =числу нетерминалов

Form2.StringGrid1.RowCount:=i+1;

i:=0;

while term[i]<>#6 do

i:=i+1;

//число столюцов в таблице =числу терминалов

Form2.StringGrid1.ColCount:=i+1;

for i:=1 to Form2.StringGrid1.RowCount do

Form2.StringGrid1.Cells[0,i]:=notterm[i-1];

for i:=1 to Form2.StringGrid1.ColCount do

Form2.StringGrid1.Cells[i,0]:=term[i-1];

for k:=0 to Form1.Memo2.Lines.Count-1 do

begin

s:=notterm[k];

Help:=[];

for i:=1 to 45 do

begin

temp:=Rule[s,i];

if (temp<>'') then

begin

symbol:=temp[1];

//символ входит в First(s),то заполняем соотв.ячейку т.р.

if (temp<>'$')and(symbol in First[s,1]) then

begin

Paste(symbol,s,s+'->'+temp);

Help:=Help+[symbol];

end;

if not(symbol in First[s,1])then

for ch:=#32 to #125 do

if (ch in First[s,1])and not(ch in Help) then

Paste(ch,s,s+'->'+temp);

if (symbol='$') then

begin

for ch:=#32 to #125 do

if (ch in Follow[s,1])and not(ch in First[s,1]) then

Paste(ch,s,s+'->'+temp);

Paste('#',s,s+'->'+temp);

end;

end

end;

end;

form1.SpeedButton3.Enabled:=true;

form1.SpeedButton5.Enabled:=true;

Form2.Show;

end;

procedure AddStack (var symbol:char);

begin

if STop=nil then

begin

New(STemp);

Stemp^.inf:=symbol;

Stemp^.link:=nil;

STop:=Stemp;

end

else

if STop<>nil then

begin

New(Stemp);

Stemp^.inf:=symbol;

Stemp^.link:=Stop;

Stop:=Stemp;

end;

end;

procedure View(Input:string;Output:string;Stack:string);

begin

count:=Form1.StringGrid2.RowCount;

Form1.StringGrid2.Cells[0,count-1]:=Stack;

Form1.StringGrid2.Cells[1,count-1]:=Input;

Form1.StringGrid2.Cells[2,count-1]:=OutPut;

Form1.StringGrid2.RowCount:=Form1.StringGrid2.RowCount+1;

end;

function StackToStr():string;

var i:byte; str,help:string;

begin

str:='';

STemp:=STop;

while (Stemp<>nil)do

begin

str:=str+Stemp^.inf;

Stemp:=Stemp^.link;

end;

help:='';

for i:=length(str) downto 1 do

help:=help+str[i];

StackToStr:=help;

end;

procedure RemoveStack();

begin

if (STop<>nil)then

begin

STemp:=STop;

STop:=STemp^.link;

STemp^.link:=nil;

Dispose(STemp);

end;

end;

function Check (terminal:char;neterminal:char):string;

var

i,j:byte;

temp:string;

begin

for i:=1 to Form2.StringGrid1.RowCount do

begin

if Form2.StringGrid1.Cells[0,i]=neterminal then

for j:=1 to Form2.StringGrid1.ColCount do

if Form2.StringGrid1.Cells[j,0]=terminal then

begin

temp:=Form2.StringGrid1.Cells[j,i];

Select.Left:=j;

Select.Right:=j;

Select.Top:=i;

Select.Bottom:=i;

Form2.StringGrid1.Selection:=Select;

end;

end;

Check:=temp;

end;

procedure Vivod(neterminal:char;var Right:string);

var

i:byte;

begin

delete(Right,1,3);

for i:=1 to 45 do

begin

if (Rule[neterminal,i]=Right) then

mas[step]:=Right;

massiv[step]:=neterminal+'->'+right;

end;

step:=step+1;

end;

procedure TypeOfError(current:string);

var

i,j,k:byte;

M:set of char;

begin

{if current[1]<>'v' then

begin

MessageDlg('Ожидается var',mtError, [mbYes], 0);

exit;

end;

if current[2]<>'c' then

begin

MessageDlg('Ожидается идентификатор',mtError, [mbYes], 0);

exit;

end; }

M:=['>','<','=','+','-','*','/'];

i:=1;

while i<=length(current) do

begin

if (current[i] in M) then

if ((current[i+1]<>'d')or(current[i+1]<>'n')or

(current[i-1]<>'d')or(current[i-1]<>'n'))

then begin

MessageDlg('Недопустимое выражение',mtError, [mbYes], 0);

exit;

end;

i:=i+1;

end;

for i:=1 to length(current) do

if (current[i]=';') then

begin

MessageDlg('Ожидается символ ";"',mtError, [mbYes], 0);

exit;

end;

for i:=1 to length(current) do

if current[i]='{' then

begin

MessageDlg('Ожидается { ',mtError, [mbYes], 0);

exit;

end;

for i:=1 to length(current) do

if current[i]='}' then

begin

MessageDlg('Ожидается }',mtError, [mbYes], 0);

exit;

end;

end;

procedure TForm1.SpeedButton3Click(Sender: TObject);

label step1,step2,final;

var

help,temp,Stack,Input,Output: string;

symbol,ch:char;

i,j:byte;

s:string;

begin

STop:=nil;

Stemp:=nil;

for i:=1 to Form1.StringGrid2.RowCount do

for j:=1 to Form1.StringGrid2.ColCount do

Form1.StringGrid2.Cells[j,i]:='';

Form1.StringGrid2.RowCount:=2;

Form1.StringGrid2.ColCount:=3;

step1: begin

Input:=Form1.Edit3.Text+'#';

ch:='#';

AddStack(ch);

AddStack(notterm[0]);

OutPut:='';

i:=1;

help:='';

Stack:=StackToStr();

View(Input,Output,Stack);

end;

step2: begin

symbol:=input[i];

if (symbol=' ')then begin

delete(Input,1,1);

i:=1;

goto step2;

end;

if (symbol='#')and(symbol=stop.inf) then

begin

OutPut:='допуск';

goto final;

end;

ch:=STop^.inf;

if (symbol<>'#')and(symbol=ch) then

begin

OutPut:='вытолкнуть '+symbol;

RemoveStack();

delete(Input,1,1);

i:=1;

Stack:=StackToStr;

View(Input,Output,Stack);

goto step2;

end;

if (symbol<>STop.inf)and(STop.inf='$') then

begin

RemoveStack();

goto step2;

end;

if symbol<>STop.inf then

begin

temp:=Check(symbol,STop.inf);

if temp<>'' then begin

help:=temp;

Vivod(STop.inf,help);

help:='';

Output:=temp;

delete(temp,1,3);

for j:=length(temp)downto 1 do

help:=help+temp[j];

temp:=help;

help:='';

RemoveStack();

for j:=1 to length(temp) do

AddStack(temp[j]);

Stack:=StackToStr();

View(Input,Output,Stack);

goto step2;

end;

if temp=''then begin

OutPut:='Ошибка';

i:=Form1.StringGrid2.RowCount-2;

s:=Form1.StringGrid2.Cells[0,i];

TypeOfError(s);

goto final;

end;

end;

end;

final:begin

if (Output='допуск') then begin

ShowMessage('Разбор строки успешно завершен за '+IntToStr(Form1.StringGrid2.RowCount-2)+' шагов');

end

else ShowMessage('Строка не выводима из правил грамматики');

Stack:=StackToStr();

View(Input,Output,Stack);

Form1.StringGrid2.RowCount:=Form1.StringGrid2.RowCount-1;

end;

form1.SpeedButton9.Enabled:=true;

//form1.SpeedButton7.Enabled:=true;

end;

procedure TForm1.SpeedButton5Click(Sender: TObject);

label step1,step2,final;

var

help,temp,Stack,Input,Output: string;

symbol,ch:char;

i,j:byte;

s:string;

begin

STop:=nil;

Stemp:=nil;

for i:=1 to Form1.StringGrid2.RowCount do

for j:=1 to Form1.StringGrid2.ColCount do

Form1.StringGrid2.Cells[j,i]:='';

Form1.StringGrid2.RowCount:=2;

Form1.StringGrid2.ColCount:=3;

step1: begin

Input:=Form1.Edit3.Text+'#';

ch:='#';

AddStack(ch);

AddStack(notterm[0]);

OutPut:='';

i:=1;

help:='';

Stack:=StackToStr();

View(Input,Output,Stack);

end;

step2: begin

symbol:=input[i];

if (symbol=' ')then begin

delete(Input,1,1);

i:=1;

goto step2;

end;

if (symbol='#')and(symbol=stop.inf) then

begin

OutPut:='допуск';

if MessageDlg('Продолжить?',mtConfirmation, [mbYes, mbNo], 0) = mrNo

then exit;

goto final;

end;

ch:=STop^.inf;

if (symbol<>'#')and(symbol=ch) then

begin

OutPut:='вытолкнуть '+symbol;

if MessageDlg('Продолжить?',mtConfirmation, [mbYes, mbNo], 0) = mrNo

then exit;

RemoveStack();

delete(Input,1,1);

i:=1;

Stack:=StackToStr;

View(Input,Output,Stack);

goto step2;

end;

if (symbol<>STop.inf)and(STop.inf='$') then

begin

RemoveStack();

goto step2;

end;

if symbol<>STop.inf then

begin

temp:=Check(symbol,STop.inf);

if temp<>'' then begin

help:=temp;

Vivod(STop.inf,help);

help:='';

Output:=temp;

if MessageDlg('Продолжить?',mtConfirmation, [mbYes, mbNo], 0) = mrNo

then exit;

delete(temp,1,3);

for j:=length(temp)downto 1 do

help:=help+temp[j];

temp:=help;

help:='';

RemoveStack();

for j:=1 to length(temp) do

AddStack(temp[j]);

Stack:=StackToStr();

View(Input,Output,Stack);

goto step2;

end;

if temp=''then begin

OutPut:='Ошибка';

i:=Form1.StringGrid2.RowCount-2;

s:=Form1.StringGrid2.Cells[0,i];

TypeOfError(s);

if MessageDlg('Продолжить?',mtConfirmation, [mbYes, mbNo], 0) = mrNo

then exit;

goto final;

end;

end;

end;

final:begin

if (Output='допуск') then begin

ShowMessage('Разбор строки успешно завершен за '+IntToStr(Form1.StringGrid2.RowCount-2)+' шагов');

end

else begin ShowMessage('Строка не выводима из правил грамматики'); Form1.StringGrid2.RowCount:=Form1.StringGrid2.RowCount-1;end;

Stack:=StackToStr();

View(Input,Output,Stack);

end;

form1.SpeedButton9.Enabled:=true;end;

procedure ClearMemory();

begin

STemp:=STop;

while (STemp<>nil) do

begin

STop:=Stemp^.link;

Dispose(Stemp);

Stemp:=STop;

end;

end;

procedure CTree(Node:TTreeNode; str: String);

var

i:byte;

InternalNode: TTreeNode;

temp:string;

begin

temp:=str;

for i:=1 to length(temp) do

begin

InternalNode:=Form3.TreeView1.Items.AddChild(Node,temp[i]);

if temp[i] in ['A'..'Z'] then

begin

step:=step+1;

CTree(InternalNode,mas[step]);

end;

end;

end;

procedure BuildTree;

var

temp:string;

NewNode:TTreeNode;

begin

temp:=mas[step];

Form3.TreeView1.Items.Clear;

NewNode:=Form3.TreeView1.Items.Add(nil,'S');

CTree(NewNode,temp);

Form3.TreeView1.FullExpand;

end;

procedure BeautifulTree (Source:TTreeNode;Node:TdxOCNode; tv:TdxOrgChart);

var

i:byte;

InternalNode: TdxOCNode;

Child: TTreeNode;

begin

if Source.Count>0 then

begin

i:=0;

while i<=Source.Count-1 do

begin

Child:=Source.Item[i];

InternalNode:=tv.AddChild(Node,nil) ;

InternalNode.Text:=Child.Text;

InternalNode.Color:=clMoneyGreen;

InternalNode.Width:=30;

InternalNode.Height:=30;

InternalNode.Shape := shellipse;

if Child.HasChildren then BeautifulTree(Child,InternalNode,tv);

i:=i+1;

end;

end;

end;

procedure TForm1.SpeedButton9Click(Sender: TObject);

var

i,j,k,help:byte;

temp:string;

Node:TdxOCNode;

TempNode:TTreeNode;

begin

Form3.TreeView1.Items.Clear;

Form3.TreeView2.Items.Clear;

Form3.dxOrgChart1.Clear;

Form1.dx1.Clear;

ClearMemory; //очищаем стек

help:=step;

step:=0;

BuildTree;

TempNode:=Form3.TreeView1.Items.GetFirstNode();

Node:=Form3.dxOrgChart1.AddFirst(nil,nil);

Node.Text:=TempNode.Text;

Node.Color:=clMoneyGreen;

Node.Width:=30;

Node.Height:=30;

Node.Shape := shellipse;

BeautifulTree(TempNode,Node,Form3.dxOrgChart1);

Form3.dxOrgChart1.Font.Size:=10;

Form3.dxOrgChart1.DefaultNodeHeight:=10;

Form1.Memo3.Clear;

Form1.Memo3.Lines.Add(notterm[0]+'->'+mas[0]);

for i:=0 to help do

begin

temp:=mas[i];

j:=1;

while j<=length(temp) do

begin

if temp[j]='$' then

delete(temp,j,1);

j:=j+1;

end;

k:=1;

while (temp[k] in Terminals) do

k:=k+1;

delete(temp,k,1);

insert(mas[i+1],temp,k);

Form1.Memo3.Lines.Add(' '+temp);

mas[i+1]:=temp;

temp:='';

end;

help:=0;

for i:=1 to step do

mas[i]:='';

form1.speedbutton8.enabled:=true;

step:=0;

Form3.Show;

end;

procedure STree(TempNode:TTreeNode);

var

M:set of char;

i,j:byte;

Child:TTreeNode;

b:boolean;

begin

b:=false;

M:=['d','t','n','i','e','f','l','r','a',';',',','{','}','(',')','<','>','=','+','-','*','/'];

//M:=['=','+','-','*','/','<','>','b','e','r','t','d','i','h','c','y','n',';',',',':'];

//M:=['=','+','-','*','/','<','>','c','y','n',':'];

if not(TempNode.Text[1] in terminals) then

begin

if (TempNode.Count=1) then begin

Child:=TempNode.Item[0];

TempNode.Text:=Child.Text;

Child.Text:='^'; //пометили на удаление

end

else

i:=0;

while i<=TempNode.Count-1 do

begin

Child:=TempNode.Item[i] ;

if (TempNode.Text='S') and ((Child.Text='v') or(Child.Text='b') or (Child.Text='e'))then

Child.Text:='^';

if (Child.Text[1] in M)and (b=false) then begin

TempNode.Text:=Child.Text;

Child.Text:='^';//пометили на удаление

b:=true;

end;

if not(Child.Text[1] in M) and (Child.Text[1]in (terminals-['n']-['c']))

then begin

Child.Text:='^';//пометили на удаление

end;

if Child.Text[1]='$' then Child.Text:='^';

i:=i+1;

end;

end;

if TempNode.Text[1]='$' then TempNode.Text:='^';

end;

procedure MoveNode(TargetNode, SourceNode: TTreeNode; tv:TTreeView); //перемещение узла

var

nodeTmp: TTreeNode;

i: Integer;

begin

with tv do

begin

NodeTmp := Items.AddChild(TargetNode, SourceNode.Text);

for i := SourceNode.Count - 1 downto 0 do

begin

MoveNode(nodeTmp, SourceNode.Item[i],tv);

end;

end;

end;

procedure BuildSyntTree;

var

Parent,Child,TempNode:TTreeNode;

i:byte;

j:integer;

b:boolean;

M:set of char;

begin

M:=['d','t','n','i','e','f','l','r','a',';',',','{','}','(',')','<','>','=','+','-','*','/'];

//M:=['=','+','-','*','/','<','>','b','e','r','t','d','i','h','c','y','n',';',',',':'];

Form3.TreeView2.Items.Clear;

Form3.TreeView2.Items:=Form3.TreeView1.Items;

Form3.TreeView2.FullExpand;

b:=false;

while b<>true do begin

i:=0;

while i<=(Form3.TreeView2.Items.Count-1) do

begin

TempNode:=Form3.TreeView2.Items[i];

STree(TempNode);

i:=i+1;

end;

i:=0;

while i<=Form3.TreeView2.Items.Count-1 do

begin

TempNode:=Form3.TreeView2.Items[i];

//нет потомков

if (TempNode.Text='^')and(TempNode.HasChildren=false) then

begin

Form3.TreeView2.Items.Delete(Form3.TreeView2.Items.Item[i]);

i:=0;

end

else begin

//есть потомки

if (TempNode.Text='^')and(TempNode.HasChildren=true)then

begin

for j:=0 to TempNode.Count-1 do

begin

MoveNode(TempNode.Parent,TempNode.Item[j],Form3.TreeView2)

end;

TempNode.DeleteChildren;

TempNode.Delete;

end;

end;

i:=i+1;

end;

i:=0;

while i<=Form3.TreeView2.Items.Count-1 do

begin

TempNode:=Form3.TreeView2.Items[i];

if not(TempNode.Text[1]in terminals)or (TempNode.Text[1]='^') then

begin

b:=false;

break;

end

else b:=true;

i:=i+1;

end;

end;

Form3.TreeView2.FullExpand;

end;

procedure TForm1.SpeedButton8Click(Sender: TObject);

var

TempNode:TTreeNode;

Node:TdxOCNode;

begin

Form1.dx1.Clear;

Form3.TreeView2.Items.Clear;

step:=0;

BuildSyntTree;

TempNode:=Form3.TreeView2.Items.GetFirstNode();

Node:=Form1.dx1.AddFirst(nil,nil);

Node.Text:=TempNode.Text;

Node.Color:=clMoneyGreen;

Node.Width:=30;

Node.Height:=30;

Node.Shape := shellipse;

BeautifulTree(TempNode,Node,Form1.dx1);

Form1.dx1.Font.Size:=10;

Form1.dx1.DefaultNodeHeight:=10;

end;

Размещено на Allbest.ru


Подобные документы

  • Разработка анализирующей части компилятора для выполнения проверки исходной программы на соответствие грамматике языка, правилам семантики и построения внутреннего представления. Описание анализаторов: лексического, синтаксического и семантического.

    контрольная работа [704,9 K], добавлен 01.02.2013

  • Основные понятия теории грамматик простого и операторного предшествования, алгоритмы синтаксического разбора предложения для классов КС-грамматик; разработка дерева вывода для грамматики входного языка в форме Бэкуса-Наура с указанием шагов построения.

    лабораторная работа [28,0 K], добавлен 24.07.2012

  • Структура, классификация и требования к реализации компилятора. Проектирование и реализация анализирующей части компилятора языка С++. Способы реализации лексического анализа. Алгоритм работы синтаксического анализатора. Принципы программной реализации.

    курсовая работа [774,2 K], добавлен 26.01.2013

  • Место компилятора в программном обеспечении. Принципы работы и автоматизация построения синтаксического анализатора. Дерево разбора и его преобразование в дерево операций. Назначение и этапы семантического анализа. Идентификация языков программирования.

    реферат [265,1 K], добавлен 20.12.2007

  • Организация таблицы идентификаторов, ее содержание и назначение. Метод бинарного дерева и цепочек. Проектирование лексического анализатора и схема распознавателя. Построение дерева вывода, синтаксический анализатор. Анализ результатов работы программы.

    курсовая работа [1,0 M], добавлен 25.12.2014

  • Общая характеристика и оценка возможностей языка программирования си-шарп, его сходные и отличительные черты от С++ и Java. Разработка с помощью данного языка программирования лексического и синтаксического анализатора. Составление таблиц разбора.

    курсовая работа [111,6 K], добавлен 11.06.2010

  • Содержательная часть языка программирования С++. Правила автоматной грамматики, классификация Хомского. Принцип построения графов, разработка проекта средствами среды программирования Builder C++. Алгоритм синтаксического анализа оператора вывода.

    контрольная работа [228,4 K], добавлен 22.05.2012

  • Виды записи выражений. Особенности обратной польской записи. Вычисления на стеке. Преобразование из инфиксной нотации. Операторы входного языка. Описание выходной информации. Алгоритмические аспекты программы-распознавателя арифметических выражений.

    курсовая работа [2,1 M], добавлен 26.11.2011

  • Описание синтаксиса и семантики входного языка. Описание типов лексем, определение их синтаксиса. Построение диаграммы лексического анализатора, а также его таблицы, тестирование. Построение КС-грамматики входного языка. Описание промежуточного языка.

    курсовая работа [83,0 K], добавлен 23.01.2014

  • Анализ операторов ввода и вывода, а также характеристика форматов, используемых в этих операторах. Оформление законченной программы с применением этих операторов. Структура программы. Алфавит языка и типы данных. Ввод и вывод информации. Форматный вывод.

    лабораторная работа [62,0 K], добавлен 15.07.2010

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.