Me and my friend M.H Riyad made this lexical analyzer:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
// freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
int v=0,n=0,k=0;
string STRING;
string str;
string var[555];
string op;
string num[500];
string deli;
string key[500];
ifstream file;
file.open ("in.txt");
while(!file.eof()) // To get you all the lines.
{
getline(file,STRING); // Saves the line in STRING.
// cout<<STRING<<endl; // Prints our STRING.
str=STRING;
int len=str.length();
for(int i=0; i<len;)
{
// cout<<str[i]<<endl;
if(str[i]==')'||str[i]=='('||str[i]=='{'||str[i]=='}'||str[i]=='['||str[i]==']'||str[i]==';'||str[i]=='<')
{
deli+=str[i];
i++;
}
if(str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/'||str[i]=='^'||str[i]=='='||str[i]=='>'||str[i]=='<')
{
op+=str[i];
i++;
}
if(isalpha(str[i]))
{
string s="";
while(isalpha(str[i])||isdigit(str[i])||str[i]=='_'||str[i]=='$')
{
s+=str[i];
i++;
}
if(s=="int"||s=="void"||s=="char"||s=="main"||s=="double"||s=="float") key[k++]=s;
else var[v++]=s;
}
if(isdigit(str[i]))
{
string s="";
while(isdigit(str[i]))
{
s+=str[i];
i++;
}
num[n++]=s;
}
if(str[i]==' ') i++;
}
}
file.close();
printf("\n...........printing the literals are..........\n");
for(int i=0; i<n; i++) cout<<num[i]<<endl;
printf("\n...........printing the operators are..........\n");
for(int i=0; i<op.size(); i++) cout<<op[i]<<endl;
printf("\n...........printing the variables are..........\n");
for(int i=0; i<v; i++) cout<<var[i]<<endl;
printf("\n...........printing the keywords are..........\n");
for(int i=0; i<k; i++) cout<<key[i]<<endl;
printf("\n...........printing the delemeter are..........\n");
for(int i=0; i<deli.size(); i++) cout<<deli[i]<<endl;
printf("\n\n\n\n");
return 0;
}
References:
http://www.coders-hub.com/2013/05/c-code-for-lexical-analysis.html#.Vo4Ui1LX0-B
http://cnuinfotech-cd.blogspot.com/2012/06/tokens-patterns-and-lexemes.html