Implementing Lexical Analyser in C++

Here is C++ implementation of Lexical analyser (a phase of compiler).

#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include<dos.h>
void main()
{
	int a,b,s,tc,t2;
	tc=0;
	s=50;
	char curr,c1,c2[10];
	FILE *l, *i, *t, *o, *db, *u;
	l= fopen("D:\\an\\literal.txt","w");
	i= fopen("D:\\an\\identifier.txt","w");
	t= fopen("D:\\an\\terminal.txt","w");
	u= fopen("D:\\an\\ust.txt","w");
	db= fopen("D:\\an\\db.txt","r");

	cout<<"\n Enter a string:";
	char st[40];
	for(a=0;a<s;a++)
	{
		cin>>st[a];
		if(st[a]=='$')
		{
			break;
		}
	}

	cout<<"\n Entered String:";
	for(a=0;a<s;a++)
	{
		if(st[a]=='$')
		{
			break;
		}
		cout<<st[a];
	}

	for(a=0;a<s;a++)
	{
		//Scan if it is in db
		curr=st[a];
		if(st[a]=='$')
		{
			break;
		}

		db=fopen("D:\\an\\db.txt","r");
		while(1==1)
		{
			if(feof(db))
			{
				break;
			}
			fscanf(db,"%c",&c1);
			if(c1==curr)
			{
				//cout<<"\n Found";
				fprintf(t,"\n%i %c",tc,c1);
				tc++;
				break;
			}
		}
	}

	tc=0;

	for(a=0;a<s;a++)
	{
		curr=st[a];
		if(st[a]=='$')
		{
			break;
		}

		if(isalpha(curr))
		{
			fprintf(i,"\n%i %c",tc,curr);
			tc++;
		}
	}

	tc=0;

	for(a=0;a<s;a++)
	{
		curr=st[a];
		if(st[a]=='$')
		{
			break;
		}

		if(isdigit(curr))
		{
			
			fprintf(l,"\n");
			fprintf(l,"%i %c",tc,curr);
			
			b=a;
			b++;
			if(b<s && isdigit(st[b]))
			{
				fprintf(l,"%c",st[b]);
				a=b;
			}

			b++;
			if(b<s && isdigit(st[b]))
			{
				fprintf(l,"%c",st[b]);
				a=b;
			}

			tc++;
		}
	}

	fclose(l);
	fclose(i);
	fclose(t);
	fclose(db);

	cout<<"\n Tokens Generated\n";
	cout<<"\n Uniform symbol table";
	cout<<"\nToken\tType\tPointer\n";
	//building uniform symbol table
	l= fopen("D:\\an\\literal.txt","r");
	i= fopen("D:\\an\\identifier.txt","r");
	t= fopen("D:\\an\\terminal.txt","r");
	for(a=0;a<20;a++)
	{
		if(!feof(l)&&fgetc(l)!=-1)
		{
			fscanf(l,"%i %s",&t2,&c2);
			fprintf(u,"%s LIT %i\n",c2,t2);
			printf("%s\tLIT\t%i\n",c2,t2);
		}
		if(!feof(i)&&fgetc(i)!=-1)
		{
			fscanf(i,"%i %s",&t2,&c2);
			fprintf(u,"%s IDN %i\n",c2,t2);
			printf("%s\tIDN\t%i\n",c2,t2);
		}
		if(!feof(t)&&fgetc(t)!=-1)
		{
			fscanf(t,"%i %s",&t2,&c2);
			fprintf(u,"%s TER %i\n",c2,t2);
			printf("%s\tTER\t%i\n",c2,t2);
		}
	}
	
	fclose(u);
	fclose(i);
	fclose(t);
	fclose(l);
	cout<<"\n Uniform Symbol table constructed";

	getch();
}

/* OUTPUT


 Enter a string:a=b+c*(60/j)+k*80$

 Entered String:a=b+c*(60/j)+k*80
 Tokens Generated

 Uniform symbol table
Token   Type    Pointer
60      LIT     0
a       IDN     0
=       TER     0
80      LIT     1
b       IDN     1
+       TER     1
c       IDN     2
*       TER     2
j       IDN     3
(       TER     3
k       IDN     4
/       TER     4
)       TER     5
+       TER     6
*       TER     7

 Uniform Symbol table constructed

*/

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.