Міністерство освіти і науки України
Національний університет “Львівська політехніка”
Інститут прикладної математики та фундаментальних наук
Кафедра прикладної математики
Звіт
Лабораторна робота №2
“Лексичний аналізатор”
Завдання до лабораторної роботи:
Розглянути підмножину мови Pascal,у якій є ідентифікатори,цілі константи,які використовуються у операторах опису(типи змінних –real,integer),оператори присвоєння,умовні оператори(коротка або довга форма,умова-одна операція порівняння).
Код програми
# include <iostream.h>
# include <iomanip.h>
# include <conio.h>
# include <stdlib.h>
# include <string.h>
# include <stdio.h>
# include <fstream.h>
# define lexsize 30
char lit,lex[lexsize],syn;
int cl,i,j,k,l;
int pr;
FILE *fr,*fw;
void getlit();
void scan();
int main(int argc, char* argv[])
{
for (i=0;i<lexsize;i++)
lex[i]=' ';
fr=fopen("f1.txt","r");
fw=fopen("f2.txt","w");
lit=' ';
while(!feof(fr))
{
scan();
fprintf(fw,"%c\t%s\n",syn,lex);
cout<<syn<<' '<<' '<<' '<<lex<<"\n";
}
fclose(fr);
fclose(fw);
getch();
}
void scan()
{
i=0;
pr=0;
while((lit==' ') || (lit=='\t') || (lit=='\n') )
getlit();
switch (cl)
{
case 1 : lex[i++]=lit; getlit();
while (cl<=2)
{
lex[i++]=lit;
getlit();
}
lex[i]='\0'; //zakrutu masyv
if ( strcmp("if",lex)==0 )
{
syn='F';
pr=1;
}
if ( strcmp("else",lex)==0 )
{
syn='L';
pr=1 ;
}
if ( strcmp("then",lex)==0 )
{
syn='T';
pr=1 ;
}
if ( strcmp("begin",lex)==0 )
{
syn='B';
pr=1 ;
}
if ( strcmp("var",lex)==0 )
{
syn='V';
pr=1 ;
}
if ( strcmp("real",lex)==0 )
{
syn='R';
pr=1 ;
}
if ( strcmp("integer",lex)==0 )
{
syn='G';
pr=1 ;
}
if ( strcmp("end",lex)==0 )
{
syn='N';
pr=1 ;
}
if ( strcmp("and",lex)==0 )
{
syn='D';
pr=1 ;
}
if ( strcmp("or",lex)==0 )
{
syn='J';
pr=1 ;
}
if ( strcmp("const",lex)==0 )
{
syn='M';
pr=1 ;
}
if (pr==0)
{
syn='I';
}
break;
case 2 : lex[i++]=lit; getlit();
while (cl==2 )
{
lex[i++]=lit;
getlit();
}
syn='C';
lex[i]='\0';
break;
case 3 : lex[0]=lit; lex[1]='\0';
syn=lit; getlit(); break;
case 4: lex[i++]=lit; syn='O';
getlit();
if(lit=='=')
{
lex[i++]=lit;
syn='O';
getlit();
}
lex[i]='\0';
break;
case 5: lex[i++]=lit; syn='O';
getlit();
if(lit=='=')
{
lex[i++]=lit;
syn='O';
getlit();
}
if(lit=='>')
{
lex[i++]=lit;
syn='O';
getlit();
}
lex[i]='\0';
break;
case 6: lex[0]=lit;
getlit();
syn='O';
lex[1]='\0';
break;
case 7: lex[0]=lit;
getlit();
syn='A';
lex[1]='\0';
break;
case 8: lex[i++]=lit; syn=':';
getlit();
if(lit=='=')
{
lex[i++]=lit;
syn='S';
getlit();
}
lex[i]='\0';
break;
default:
lex[0]=lit;
lex[1]='\0';
syn='E';
getlit();
}
}
void getlit()
{
lit=fgetc(fr); cl=9;
if( (lit>='a') && (lit<='z') || (lit>='A') && (lit<='Z') ) cl=1;
if ( (lit>='0') && (lit<='9') ) cl=2;
if ( ( lit=='(' ) || ( lit==')' ) || (lit==';') || (lit==',') || (lit=='.') || (lit=='=') ) cl=3;
if (lit=='>') cl=4;
if (lit=='<') cl=5;
if (lit=='=') cl=6;
if ( ( lit=='+' ) || ( lit=='-' ) || (lit=='*') || (lit=='/') ) cl=7;
if (lit==':') cl=8;
}