Автор работы: Пользователь скрыл имя, 10 Октября 2011 в 19:45, лабораторная работа
В данной лабораторной работе необходимо:
1.проверить, обладает ли заданная грамматика свойством LL(1), и при необходимости, выполнить ее преобразование к этому виду;
2.построить для полученной в п.1 грамматики LL(1)-таблицу разбора;
3.разработать программную реализацию синтаксического анализатора на основе полученной LL(1)-грамматики и соответствующей таблицы разбора. Результат анализа представить в виде последовательности номеров правил грамматики, примененных в процессе разбора.
1. Задание.
В данной лабораторной работе необходимо:
1.проверить,
обладает ли заданная
2.построить для полученной в п.1 грамматики LL(1)-таблицу разбора;
3.разработать
программную реализацию синтаксического
анализатора на основе полученной LL(1)-грамматики
и соответствующей таблицы разбора. Результат
анализа представить в виде последовательности
номеров правил грамматики, примененных
в процессе разбора.
2. Заданная грамматика:
S::=caA
A::=(L)|L
L::=e,L|e
S - аксиома
3.Полученная LL(1)-грамматика:
1)S::=caA
2)A::=(L)
3)A::=L
4)L::=eZ
5)Z::=,L
6)Z::=L
4. Таблица разбора:
c | a | ( | ) | e | , | $ | |
S | caS, 1 | ||||||
A | (L), 2 | L, 3 | |||||
L | eZ, 4 | ||||||
Z | L, 6 | ,L, 5 | |||||
c | выброс | ||||||
a | выброс | ||||||
( | выброс | ||||||
) | выброс | ||||||
e | выброс | ||||||
, | выброс | ||||||
$ | допуск |
5. Текст программы:
# include <iostream>
# include <fstream>
# include <string>
using namespace std;
struct Symb
{
char s1;
char s2;
string str;
char out;
struct Symb *next;
};
void add_to_list (struct Symb* &head, struct Symb t)
{
struct Symb* ptr=new struct Symb;
*(ptr)=t;
if (head==NULL)
ptr->next=NULL;
else
ptr->next=head;
head=ptr;
}
void del_list (struct Symb* &head)
{
struct Symb* ptr;
while (head!=NULL)
{
if (head->next!=NULL)
{
ptr=head;
head=head->next;
delete ptr;
}
else
{
delete head;
head=NULL;
}
}
}
void read_file(struct Symb* &head)
{
ifstream inFile ("table.txt", ios::in);
char s; struct Symb t; string st;
inFile>>s;
while (!inFile.eof())
{
t.s1=s; inFile>>s;
t.s2=s; inFile>>st;
t.str=st; inFile>>s;
if (t.str=="В"||t.str=="Д")
{
add_
contin
}
t.out=s;
inFile>>s;
add_to_list(
}
inFile.close();
}
bool search (struct Symb* head,char inis,char sts,string& str,char& outs)
{
struct Symb* ptr=head;
while (ptr!=NULL)
{
if (inis==ptr->s1)
if (sts==ptr->s2)
{
str=
outs=
return true;
}
ptr=ptr->next;
}
return false;
}
void pop_stack(string &stack,int &top)
{
if (top>0)
{
stack.erase(top,1)
top--;
}
}
void replace_str(string &str)
{
string str1="";
for (int i=str.length()-1; i>=0; i--)
str1+=str[i];
str=str1;
}
void push_stack(string &stack,int &top,string str)
{
replace_str(str);
stack+=str;
top+=str.length();
}
bool LL (struct Symb* head,string inistr,string &outstr)
{
string stack,str; int top=1,curs=0;
stack="$S";
char outs;
while (inistr[curs]!='\0')
{
if(search(head,
{
switch (str[0])
{
case 'В':
{
}
case 'Д':
default:
{
}
}
}
else
return false;
}
return true;
}
int main()
{
struct Symb* head=NULL;
string inistr,outstr="";
cout<<"Enter string: ";
cin>>inistr;
read_file(head);
if(LL(head,inistr,
{
cout<<"The string is allowed"<<endl;
cout<<"Resulting string: ";