Compiler 8
Compiler 8
Compiler 8
COMPILER CONSTRUCTION(CS-636)
(LECTURE 9-10)
______________________________________________________
INSTRUCTOR: Gul Sher Ali
FLEX 2
AGENDA
Installtion of the flex tool
Basic structure of the flex script
Execution of the flex script in the flex tool
Syntax and Examples
Assignment Discussion
3
Specification File lex.l 4
%{
#include “tokdefs.h”
%}
D [0-9]
L [a-zA-Z_]
id {L}({L}|{D})*
%%
"void" {return(TOK_VOID);}
"int" {return(TOK_INT);}
"if" {return(TOK_IF);}
Specification File lex.l 5
"else" {return(TOK_ELSE);}
"while"{return(TOK_WHILE)};
"<=" {return(TOK_LE);}
">=" {return(TOK_GE);}
"==" {return(TOK_EQ);}
"!=" {return(TOK_NE);}
{D}+ {return(TOK_INT);}
{id} {return(TOK_ID);}
[\n]|[\t]|[ ] ;
%%
File tokdefs.h 6
#define TOK_VOID 1
#define TOK_INT 2
#define TOK_IF 3
#define TOK_ELSE 4
#define TOK_WHILE 5
#define TOK_LE 6
#define TOK_GE 7
#define TOK_EQ 8
#define TOK_NE 9
#define TOK_INT 10
#define TOK_ID 111
Invoking Flex 7
flex lex.l
g++ –c lex.cpp
g++ –c main.cpp
g++ –o lex.exe lex.o main.o
lex <main.cpp
Using Generated Scanner 10
void main()
{
FlexLexer lex;
int tc = lex.yylex();
while(tc != 0)
cout << tc << “,”
<<lex.YYText() << endl;
tc = lex.yylex();
}
Input Tokenized 11
258,tc
266,=
258,lex
291,.
258,yylex
283,(
284,)
290,;
263,while
Input Tokenized 13
283,(
258,tc
276,!=
257,0
284,)
258,cout
279,<<
258,tc
Input Tokenized 14
279,<<
292,","
279,<<
258,lex
291,.
258,YYText
283,(
284,)
279,<<
Input Tokenized 15
258,endl
290,;
258,tc
266,=
258,lex
291,.
258,yylex
283,(
284,)
290,;
286,}
16
Flex Examples
%{ } 17
#include<stdio.h> main()
int Upper=0; {
int Lower=0; extern FILE *yyin;
%} printf("Enter a string\n");
yyin();
%% yylex();
[A-Z] {printf("%s Uppercase\t", printf("abc: %s" , Upper);
yytext);Upper++;} }
[a-z] {printf("%s Lowercase\t",
yytext);Lower++;}
%%
int yywrap()
{
return 1;
%{ {ID} printf( "An identifier: %s\n",
#include <math.h> yytext );
#include <stdio.h> 18
"+"|"-"|"*"|"/" printf( "An operator:
%} %s\n", yytext );
DIGIT [0-9] "//"[^}\n]* /* eat up one-line
ID [a-z][a-z0-9]* comments */
%option noyywrap [ \t\n]+ /* eat up whitespace */
%% . printf( "Unrecognized character:
{DIGIT}+ { %s\n", yytext );
printf( "An integer: %s (%d)\n", %%
yytext, main( )
atoi( yytext ) ); {
} yylex();
{DIGIT}+"."{DIGIT}* { }
printf( "A float: %s (%g)\n", yytext,
atof( yytext ) );
}
if|then|begin|end|procedure|function
{
printf( "A keyword: %s\n", yytext
);
}
%{
#include<stdio.h>
int no; { 19
%} printf("No of digits=%d",no);
%%
[a-z] {printf("%s Is a Small Letter\n", }
yytext);}
[A-Z] {printf("%s Is a capital Letter\n",
yytext);} }
[0-9] {printf("%s Is a numeric data \n",
yytext);}
%%
int yywrap()
{
return 1;
}
main()
{
printf("Enter a Character");
int tc= yylex();
while (tc!=0)
%{
#include<stdio.h>
%} 20
%%
"int"|"if"|"else"|"while"|"do"|"switch"|
"case" {printf("Keyword");}
[a-zA-Z][a-z|0-9]* {printf("Identifier");}
[0-9]* {printf("Number");}
"!"|"@"|"*"|"&"|"^"|"%"|"$"|"#"
{printf("Special Character");}
. {printf("invalid data");}
%%
int yywrap()
{
return 1;
}
main()
{
printf("Enter a string of data\n");
yylex();
}
%{
#include<stdio.h>
int vowel=0; 21
int cons=0;
%}
%%
"a"|"e"|"i"|"o"|"u"|"A"|"E"|"I"|"O"|"U
" {printf("is a VOWEL");vowel++;}
[a-zA-z] {printf("Is a
Consonant");cons++;}
%%
int yywrap()
{
return 1;
}
main()
{
printf("Enter String\n");
yylex();
}
Flex Input for C++ 22
/*
* ISO C++ lexical analyzer.
* Based on the ISO C++ draft standard of December
'96.
*/
%{
#include <ctype.h>
#include <stdio.h>
#include “tokdefs.h"
int lineno;
"/*" { skip_comment(); }
"//" { skip_until_eol(); }
[a-zA-Z_][a-zA-Z_0-9]*
{ return check_identifier(yytext); }
%%
static int
yywrap(void)
{
return 1;
}
static void
34
skip_comment(void)
{
int c1, c2;
c1 = input();
c2 = input();