2. REVISION: FLEX
• A flex program consists of three sections, separated
by %% lines, which are:
1. Definition Section: contains declarations and option
settings
• Any code inside of %{ and %} is copied through verbatim near
the beginning of the generated C source file
2. Rules Section: is a list of patterns and actions.
• Each pattern must start at the beginning of the line, since flex
considers any line that starts with whitespace to be code to be
copied into the generated C program.
Department of Computer Science -
7-11/4/12 2
Compiler Engineering Lab
3. REVISION: FLEX
• A flex program consists of three sections, separated
by %% lines, which are:
3. Sub-routines Section: is C code that is copied to the
generated scanner, usually small routines related to the
code in the actions.
• The C code at the end is a main program that calls yylex(), the
name that flex gives to the scanner routine, and then prints the
results
• Note:
• In the absence of any other arrangements, the scanner
reads from the standard input
Department of Computer Science -
7-11/4/12 3
Compiler Engineering Lab
4. REVISION: FLEX
• yytext is set to point to the input text that the
pattern just matched.
• Each Token Flex returns has two parts:
1. The Token (The Token Zero always means End-of-File)
2. The Token Value
Department of Computer Science -
7-11/4/12 4
Compiler Engineering Lab
5. REGULAR EXPRESSIONS
Regular Meaning
Expression
Symbol
+ Match one or more of the preceding patterns
* Match Zero or more of the preceding patterns
| Or
. Any character except new line
n New line
[] Character Class
- Range
^ Not (Negative), ^ at the beginning of the character class
means to match any character other than the ones in the
class
Department of Computer Science -
7-11/4/12 5
Compiler Engineering Lab
6. REVISION: FLEX
• Ex: for the input (3+44+100) which regular expression will be
used?
digit [0-9]
%%
“+” {printf (“Plusn”);}
[a-zA-Z] {printf (“IDn”);}
digit+ {printf (“Plusn”);}
([0-9]digit) {printf (“Plusn”);}
%%
• What happens If Flex matches two patterns:
• It will take the longer match (number of characters)
• If both were equal in length, it will take the first match to
appear.
Department of Computer Science -
7-11/4/12 6
Compiler Engineering Lab
7. USING FLEX TOOL
1. $ flex WordCount.l
• First we tell flex to translate our program, and in classic Unix
fashion since there are no errors, it does so and says
nothing.
2. $ cc lex.yy.c –lfl
• Then we compile lex.yy.c, the C program it generated; link it
with the flex library, -lfl
3. $ ./a.out
This is an example for compiler lab
• run it; and type a little input for it to count (to stop input to
file press Ctrl + D [or type End-of-File character: ^D on
Unix, ot ^Z on Windows]).
Department of Computer Science -
7-11/4/12 7
Compiler Engineering Lab
8. FLEX FILE EXAMPLE # 1:
CALCULATOR
• Write a Calculator .l scanner, returning token for
following lexemes:
• Plus +
• Minus –
• Multiplication *
• division /
• Absolute|
• Number types and values
• End of line
• White space
• Any other character print an error message
Department of Computer Science -
7-11/4/12 8
Compiler Engineering Lab
9. * recognize tokens for the calculator and print them out */
Cal.l
%%
“+” { printf("PLUSn"); }
“-” { printf("MINUSn"); }
“*” { printf("TIMESn"); }
“/” { printf("DIVIDEn"); }
“|” { printf("ABSn"); }
[0-9]+ { printf("NUMBER %sn", yytext); }
n { printf("NEWLINEn"); }
[ t] { }
{ printf("Mystery character %sn", yytext); }
%%
Department of Computer Science -
7-11/4/12 9
Compiler Engineering Lab
10. FLEX FILE EXAMPLE # 2:
CALCULATOR
• Adjust the Calculator.l scanner written in the
previous example (#1), where the scanner will
return the value of the tokens instead of printing
them:
• NUMBER = 258,
ADD = 259,
SUB = 260,
MUL = 261,
DIV = 262,
ABS = 263,
EOL = 264 end of line
Department of Computer Science -
7-11/4/12 10
Compiler Engineering Lab
11. /* recognize tokens for the calculator and print them out */ Cal2.l
%{
enum yytokentype {
NUMBER = 258, ADD = 259, SUB = 260, MUL = 261, DIV = 262, ABS = 263, EOL = 264};
int yylval;
%}
%%
”+” { return ADD; }
”-” { return SUB; }
”*” { return MUL; }
”/” { return DIV; }
”|” { return ABS; }
[0-9]+ { yylval = atoi(yytext); return NUMBER; }
n { return EOL; }
[ t] { /* ignore whitespace */ }
. { printf("Mystery character %cn", *yytext); }
%%
main(int argc, char **argv)
{ int tok;
while(tok = yylex())
{ printf("%d", tok);
if(tok == NUMBER)
printf(" = %dn", yylval);
else printf("n");
}}
Department of Computer Science -
7-11/4/12 11
Compiler Engineering Lab
12. FLEX FILE EXAMPLE # 3:
WORD COUNTER
• Write a Flex file that is capable to produce a
scanner that counts:
• Characters,
• New lines,
• And words
Department of Computer Science -
7-11/4/12 12
Compiler Engineering Lab
13. WordCount.l
/* just like Unix wc */
%{
int chars = 0;
int words = 0;
int lines = 0;
%}
%%
[a-zA-Z]+ { words++; chars += strlen(yytext); }
n { chars++; lines++; }
. { chars++; }
%%
main(int argc, char **argv)
{
yylex();
printf("%8d%8d%8dn", lines, words, chars);
}
Department of Computer Science -
7-11/4/12 13
Compiler Engineering Lab
14. QUESTIONS?
Thank you for listening
Department of Computer Science -
7-11/4/12 14
Compiler Engineering Lab