#include "stdio.h"
#include "string.h"
#define ANDLEXEME 11
#define ARRAYLEXEME 12
//
//
char lexemes[100][20];
char lexemeval[20];
FILE *in,*out;
void getlexeme();
void error(int n);
int lexeme;
int linepos;
int i;
int main()
{
strcpy(lexemes[DOT] , ". ");
strcpy(lexemes[CONSTANTINT], "NumIn");
strcpy(lexemes[CONSTANTREAL],"NumRe");
strcpy(lexemes[IDENTIFIER] ,"ID ");
strcpy(lexemes[COMMA] ,", ");
strcpy(lexemes[ASSIGN] ,":= ");
strcpy(lexemes[SEMICOLON] ,"; ");
strcpy(lexemes[LBRACKET] ,"[ ");
strcpy(lexemes[RBRACKET] ,"] ");
strcpy(lexemes[LPRANTEZ] ,"( ");
strcpy(lexemes[RPRANTEZ] ,") ");
strcpy(lexemes[ANDLEXEME],"AND");
strcpy(lexemes[ARRAYLEXEME] ,"ARRAY");
strcpy(lexemes[BEGINLEXEME],"BEGIN");
strcpy(lexemes[CASELEXEME],"CASE");
strcpy(lexemes[CONSTLEXEME] ,"CONST");
strcpy(lexemes[DIVLEXEME] ,"DIV");
strcpy(lexemes[ANDLEXEME],"DO");
strcpy(lexemes[ARRAYLEXEME] ,"DOWNTO");
strcpy(lexemes[ANDLEXEME],"ELSE");
strcpy(lexemes[ARRAYLEXEME] ,"END");
strcpy(lexemes[FILELEXEME],"FILE");
strcpy(lexemes[FORLEXEME] ,"FOR");
strcpy(lexemes[FUNCTIONLEXEME],"FUNCTION");
strcpy(lexemes[GOTOLEXEME],"GOTO");
strcpy(lexemes[IFLEXEME] ,"IF");
strcpy(lexemes[INLEXEME] ,"IN");
strcpy(lexemes[LABELLEXEME],"LABEL");
strcpy(lexemes[MODLEXEME] ,"MOD");
strcpy(lexemes[NILLEXEME],"NIL");
strcpy(lexemes[NOTLEXEME] ,"NOT");
strcpy(lexemes[OFLEXEME],"OF");
strcpy(lexemes[ORLEXEME] ,"OR");
strcpy(lexemes[PACKEDLEXEME],"PACKED");
strcpy(lexemes[PROCEDURELEXEME],"PROCEDURE");
strcpy(lexemes[PROGRAMLEXEME] ,"PROGRAM");
strcpy(lexemes[RECORDLEXEME] ,"RECORD");
strcpy(lexemes[REPEATLEXEME],"REPEAT");
strcpy(lexemes[SETLEXEME] ,"SET");
strcpy(lexemes[TYPELEXEME],"TYPE");
strcpy(lexemes[UNTILLEXEME] ,"UNTIL");
strcpy(lexemes[WHILELEXEME],"WHILE");
strcpy(lexemes[THENLEXEME] ,"THEN");
strcpy(lexemes[TOLEXEME],"TO");
strcpy(lexemes[VARLEXEME] ,"VAR");
strcpy(lexemes[UNKNOWN] ,"? ");
strcpy(lexemes[DONE] ,"DONE ");
strcpy(lexemes[ADD] ,"+ ");
strcpy(lexemes[SUB] ,"- ");
strcpy(lexemes[MUL] ,"* ");
strcpy(lexemes[DIVD] ,"/ ");
strcpy(lexemes[GT] ,"> ");
strcpy(lexemes[LT] ,"< ");
strcpy(lexemes[GE] ,">= ");
strcpy(lexemes[LE] ,"<= ");
strcpy(lexemes[EQ] ,"= ");
strcpy(lexemes[NE] ,"<> ");
strcpy(lexemes[0] ," ");
in=fopen("c:\\input.txt","r");
out=fopen("c:\\output.txt","w");
if(!in)
{
printf("can't open in.txt file, check it!!!\n");
return 1;
}
fprintf(out,"----\n");
fprintf(out,"\t\t --- Lexical Phase Started ---\n\n");
while(!feof(in))
{
getlexeme();
fprintf(out,"%s ",lexemes[lexeme]);
if(lexeme==IDENTIFIER)
fprintf(out,"%s\n",lexemeval);
else if(lexeme==CONSTANTINT || lexeme==CONSTANTREAL)
fprintf(out,"%s\n",lexemeval);
else
fprintf(out,"\n");
}
fprintf(out,"\n\t\t --- Lexical Phase Ended ---\n");
fprintf(out,"---\n");
}
void getlexeme()
{
int len;
int counter;
int charno;
char chtemp;
char ch;
char nextch;
char name[20];
char kname[20];
fscanf(in,"%c",&ch);
while(!feof(in) && (ch==' ' || ch=='{' || ch=='\n' || ch=='\t'))
{
if(ch=='{')
do
{
fscanf(in,"%c",&ch);
}while(ch!='}');
if(ch=='\n')
linepos++;
fscanf(in,"%c",&ch);
}
if (feof(in))
lexeme=DONE;
else if(ch=='.')
{
lexeme=DOT;
fscanf(in,"%c",&nextch);
if(nextch<='9' && nextch>='0')
{
fseek(in,-2,SEEK_CUR);
fscanf(in,"%s",name);
counter=0;
kname[counter++]='.';
while((name[counter]>='0' && name[counter]<='9'))
kname[counter]=name[counter++];
kname[counter]='\0';
len=strlen(kname)-strlen(name);
fseek(in,len,SEEK_CUR);
strcpy(lexemeval,kname);
lexeme=CONSTANTREAL;
}
else
{
fseek(in,-1,SEEK_CUR);
}
}
else if (ch<='9' && ch>='0')
{
fseek(in,-1,SEEK_CUR);
fscanf(in,"%s",name);
counter=0;
while((name[counter]>='0' && name[counter]<='9'))
kname[counter]=name[counter++];
lexeme=CONSTANTINT;
if(name[counter]=='.')
{
lexeme=CONSTANTREAL;
kname[counter]=name[counter++];
kname[counter+1]='0';
while((name[counter]>='0' && name[counter]<='9'))
kname[counter]=name[counter++];
}
kname[counter]='\0';
len=strlen(kname)-strlen(name);
fseek(in,len,SEEK_CUR);
strcpy(lexemeval,kname);
}
else if ((ch<='Z' && ch>='A')||(ch<='z' && ch>='a'))
{
fseek(in,-1,SEEK_CUR);
fscanf(in,"%s",name);
counter=0;
while((name[counter]>='A' && name[counter]<='Z') || (name[counter]>='0' && name[counter]<='9') || (name[counter]>='a' && name[counter]<='z'))
kname[counter]=name[counter++];
kname[counter]='\0';
len=strlen(kname)-strlen(name);
fseek(in,len,SEEK_CUR);
lexeme=0;
for(i=0;i<strlen(kname);i++)
if(kname[i]<='z' && kname[i]>='a')
kname[i]-=32;
for(i=11;i<=44;i++)
if(strcmp(kname,lexemes[i])==0)
lexeme=i;
if(!lexeme)
{
lexeme=IDENTIFIER;
strcpy(lexemeval,kname);
}
}
else if(ch==',')
lexeme=COMMA;
else if(ch==';')
lexeme=SEMICOLON;
else if(ch=='[')
lexeme=LBRACKET;
else if(ch==']')
lexeme=RBRACKET;
else if(ch=='(')
lexeme=LPRANTEZ;
else if(ch==')')
lexeme=RPRANTEZ;
else if(ch=='+')
{
lexeme=ADD;
}
else if(ch=='-')
{
lexeme=SUB;
}
else if(ch=='*')
{
lexeme=MUL;
}
else if(ch=='/')
{
lexeme=DIVD;
}
else if(ch=='=')
{
lexeme=EQ;
}
else if(ch==':')
{
fscanf(in,"%c",&nextch);
if(nextch=='=')
lexeme=ASSIGN;
else
{
fseek(in,-1,SEEK_CUR);
}
}
else if(ch=='>' || ch=='<')
{
fscanf(in,"%c",&nextch);
if(nextch=='=')
{
if(ch=='<')
lexeme=LE;
else if(ch=='>')
lexeme=GE;
}
else if(ch=='<' && nextch=='>')
{
lexeme=NE;
}
else
{
fseek(in,-1,SEEK_CUR);
if(ch=='<')
lexeme=LT;
else if(ch=='>')
lexeme=GT;
}
}
else
{
lexeme=UNKNOWN;
error(1);
}
}
void error(int n)
{
fprintf(out,"\nerror");
}