You are on page 1of 10

flex

, 2005

flex

flex

C/C++
(fast lexical analyzer generator).

Unix lex.

flex

C/C++

flex

-lfl

C/C++

flex



%%

%%

/* */

C/C++ ,
%{ %}, ..
%{
#define TK_EOF
#define TK_ID

0
1

int lineCount = 0;
%}


, ..
letter
digit
identifier

[A-Za-z]
[0-9]
{letter}({letter}|{digit})*

flex , ..
%option noyywrap

flex

:
-

C/C++ %{ %}


yylex().

Default
.

flex

( %%).

C/C++
.

(
).

x
\x

\123
\x2a
.
[xyz]
[abm-sx]
[^A-Z]
r*
r+
r?
r{2,5}
r{2,}
r{2}
{name}
"[ab]\"c"
(r)

flex

(matches)
x
x
a, b, f, n, r, t, v, ANSI
, x
(
)
123
2a

(new line).
x, y, z.
( )

a, b, m s, x .( m s)

A Z.
\n.

r

r

r ( r)
2 5
r.
2
r.
2
r.

name
.
[ab]"c
r (
).
5

(matches)

r|s
rs
r/s

^r
r$
<s>r
<s1,s2>r
<*>r
<<EOF>>
<s1,s2><<EOF>>

r s
r

s ().
r

s (
yytext).
r
.
r
.
r
s.
r
s1 s2.
r
.
.

s1 s2.

ECHO
REJECT
|

flex


.


.

( ).
6


%{
#define TK_EOF
#define TK_ID
#define TK_INT
#define TK_FLOAT
#define TK_ASSGN
%}
white
letter
digit
dot
sign
exp

0
1
2
3
4

[ \n\t]
[A-Za-z]
[0-9]
[\.]
[\+\-]
[Ee]{sign}?{digit}{1,3}

%%
{white}*

{ /* nothing */

{letter}({letter}|{digit})* { return TK_ID;


":="
{sign}?{digit}+

{ return TK_ASSGN; }
{ return TK_INT; }

{sign}?{digit}+{dot}{digit}*{exp}? |
{sign}?{digit}*{dot}{digit}+{exp}? {
return TK_FLOAT;
}
%%
int main ()
{
int token;
while ((token = yylex()) != TK_EOF)
printf("Token %d: %s\n", token, yytext);
}

flex


> flex example1.l
> gcc -o example1 lex.yy.c -lfl
> example1 < example1.tst

Token
Token
Token
Token
Token
Token
Token
Token
Token
Token
Token
Token
Token
Token
Token
Token
Token
Token

example1.tst
i
abc
e10
i4i
jj1
123

:=
:=
:=
:=
:=
:=

0
-5
0.1
-6.3e-4
4.e+2
.1e-198

example1

1:
4:
2:
1:
4:
2:
1:
4:
3:
1:
4:
3:
1:
4:
3:
2:
4:
3:

i
:=
0
abc
:=
-5
e10
:=
0.1
i4i
:=
-6.3e-4
jj1
:=
4.e+2
123
:=
.1e-198


flex
flex
o manual
:
www.ced.tuc.gr/~manolis/courses/compilers/top.html

flex



.
,
.

char * yytext

yylex.

int yyleng
yytext.
void yymore()
yytext
yylex.
void yyless(n)
yytext n

int n;
.
.
FILE * yyin
.
FILE * yyout

void
yyrestart(f) FILE * f.
f;

int input()
.
void unput(c)
c
.
char c;
Macro
yyterminate()
yylex 0.

int yywrap()
. 1,
,
0 .
int yylex()

flex

,

.

(inclusive)
(exclusive).

, :
%s INCLUSIVE
%x EXCLUSIVE


macros
.

INITIAL
0.


macro YY_START.


macro BEGIN(new).


:
<SPECIAL>[A-Za-z]+ { ECHO; }

flex

10

You might also like