Міністерство освіти і науки України
Національний університет «Львівська політехніка»
ЛАБОРАТОРНА РОБОТА №3
Семантичний аналізатор
Львів – 2007
Тема: Розглянути підмножину мови C, у якій є ідентифікатори (довжина – не більше 10 символів), цілі константи (довжина – не більше 6 символів), дійсні константи з фіксованою крапкою, які використовуються у операторах опису (типи змінних – float , int), оператори присвоєння, оператори циклу типу for.
Код програми:
Лексичний аналіз перероблений для потреб семантичного
#include<string.h>
#include<conio.h>
#include<fstream>
#include<iostream>
#include<new>
main(void)
{clrscr();
int Matr[10][8]={2,1,5,5,7,4,8,7,
1,1,9,9,7,9,8,7,
2,7,9,9,3,9,8,7,
3,7,9,9,7,9,8,7,
9,9,9,9,7,9,8,7,
9,9,6,7,7,9,8,7,
9,9,7,7,7,9,8,7,
7,7,7,7,7,7,8,7};
char *typy[10]={"","Identyfikator","0Z","0D","dughky",
"=","operator prysvoyenya","error"};
char *a="";
char a2[2];
int typ=0,typ2,j=0;
int k=0;
char *s;
ifstream in("dani.txt");
ofstream out("l.txt");
if(!out) {cout<<"Ne moghlyvo vidkryty fayl out\n ";
getch();
return 1;}
if(!in) {cout<<"Ne moghlyvo vidkryty fayl\n ";
getch();
return 1;}
while(!in.eof())
{in>>s;
for(int i=0;i<strlen(s);i++)
{if(s[i]>='0' && s[i]<='9') typ=Matr[typ][0];
else if((s[i]>='a' && s[i]<='z')||(s[i]>='A' && s[i]<='Z')) typ=Matr[typ][1];
else if(s[i]=='=') typ=Matr[typ][2];
else if((s[i]=='<')||(s[i]=='>')||(s[i]=='!')) typ=Matr[typ][3];
else if(s[i]=='.') typ=Matr[typ][4];
else if((s[i]=='{')||(s[i]=='}')||(s[i]=='(')||(s[i]==')')) typ=Matr[typ][5];
else if((s[i]==',')||(s[i]==';')) typ=Matr[typ][6];
else typ=7;
if(typ<8) {/*cout<<s[i];*/ a2[0]=s[i];strcat(a,a2);k++;}
else { if((typ2==1 && k>10)||(typ2==2 && k>6)) typ2=7;
if((strcmp(a,"for")!=0)&&(typ2==1)) out<<a<<endl;
else if((typ2==2)||(typ2==3)||(typ2==5)) out<<typy[typ2]<<endl;
*a='\0 ';
if(typ==9)i--;
typ=0;
k=0;
}
typ2=typ;
}
if((typ2==1 && k>10)||(typ2==2 && k>6)) typ2=7;
if((strcmp(a,"for")!=0)&&(typ2==1)) out<<a<<endl;
else if((typ2==2)||(typ2==3)||(typ2==5)) out<<typy[typ2]<<endl;
*a='\0 ';
typ=0;
k=0;
}
in.close();
out.close();
getch();
}
Семантичний аналіз:
#include "stdafx.h"
#include<string.h>
#include<conio.h>
#include<fstream>
#include<iostream>
#include<new>
#include <string>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{int popysu=0,popysu2=0, iint=-1, ifloat=-1,pnalegnosti=0;
static string masiint[20], masifloat[20],typy[3]={"","0I","0F"};
string degurna, s;
ifstream in ("l.txt");
if(!in.is_open()) {cout<<"Ne moghlyvo vidkryty fayl\n ";
getch();
return 1;}
while(!in.eof())
{in>>degurna;
if((degurna=="0D")||(degurna=="0D")||(degurna=="=")||(degurna=="0Z")){s+=degurna; continue;}
//////////////chek///////////////////////
for(int i=0;i<=iint;i++)
{if(masiint[i]==degurna){pnalegnosti=1; break;}
}
if(pnalegnosti==0)
for(int i=0;i<=ifloat;i++)
{if(masifloat[i]==degurna){pnalegnosti=2; break;}
}
//////////////chek//////////////////////
popysu2=popysu;
if(degurna=="int") popysu=1;
else if(degurna=="float") popysu=2;
else popysu=0;
//////////////////////////////////////////
if((popysu2>0)&&(pnalegnosti>0)){cout<<"podvijnyj opys zminnoji "<<degurna<<endl; continue;}
if((popysu==0)&&(popysu2==0)&&(pnalegnosti==0)){cout<<"neopysana zminna "<<degurna<<endl; continue;}
/////////////////////////////////////////////
if(popysu2!=0){pnalegnosti=popysu2;
if(popysu2==1){iint++;masiint[iint]=degurna;}
else {ifloat++;masifloat[ifloat]=degurna;}
popysu=0;
}
s=s+typy[pnalegnosti]; pnalegnosti=0;
}
in.close();
if((s.find("0I=0F")!=-1)||(s.find("0I=0D")!=-1)) cout<<"ne dopustyme prysvojennya [int]=[float]\n";
getch();
return 0;
}
Приклад роботи програми:
Вхідний файл
for(int i=0;i<=10;i=1.45)
{2fl b;
2323.34 345 sdhj23 2222;
sf,d
dfs,
float i;
}
1
Проміжний файл:
іnt i = 0Z i 0Z i = 0D b 0D 0Z sdhj23 0Z sf d dfs float i 0Z
Результат
Висновок : у даній лабораторній роботі я навчився програмувати семантичний аналізатор.