Построение простейшего дерева вывода
Основные понятия теории грамматик простого и операторного предшествования, алгоритмы синтаксического разбора предложения для классов КС-грамматик; разработка дерева вывода для грамматики входного языка в форме Бэкуса-Наура с указанием шагов построения.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | лабораторная работа |
Язык | русский |
Дата добавления | 24.07.2012 |
Размер файла | 28,0 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Министерство образования Российской Федерации
Марийский государственный технический университет
Факультет информатики и вычислительной техники
Кафедра ИВС
Лабораторная работа
по дисциплине:
Системное программное обеспечение
Тема:
Построение простейшего дерева вывода
Выполнили: студенты группы ВМ-31
Сорокин О., Петров И.
Проверил: Морохин Д.В.
г. Йошкар-Ола 2012 г.
Цель работы
Изучение основных понятий теории грамматик простого и операторного предшествования, ознакомление с алгоритмами синтаксического анализа (разбора) для некоторых классов КС-грамматик, получение практических навыков создания простейшего синтаксического анализатора для заданной грамматики операторного предшествования.
Задание
Терминальные символы выделены жирным шрифтом. Вместо символа a должны подставляться лексемы.
Дана грамматика вида:
S®T<T | T>T | T<=T | T>=T
E®a*a | a/a | a
T®T+E | T-E | E
Допустимые лексемы входного языка: идентификаторы, целые десятичные числа со знаком.
Описание грамматики входного языка в форме Бэкуса-Наура
Грамматика для распознавания идентификаторов:
Грамматика для распознавания целых десятичных чисел со знаком:
Грамматика для лексического анализатора получается объединением этих 2-х грамматик.
Множества крайних правых и крайних левых символов с указанием шагов построения
Символ |
Шаг 1 |
Последний шаг |
|||
(U) |
L(U) |
R(U) |
L(U) |
R(U) |
|
S |
T |
T |
TEa |
TEa |
|
T |
TE |
E |
TEa |
Ea |
|
E |
a |
a |
a |
a |
Множества крайних правых и крайних левых терминальных символов
Символ |
Шаг 1 |
Шаг 2 |
|||
(U) |
Lt(U) |
Rt(U) |
Lt(U) |
Rt(U) |
|
S |
< > <= >= |
< > <= >= |
< > <= >= +-a |
< > <= >=+-a |
|
T |
+- |
+- |
+-a |
+-a |
|
E |
a |
a |
a |
a |
Матрица предшествования для грамматики
Символ |
< |
> |
+ |
- |
* |
/ |
<= |
>= |
a |
к |
|
< |
= |
= |
= |
||||||||
> |
= |
= |
= |
||||||||
+ |
> |
> |
< |
> |
|||||||
- |
> |
> |
< |
> |
|||||||
* |
= |
||||||||||
/ |
= |
||||||||||
<= |
= |
= |
= |
||||||||
>= |
= |
= |
= |
||||||||
a |
= |
= |
> |
||||||||
н |
< |
< |
< |
Пример выполнения разбора предложения
Входная цепочка: a+a<a
{ к a+a<a; н; } п { к+a<a; н a; } c {к+a<a; нE; 10} п {к a<a;
нE+; 10} п {к<a; н E+a;10} с {к<a; н E+Е;10,10} с {к<a; н
E;10,10,5} п {к a; н E<;10,10,5} п {к; н E<a;10,10,5} c {к; н
E<E;10,10,5,10} с {к; н E; 10,10,5,10,1}
операторный грамматика дерево вывод
Дерево вывода:
Текст программы
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
label
X,Y,Z,W,TX,AX;
var
a,i,j,k,count,c,n,g,b,bb,aa,ii:integer;
fin:file of char;
m:real;
fout:text;
ch,del,umn,minus,plus:char;
slovo:array[1..30] of string[32];
tip:array[1..20] of integer;
tip_:array[1..20] of string[32];
tmp,tmp_:string[60];
dl_tmp:integer;
s:string[100];
t:array[1..20] of string[32];
tt:array[1..20] of string[32];
e:array[1..20] of string[32];
a_:array[1..20] of string[32];
term:array[1..30] of char;
term_:array[1..30] of char;
nn:array[1..20] of integer;
begin
{ TODO -oUser -cConsole Main : Insert code here }
a:=0;writeln('‡ ¤ ЁҐ:');writeln;
writeln('Vipolnit leksicheskii analiz vxodnogo teksta,postroyit tablitsy
leksem');
writeln('I vipolnit sintaksicheskii razbor teksta po zadannoi grammatike s
postroeniem dereva ');
writeln('а §Ў®а .');
writeln('');
writeln('Zadannaya grammatika);writeln('');
writeln('S->T<T|T>T|T<=T|T>=T');
writeln('T->T+E|T-E|E');
writeln;
writeln('Vypolnili studenty VM-31 Petrov,Sorokin');
writeln('');
writeln('!!!!!!!!!!!!!!!!!!!!!WARNING!!!!!!!!!!!!!!!!!!!!!!!!!!!!!');
writeln('Vhodnoi fail dolzhen nahoditsya na diske C:\spo3_in.txt');
writeln('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!');
writeln;readln;
assign(fin,'C:\spo3_in.txt');reset(fin);
for i:=1 to 30 do
slovo[i]:='';
j:=0;
i:=1;
c:=1;
a:=1;
ii:=1;
count:=0;
s:='';n:=0;
while not eof(fin) do
begin read(fin,ch);
s:=s+ch;n:=n+1;
Y: if(((ch>='a')and(ch<='z'))or((ch>='A')and(ch<='Z')))
then begin if(a=0)then i:=i+1;slovo[i]:=slovo[i]+ch;a:=1;tip[i]:=1;end
else if(ch='+')
then begin i:=i+1;slovo[i]:=slovo[i]+ch;a:=0;tip[i]:=3;end
else if(ch='-')
then begin i:=i+1;slovo[i]:=slovo[i]+ch;a:=0;tip[i]:=4;end
else if(ch='*')
then begin i:=i+1;slovo[i]:=slovo[i]+ch;a:=0;tip[i]:=5;end
else if(ch='/')
then begin i:=i+1;slovo[i]:=slovo[i]+ch;a:=0;tip[i]:=6;end
else if((ch='<')or(ch='>'))
then begin i:=i+1;slovo[i]:=slovo[i]+ch;a:=0;tip[i]:=7;end
else if(ch='=')
then begin slovo[i]:=slovo[i]+ch;a:=0;end
else if(ch='(')
then begin
i:=i+1;tip[i]:=2;
read(fin,ch);s:=s+ch;n:=n+1;a:=0;
slovo[i]:=slovo[i]+ch;
X:read(fin,ch);s:=s+ch;n:=n+1;
if((ch>='0')and(ch<='9'))
then begin slovo[i]:=slovo[i]+ch;goto X;end
else goto Y;
end
else if(ch=')')
then begin end
else begin j:=1;goto Z;end;
end;
close(fin);
for j:=1 to i do
begin
if(tip[j]=1)then tip_[j]:='identificator';
if(tip[j]=2)then tip_[j]:='celoe 10_noe chislo so znakom';
if(tip[j]=3)then tip_[j]:='znak slozheniya';
if(tip[j]=4)then tip_[j]:='znak vichitaniya';
if(tip[j]=5)then tip_[j]:='znak ymnozheniya';
if(tip[j]=6)then tip_[j]:='znak deleniya';
if(tip[j]=7)then tip_[j]:='znak neravenstva';
end;
c:=0;
assign(fout,'C:\spo3_out.txt');rewrite(fout);
writeln(fout,'');writeln(fout,'Tablica lecsem');
writeln(fout,'N Lecsema Tip lecsemi');
for j:=1 to i do
writeln(fout,j,' ',slovo[j],' ',tip_[j]);
writeln(fout,'');writeln(fout,'Derevo vivoda:');
tmp:='';
for j:=1 to 20 do
begin a_[j]:='';t[j]:='';tt[j]:='';e[j]:='';end;
aa:=1;
for j:=1 to n do
begin
if((s[j]='<')or(s[j]='>'))
then begin
for i:=1 to j-1 do
t[1]:=t[1]+s[i];
term[1]:=s[j];
for i:=j+1 to n do
tt[1]:=tt[1]+s[i];
c:=1;
end
else if(s[j]='=')
then begin term[2]:='=';delete(t[15],1,1);end;
end;
if(c=0)then begin j:=2;goto Z;end;
tmp:='T'+term[1]+term[2]+'T -> ';
write(fout,'S -> ',tmp);
b:=1;a:=1;bb:=0;aa:=3;
TX:
nn[b]:=length(t[b]);
if(nn[b]>0)then
begin
for i:=nn[b] downto 1 do
begin
if((t[b][i]='+')or(t[b][i]='-'))
then begin
if(t[b][i-1]<>'(')then
begin
for g:=i+1 to nn[b] do
e[a]:=e[a]+t[b][g];
term[aa]:=t[b][i];
for g:=1 to i-1 do
t[b+1]:=t[b+1]+t[b][g];
bb:=1;break;
end;end;
end;
if(bb=0)then begin e[a]:=t[b];delete(tmp,1,1);tmp:='E'+tmp;bb:=0;end
else begin delete(tmp,1,1);tmp:='T'+term[aa]+'E'+tmp;bb:=0;end;
a:=a+1;
end;
nn[b]:=length(tt[b]);
if(nn[b]>0)then
begin
for i:=nn[b] downto 1 do
begin
if((tt[b][i]='+')or(tt[b][i]='-'))
then begin
if(tt[b][i-1]<>'(')then
begin
for g:=i+1 to nn[b] do
e[a]:=e[a]+tt[b][g];
aa:=aa+1;
term[aa]:=tt[b][i];
for g:=1 to i-1 do
tt[b+1]:=tt[b+1]+tt[b][g];
bb:=1;break;
end;end;
end;
dl_tmp:=length(tmp);
for g:=dl_tmp downto 1 do
if(tmp[g]='T')then
begin k:=g;break;end;
delete(tmp,k,1);
if(bb=0)then begin insert('E',tmp,k);e[a]:=tt[b];write(fout,tmp);bb:=0;end
else begin
tmp_:='T'+term[aa]+'E';insert(tmp_,tmp,k);write(fout,tmp);bb:=0;end;
a:=a+1;
end;
begin
for g:=1 to length(e[ii]) do
begin
if((e[ii][g]='*')or(e[ii][g]='/'))
then begin
for i:=1 to g-1 do
a_[1]:=a_[1]+e[ii][i];
term_[1]:=e[ii][g];
for i:=g+1 to length(e[ii]) do
a_[2]:=a_[2]+e[ii][i];
bb:=1;break;
end;
end;
for g:=1 to length(tmp) do
if(tmp[g]='E') then
begin delete(tmp,g,1);break;end;
if(bb=0)then begin
insert('a',tmp,g);bb:=0;
end
else begin
tmp_:='a'+term_[1]+'a';
insert(tmp_,tmp,g);bb:=0;
end;
ii:=ii+1;
for g:=1 to length(e[ii]) do
begin
if((e[ii][g]='*')or(e[ii][g]='/'))
then begin
for i:=1 to g-1 do
a_[1]:=a_[1]+e[ii][i];
term_[1]:=e[ii][g];
for i:=g+1 to length(e[ii]) do
a_[2]:=a_[2]+e[ii][i];
bb:=1;break;
end;
end;
for g:=1 to length(tmp) do
if(tmp[g]='E') then
begin delete(tmp,g,1);break;end;
if(bb=0)then begin
insert('a',tmp,g);bb:=0;
end
else begin
tmp_:='a'+term_[1]+'a';
insert(tmp_,tmp,g);bb:=0;
end;
c:=0;ii:=ii+1;
end;
if((length(t[b])>0)or(length(tt[b])>0))
then
begin b:=b+1;goto TX;end;
for g:=length(tmp) downto 1 do
begin
if(tmp[g]='>')then begin delete(tmp,g-1,10);break;end;
end;
write(fout,tmp,'-> ',s);
close(fout);
Z:if(j=1)
then writeln('Leksicheskaya oshibka!');
if(j=2)
then readln;
end.
end.
Вывод
При выполнении лабораторной работы изучили основные понятия теории грамматик простого и операторного предшествования, ознакомились с алгоритмами синтаксического анализа для некоторых классов КС-грамматик, получили практические навыки создания простейшего синтаксического анализатора для заданной грамматики операторного предшествия.
Написали программу, которая выполняет лексический анализ входного текста в соответствии с заданием, порождает таблицу лексем и выполняет синтаксический разбор текста по заданной грамматике с построением дерева разбора. Текст задаётся в виде текстового файла.
Размещено на Allbest.ru
Подобные документы
Конструкции условных операторов if-else и простые типы языка Си. Общая схема работы компилятора. Алгоритм построения дерева разбора, строки вывода синтаксического разбора. Построение обратной польской записи как формы внутреннего представления программы.
курсовая работа [1,3 M], добавлен 01.06.2013Теоретические и практические основы грамматик, теория конечных автоматов-распознавателей. Эквивалентные и недостижимые состояния конечных автоматов. Классификация грамматик и порождаемых ими языков. Разработка программного комплекса построения грамматик.
курсовая работа [654,2 K], добавлен 14.11.2010Содержательная часть языка программирования С++. Правила автоматной грамматики, классификация Хомского. Принцип построения графов, разработка проекта средствами среды программирования Builder C++. Алгоритм синтаксического анализа оператора вывода.
контрольная работа [228,4 K], добавлен 22.05.2012Особенности и суть языков программирования, способы их задания, цепочки символов и операции над ними. Классификация языков и грамматик, форма Бэкуса-Наура. Определение и свойства регулярных выражений, конечные автоматы и грамматики, описание программы.
курсовая работа [231,5 K], добавлен 23.06.2011Разработка формальной грамматики для выражений, содержащих: логические и арифметические операции, константы, идентификаторы, знаки отношений и т.д., ее отладка в соответствии с требованиями метода параллельного предшествования. Разработка сканера.
контрольная работа [45,8 K], добавлен 24.09.2010Применение правил грамматики. Синтаксический анализатор, нис- и восходящий разбор, полный перебор правил подстановки. Классификация грамматик по Хомскому. Определение языков с помощью автоматов. Форма Бекуса-Наура описания синтаксиса формальных языков.
лекция [270,1 K], добавлен 19.10.2014Способы построения остовного дерева (алгоритма поиска в глубину и поиска в ширину). Вид неориентированного графа. Понятие и алгоритмы нахождения минимальных остовных деревьев. Последовательность построения дерева графов по алгоритмам Крускала и Прима.
презентация [22,8 K], добавлен 16.09.2013Организация таблицы идентификаторов, ее содержание и назначение. Метод бинарного дерева и цепочек. Проектирование лексического анализатора и схема распознавателя. Построение дерева вывода, синтаксический анализатор. Анализ результатов работы программы.
курсовая работа [1,0 M], добавлен 25.12.2014Основные методы описания синтаксиса языков программирования: формальные грамматики, формы Бэкуса-Наура и диаграммы Вирта. Разработка алгоритма решения задачи. Лексический и синтаксический анализатор, семантический анализ. Структурная организация данных.
курсовая работа [680,1 K], добавлен 12.06.2011Рассмотрение нелинейных динамических структур данных в виде бинарного дерева. Построение дерева двоичного поиска. Реализация трех обходов дерева, выведение обходов на экран компьютера. Разработка текста программы. Симметричноправая прошивка дерева.
контрольная работа [81,6 K], добавлен 14.12.2011