Creating a Lexical Analyzer in c - Insurance Tips

A Hub of Best Guide Health Insurance Tips

Sunday, May 22, 2022

Creating a Lexical Analyzer in c

 

/***************************************************************

Program describtion :

=====================

This program is for creating a Lexical Analyzer in c

 

Created by :

=============

Name  : Fahad Bader Al-buhairi

Email : q8_government@hotmail.com

phone : 009657991000

*****************************************************************/

 

 

/****************************************************************

Necessary Header files used in program.

*****************************************************************/

 

#include<stdio.h>

#include<string.h>

#include<conio.h>

#include<ctype.h>

 

/****************************************************************

Functions prototype.

*****************************************************************/

 

void   Open_File();

void   Demage_Lexeme();

int    Search(char[256],int);

void   analyze();

void   Skip_Comment();

void   Read_String();

void   Is_Keyword_Or_Not();

void   Is_Identifier_Or_Not();

void   Is_Operator_Or_Not();

void   Read_Number();

void   Is_Special_Or_Not();

void   Is_Comparison_Or_Not();

void   Add_To_Lexical (char[256],int,char[256]);

void   Print_ST();

void   Print_TOKEN();

void   Token_Attribute();

 

/****************************************************************

Data structure used in program.

*****************************************************************/

 

struct lexical

{

    char    data[256];          //Value of token.

    int     line[256];          //Line # which token appear in input

file.

    int     times;              //# of times that token appear in input

file.

    char    type[256];           //Type of each token.

    struct  lexical *next;

};

 

typedef struct lexical Lex;

typedef Lex *lex;

 

/****************************************************************

File pointer for accessing the file.

*****************************************************************/

 

FILE *fp;

FILE *st;

FILE *token;

char lexeme[256],ch;

int f,flag,line=1,i=1;

lex head=NULL,tail=NULL;

 

/****************************************************************

Array holding all keywords for checking.

*****************************************************************/

 

char

*keywords[]={"procedure","is","begin","end","var","cin","cout","if",

                                  "then","else","and","or","not","loop","exit","when",

                                  "while","until"};

 

/****************************************************************

Array holding all arithmetic operations for checking.

*****************************************************************/

 

char arithmetic_operator[]={'+','-','*','/'};

 

/****************************************************************

Array holding all comparison operations for checking.

*****************************************************************/

 

char *comparison_operator[]={"<",">","=","<=","<>",">="};

 

/****************************************************************

Array holding all special for checking.

*****************************************************************/

 

char special[]={'%','!','@','~','$'};

 

/****************************************************************

 

                                                **************

                                                *MAIN PROGRAM*

                                                **************

 

*****************************************************************/

 

void main()

{

  Open_File();

  analyze();

  fclose(fp);

  Print_ST();

  Print_TOKEN();

}

 

/****************************************************************

This function open input sourse file.

*****************************************************************/

 

void Open_File()

{

 

  fp=fopen("source.txt","r");   //provide path for source.txt here

  if(fp==NULL)

  {

                printf("!!!Can't open input file - source.txt!!!");

                getch();

                exit(0);

  }

}

 

/****************************************************************

Function to add item to structure of array to store data and

information of lexical items.

*****************************************************************/

 

void Add_To_Lexical (char value[256],int line,char type[256])

{

                lex new_lex;

 

                if (!Search(value,line))    //When return 1 the token not found.

                {

 

                  new_lex=malloc(sizeof(Lex));

 

                  if (new_lex!=NULL)

                  {

                                strcpy(new_lex->data,value);

                                new_lex->line[0]=line;

                                new_lex->times=1;

                                strcpy(new_lex->type,type);

                                new_lex->next=NULL;

 

                                if (head==NULL)

                                   head=new_lex;

                                else

                                   tail->next=new_lex;

 

                                tail=new_lex;

                  }

                }

}

 

/****************************************************************

Function to search token.

*****************************************************************/

 

int Search (char value[256],int line)

{

  lex x=head;

  int flag=0;

 

  while (x->next!=NULL && !flag)

  {

    if (strcmp(x->data,value)==0)

    {

      x->line[x->times]=line;

      x->times++;

      flag=1;

    }

    x=x->next;

  }

  return flag;

}

 

/****************************************************************

Function to print the ST.TXT .

*****************************************************************/

 

void Print_ST()

{

  lex x=head;

  int j;

 

  if ((st=fopen("ST.TXT","w"))==NULL)

      printf("The file ST.TXT cat not open.

");

 

  else

 

  {

    fprintf(st,"      %s             %s       %s

","Line#","Lexeme","Type");

    fprintf(st,"      ----             ------  ----

");

 

    while (x!=NULL)

    {

      if ((strcmp(x->type,"num")==0)         ||

                 (strcmp(x->type,"keyword")==0)      ||

                 (strcmp(x->type,"identifier")==0))

      {

                 fprintf(st,"         ");

 

                 for (j=0;j<x->times;j++)

                 {

                   fprintf(st,"%d",x->line[j]);

                                if (j!=x->times-1)      //This condition to prevent the comma

                   fprintf(st,",",x->line[j]);  //"," to not print after last line #.

                 }

 

                fprintf(st,"              %-6s                  %-6s

",x->data,x->type);

      }

      x=x->next;

    }

 

    fclose(st);

  }

}

 

/****************************************************************

Function to print the TOKENS.TXT .

*****************************************************************/

 

void Print_TOKEN()

{

  int flag=0;

 

  fp=fopen("source.txt","r");

 

    if(fp==NULL)

    {

       printf("!!!Can't open input file - source.txt!!!");

       getch();

       exit(0);

    }

 

  else

 

    {

                if ((token=fopen("TOKENS.TXT","w"))==NULL)

                  printf("The file ST.TXT cat not open.

");

 

      else

 

      {

                ch=fgetc(fp);

 

                while (!(feof(fp)))

                {

 

                  if (ch==' ' && !flag)

                  {

                    do

                      ch=fgetc(fp);

                    while (ch==' ');

 

                    fseek(fp,-2,1);

                    ch=fgetc(fp);

                    flag=1;

                  }

 

                  if (ch!='

' && ch!='            ')

                    fprintf(token,"%c",ch);

 

                  if (ch=='

')

                  {

                    fprintf(token,"

");

                    Token_Attribute();

                    i++;

                    flag=0;

                  }

 

                  ch=fgetc(fp);

                }

      }

    }

    fclose(fp);

    fclose(token);

}

 

/****************************************************************

Function to put the token and atrribute in TOKENS.TXT .

*****************************************************************/

 

void Token_Attribute()

{

  lex x=head;

  int j;

 

  while (x!=NULL)

  {

    if (x->line[0]==i)

    {

      fprintf(token,"token : %-4s    ",x->type);

 

      if ((strcmp(x->type,"num")==0)         ||

                 (strcmp(x->type,"keyword")==0)      ||

                 (strcmp(x->type,"identifier")==0))

 

      {

                  fprintf(token,"attribute : line#=%-4d

",i);

      }

 

      else

 

      {

                  fprintf(token,"attribute : %-4s

",x->data);

      }

 

    }

    x=x->next;

  }

  fprintf(token,"

");

}

 

/****************************************************************

Function to create lexical analysis.

*****************************************************************/

 

void analyze()

{

 

  ch=fgetc(fp);                      //Read character.

 

  while(!feof(fp))                   //While the file is not end.

  {

 

      if(ch=='

')                   //Compute # of lines in source.txt

.

                  {

                    line++;

                    ch=fgetc(fp);

                  }

 

      if(isspace(ch) && ch=='

' )

      {

                  line++;

                  ch=fgetc(fp);

      }

      if(isspace(ch) && ch!='

' )          //The character is space.

                  ch=fgetc(fp);

 

 

      if(ch=='/' || ch=='"')    //Function for skipping comments in the

file

                  Skip_Comment();          //and '"' with display statements.

 

 

      if(isalpha(ch))              //The character is leter.

                {

                    Read_String();

                    Is_Keyword_Or_Not();

                    Is_Operator_Or_Not();

                    Is_Identifier_Or_Not();

                }

 

 

      if(isdigit(ch))             //The character is digit.

                 Read_Number();

 

 

      if (ch==';')                //The character is semicolon.

                Add_To_Lexical(";",line,"semicolon");

 

 

      if (ch==':')                //The character is colon.

                Add_To_Lexical(":",line,"colon");

 

 

      if (ch==',')                //The character is comma.

                Add_To_Lexical(",",line,"comma");

 

 

      if (ch=='(')                //The character is parenthesis.

                Add_To_Lexical("(",line,"parenthesis");

 

 

      if (ch==')')                //The character is parenthesis.

                Add_To_Lexical(")",line,"parenthesis");

 

                                                                 //The character is comparison_operator

      if (ch=='<' || ch=='=' || ch=='>')

                Is_Comparison_Or_Not();

 

 

      Is_Special_Or_Not();       //After failed scaning in before cases

                                                                 //check the character is special or not.

      Demage_Lexeme();

 

      if(isspace(ch) && ch=='

' )

      {

                  line++;

                  ch=fgetc(fp);

      }

      else

      ch=fgetc(fp);

  }

}

 

/****************************************************************

This function read all character of strings.

*****************************************************************/

 

void Read_String()

{

  int j=0;

 

  do

  {

    lexeme[j++]=ch;

    ch=fgetc(fp);

  } while(isalpha(ch));

 

    fseek(fp,-1,1);

    lexeme[j]='

No comments:

Post a Comment