System Programming (2150708) : Topic: Implementation of Lexical Analyser Using LEX Utility Tool in UNIX
System Programming (2150708) : Topic: Implementation of Lexical Analyser Using LEX Utility Tool in UNIX
System Programming (2150708) : Topic: Implementation of Lexical Analyser Using LEX Utility Tool in UNIX
Prepared By:
Divya Shah 160110107011
Viraj Parekh 170113107011
STEPS
1. Lex program contains three sections: definitions, rules, and user
subroutines. Each section must be separated from the others by a line
containing only the delimiter, %%. The format is as follows: definitions
%% rules %% user_subroutines.
2. In definition section, the variables make up the left column, and their
definitions make up the right column. Any C statements should be enclosed
in %{..}%. Identifier is defined such that the first letter of an identifier is
alphabet and remaining letters are alphanumeric.
3. In rules section, the left column contains the pattern to be recognized in an
input file to yylex(). The right column contains the C program fragment
executed when that pattern is recognized. The various patterns are
keywords, operators, new line character, number, string, identifier,
beginning and end of block, comment statements, pre-processor directive
statements etc.
4. Each pattern may have a corresponding action, that is, a fragment of C
source code to execute when the pattern is matched.
5. When yylex() matches a string in the input stream, it copies the matched
text to an external character array, yytext, before it executes any actions in
the rules section.
6. In user subroutine section, main routine calls yylex(). yywrap() is used to
get more input.
SYSTEM PROGRAMMING (2150708)
7. The lex command uses the rules and actions contained in file to generate a
program, lex.yy.c, which can be compiled with the cc command. That
program can then receive input, break the input into the logical pieces
defined by the rules in file, and run program fragments contained in the
actions in file.
Source Code
//Implementation of Lexical Analyzer using Lex tool
%{
int COMMENT=0;
%}
identifier [a-zA-Z][a-zA-Z0-9]*
%%
#.* {printf("\n%s is a preprocessor
directive",yytext);}
int |
float |
char |
double |
while |
for |
struct |
typedef |
do |
if |
break |
continue |
void |
switch |
return |
else |
goto {printf("\n\t%s is a keyword",yytext);}
"/*" {COMMENT=1;}{printf("\n\t %s is a
COMMENT",yytext);}
{identifier}\( {if(!COMMENT)printf("\nFUNCTION
\n\t%s",yytext);}
\{ {if(!COMMENT)printf("\n BLOCK BEGINS");}
SYSTEM PROGRAMMING (2150708)
return(1);
}
INPUT
//var.c
#include<stdio.h>
#include<conio.h>
void main()
{
int a,b,c;
a=1;
b=2;
c=a+b;
printf("Sum:%d",c);
}
OUTPUT