6 compiler lab - flex

14
LAB # 6: FLEX COMPILER ENGINEERING

Upload: mashaelq

Post on 18-Jun-2015

1.189 views

Category:

Education


5 download

DESCRIPTION

Working with Flex under Cygwin

TRANSCRIPT

Page 1: 6 compiler lab - Flex

L A B # 6 : F L E X

COMPILER ENGINEERING

Page 2: 6 compiler lab - Flex

Department of Computer Science - Compiler Engineering Lab

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.

7-11/4/12

Page 3: 6 compiler lab - Flex

Department of Computer Science - 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

7-11/4/12

Page 4: 6 compiler lab - Flex

Department of Computer Science - 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

7-11/4/12

Page 5: 6 compiler lab - Flex

Department of Computer Science - Compiler Engineering Lab

5

REGULAR EXPRESSIONS

Regular Expression

Symbol

Meaning

+ 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

7-11/4/12

Page 6: 6 compiler lab - Flex

Department of Computer Science - Compiler Engineering Lab

6

REVISION: FLEX

• Ex: for the input (3+44+100) which regular expression will be used? digit[0-9]

%% “+” {printf (“Plus\n”);}[a-zA-Z] {printf (“ID\n”);}digit+ {printf (“Plus\n”);}([0-9]digit) {printf (“Plus\n”);}%%

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

7-11/4/12

Page 7: 6 compiler lab - Flex

Department of Computer Science - 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.outThis 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]).

7-11/4/12

Page 8: 6 compiler lab - Flex

Department of Computer Science - 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

7-11/4/12

Page 9: 6 compiler lab - Flex

Department of Computer Science - Compiler Engineering Lab

97-11/4/12

* recognize tokens for the calculator and print them out */ %%“+” { printf("PLUS\n"); }“-” { printf("MINUS\n"); }“*” { printf("TIMES\n"); }“/” { printf("DIVIDE\n"); }“|” { printf("ABS\n"); }[0-9]+ { printf("NUMBER %s\n", yytext); }\n { printf("NEWLINE\n"); }[ \t] { }. { printf("Mystery character %s\n", yytext); } %%

Cal.l

Page 10: 6 compiler lab - Flex

Department of Computer Science - 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

7-11/4/12

Page 11: 6 compiler lab - Flex

Department of Computer Science - Compiler Engineering Lab

117-11/4/12

/* recognize tokens for the calculator and print them out */ %{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 %c\n", *yytext); } %%main(int argc, char **argv) { int tok;

while(tok = yylex()) { printf("%d", tok);

if(tok == NUMBER) printf(" = %d\n", yylval);

else printf("\n"); } }

Cal2.l

Page 12: 6 compiler lab - Flex

Department of Computer Science - 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

7-11/4/12

Page 13: 6 compiler lab - Flex

Department of Computer Science - Compiler Engineering Lab

137-11/4/12

/* 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%8d\n", lines, words, chars); }

WordCount.l

Page 14: 6 compiler lab - Flex

Department of Computer Science - Compiler Engineering Lab

14

QUESTIONS?

Thank you for listening

7-11/4/12