Условные операторы и описание простых типов языка Си. Предиктивный анализатор
Конструкции условных операторов 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