Compiler Programs

Download as pdf or txt
Download as pdf or txt
You are on page 1of 5

Ex.

No: 3 Implementation of Lexical Analyzer using LEX tool


Date:

Aim:
To implement the lexical analyzer using LEX tool.

Algorithm:
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, %%.
2. The format is as follows:
definitions
%%
rules
%%
user_subroutines

3. 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.
4. 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, preprocessor
directive statements etc.

5. Each pattern may have a corresponding action, that is, a fragment of C source code to
execute when the pattern is matched.

6. 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.

7. In user subroutine section, main routine calls yylex(). yywrap() is used to get more
input.

8. 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.
PROGRAM:

3.(a) Finding the capital:

%{
%}
%%
[A-Z]+[ \t\n\.\,] {printf("%s",yytext);}
. ;
%%
main()
{
printf("\n Enter some input with capital words in between:\n");
yylex();
}
int yywrap()
{
return 1;
}

OUTPUT:

[CSE@localhost ~]$ lex lex3a.l


[CSE@localhost ~]$ cc lex.yy.c
[CSE@localhost ~]$. /a.out
Enter some input with capital words in between:
I am PROUD of you – INDIA
I PROUD INDIA
3.(b) To display the Keywords and identifiers in the given program:
%{
int COMMENT=0;
%}
identifier[a-z|A-Z][a-z|A-Z|0-9]*
%%
#.* {printf("\n%s is a preprocesor directive",yytext);}
int {printf("\n\t%s is a keyword",yytext);}
float {printf("\n\t%s is a keyword",yytext);}
double {printf("\n\t%s is a keyword",yytext);}
char {printf("\n\t%s is a keyword",yytext);}
if {printf("\n\t%s is a keyword",yytext);}
else {printf("\n\t%s is a keyword",yytext);}
while {printf("\n\t%s is a keyword",yytext);}
do {printf("\n\t%s is a keyword",yytext);}
return {printf("\n\t%s is a keyword",yytext);}
break {printf("\n\t%s is a keyword",yytext);}
continue {printf("\n\t%s is a keyword",yytext);}
void {printf("\n\t%s is a keyword",yytext);}
switch {printf("\n\t%s is keyword",yytext);}
for {printf("\n\t%s is a keyword",yytext);}
typedef {printf("\n\t%s is a keyword",yytext);}
struct {printf("\n\t%s is a keyword",yytext);}
goto {printf("\n\t%s is a keyword",yytext);}
"/*" {COMMENT=1;}
"*/" {COMMENT=0;}
{identifier}\( {if(!COMMENT) printf("\nFUNCTIONS\n\t%s",yytext);}
\{ {if(!COMMENT) printf("\nBLOCK BEGINS");}
\} {if(!COMMENT) printf("\nBLOCK ENDS");}
{identifier} {if(!COMMENT) printf("\n%sIDENTIFIER",yytext);}
{identifier}(\[[0-9]*\])?\( {if(!COMMENT)
printf("\n%sIDENTIFIER",yytext);}
\".*\" {if(COMMENT)printf("\n\t%s is a string",yytext);}
[0-9]+ {if(COMMENT)printf("\n\t%s is a number",yytext);}
\)(\;)? {if(!COMMENT)printf("\n\t");ECHO;printf("\n");}
\(ECHO;
= {if(!COMMENT) printf("\n\t%s is an assignment operator",yytext);}
\> {if(!COMMENT) printf("n\t%s is a relational operator",yytext);}
\\n
%%
int main(int argc,char **argv)
{
if(argc>1)
{
FILE *file;
file=fopen(argv[1],"r");
if(!file)
{
printf("COULD NOT OPEN %s\n",argv[1]);
exit(1);
}
yyin=file;
}
yylex();
printf("\n\n");
return 0;
}
int yywrap()
{
return 0;
}
Input: <var.c>
#include<stdio.h>
main()
{
int a,b;
}
Output:
[CSE@localhost ~]$ lex lex3b.l
[CSE@localhost ~]$ gcc lex.yy.c -II
[CSE@localhost ~]$. /a.out var.c
#include<stdio.h> is a preprocesor directive
FUNCTIONS
main
(
)
BLOCK BEGINS
int is a keyword
aIDENTIFIER,
bIDENTIFIER;
BLOCK ENDS

Result:
Thus the c program to implementing the lex analyzer using Lex tool was executed successfully
and the output was verified.

You might also like