Escolar Documentos
Profissional Documentos
Cultura Documentos
008 IntroducaoFlex
008 IntroducaoFlex
Introduo ao Flex
Objectivos:
Familiarizao com a ferramenta FLEX;
Introduo ao reconhecimento de padres e expresses regulares;
Aprendizagem dos conceitos atravs da realizao de alguns exerccios;
Apresentar o ambiente de trabalho proposto (seco 1.6);
Relembrar alguns comandos bsicos de Linux importantes para a utilizao
do FLEX (seco 1.7).
1.1
Analisadores lxicos
1. Introduo ao Flex
1.2
ficheiro
fonte flex
.flex
FLEX
Erros de
compilao
ficheiro
fonte C
.c
Compilador
(gcc)
Ficheiro
texto n
Ficheiro
texto 2
Ficheiro
texto 1
programa
executvel
Resultado
n
Resultado
2
Resultado
1
1. Introduo ao Flex
flex ficheiro.flex
gcc lex.yy.c -lfl
./a.out
O comando flex gera, por omisso, um ficheiro com o nome lex.yy.c que
dever ser compilado, por exemplo com o gcc. Na utilizao do gcc necessrio
indicar a utilizao da biblioteca FLEX adicionando o parmetro -lfl. Por sua
vez, o compilador de C gera, por omisso, um ficheiro com o nome a.out. Por
ltimo, para a execuo deste programa basta a evocao do seu nome na linha
de comandos. Neste caso, a introduo dos dados ter de ser realizada via consola
(terminando obrigatoriamente com Ctrl+D).
flex Exemplo.flex -oExemplo.c
gcc Exemplo.c -o Programa -lfl
./Programa < Dados.txt
Neste exemplo, o comando flex gera a partir do ficheiro Exemplo.flex, o
ficheiro com o nome Exemplo.c que dever ser compilado. Nesta utilizao apresentada do gcc, indicado o nome do executvel a ser gerado, neste caso, Programa.
Na execuo do Programa, a introduo dos dados realizada a partir do ficheiro
Dados.txt.
1.3
%{
int numChars=0;
2
3
%}
4
5
%%
6
7
{
numChars++;
p r i n t f ( "%s " , y y t e x t ) ;
8
9
10
11
12
\n
{
numChars++;
p r i n t f ( "\n" ) ;
13
14
15
1. Introduo ao Flex
16
17
%%
18
19
20
21
22
main ( )
{
yylex ( ) ;
p r i n t f ( "Nmero de c a r a c t e r e s %d\n" , numChars ) ;
23
24
1.3.1
Declaraes
/ D e f i n i o da v a r i v e l numChars /
%{
int numChars=0;
%}
1
2
3
1.3.2
1. Introduo ao Flex
{
numChars++;
p r i n t f ( "%s " , y y t e x t ) ;
2
3
4
5
6
\n
{
numChars++;
p r i n t f ( "\n" ) ;
7
8
1.3.3
Rotinas em C de suporte
Nesta seco pode ser escrito o cdigo C que se pretende que seja adicionado ao
programa a gerar pelo FLEX. Tipicamente este cdigo inclui o corpo do programa,
designadamente, a funo main() da linguagem C.
1
2
3
4
5
main ( )
{
yylex ( ) ;
p r i n t f ( "Nmero de c a r a c t e r e s %d\n" , numChars ) ;
}
A funo yylex() evoca o analisador lxico gerado pelo flex que processar as
expresses regulares anteriormente descritas (ver seco 1.3.2).
1
O valor desta varivel poderia ser obtido atravs da instruo da linguagem C
strlen(yytext)
1.4
1. Introduo ao Flex
%{
int qtdNumeros =0, nLinhas =0;
%}
4
5
ALGARISMO
[0 9]
6
7
%%
8
9
10
/ Se a aco f o r d e s c r i t a numa s l i n h a
as c h a v e t a s podem s e r o m i t i d a s /
11
12
13
14
\n
{ALGARISMO}+
.
nLinhas++;
{ p r i n t f ( "d%s \n" , y y t e x t ) ; qtdNumeros++}
15
16
17
18
19
20
21
22
%%
main ( )
{
yylex ( ) ;
p r i n t f ( "# l i n h a s=%d\n" , nLinhas ) ;
p r i n t f ( "# numeros=%d\n" , qtdNumeros ) ;
}
Todos os caracteres no processados pelas duas primeiras expresses regulares
so consumidos pela ltima qual no corresponde nenhuma aco particular.
1.5
Propostas de exerccios
1. Introduo ao Flex
Entrada
123 abc 12.45 s 245 xyz
xyz 2 abc 45 cc
Sada
123 12 45 245
2 45
1.6
Ambiente de trabalho
O acesso a uma mquina LINUX pode ser realizado utilizando o programa putty
que est instalado em c:putty em modo SSH (ver figura 1.2). As mquinas a
utilizar devero ser ssh, ssh1 e ssh2.
1. Introduo ao Flex
A edio dos ficheiros fonte pode ser realizada a partir de qualquer editor de
texto bsico (e.g., no ambiente Windows existe o Programmers Notepad) desde
que os ficheiros sejam gravados em formato Unix.
1.7
Na tabela 1.2 so apresentados os comandos que permitem fazer mudana de directrio e mostrar qual o directrio actual.
Comando
cd
cd ..
cd <DIR>
pwd
1. Introduo ao Flex
1 user
4 user
profs
profs
1.8
Na tabela 1.5 so apresentados alguns dos padres mais relevantes utilizados pelo
FLEX.
1. Introduo ao Flex
[abj-oZ]
[A-Z\n]
r*
r+
r?
r{2,5}
r{2,}
r{4}
{macro}
(r)
xyz*
(xyz)*
r|s
r
r$
xyz$
<<EOF>>
Descrio
O carcter x
Qualquer carcter excepto mudana de linha
Mudana de linha
Um dos caracteres x, y ou z
A cadeia de caracteres xyz
Um dos caracteres no intervalo de a a z ou de A a Z
Qualquer um dos operadores -, +, * ou /, send que o
smbolo - tem de aparecer em primeiro lugar dada a possibilidade de ambiguidade com a definio de intervalo
Um dos caracteres a, b ou de j a o ou Z
Qualquer carcter excepto no intervalo de A a Z ou mudana de linha
O carcter r zero ou mais vezes
O carcter r uma ou mais vezes
O carcter r zero ou uma vez
O carcter r repetido de duas a cinco vezes
O carcter r repetido pelo menos duas vezes
O carcter r repetido exactamente quatro vezes
Substituio/Expanso da macro definida anteriormente
O carcter r, sendo que os parntesis permitem estipular precedncias
A sequncia xy seguida de zero ou mais zs
A sequncia xyz repetida zero ou mais vezes
O carcter r ou s (alternativa)
O carcter r apenas se no incio da linha
O carcter r apenas se no final da linha (no consome o \n)
Uma linha que contm apenas a cadeia de caracteres xyz
Fim de ficheiro
10