linguagens e programação flex - dei.isep.ipp.ptproenca/dump/lprog/pptflex.pdf · lexema: 100....
TRANSCRIPT
LPROG
Analisador léxico
Programa que lê um ficheiro de texto (p.e. source code) e produz uma sequência de componentes léxicos (tokens)
As sequências de tokens produzidas
serão utilizados pelo analisador sintático (parser)
permitem identificar erros léxicos na entrada.
Os tokens são instanciados por lexemas
24 de fevereiro de 2015Paulo Proença – [email protected]
LPROG
Analisador léxico
tokens
São padrões de caracteres com um significado
especial num determinado contexto.
São definidos por expressões regulares sobre um
alfabeto.
lexemas
Ocorrências de um token no âmbito da informação
analisada.
São constituídos pelos carateres da informação que
compõe um token.
24 de fevereiro de 2015Paulo Proença – [email protected]
LPROG
IF LPAREN ID GEQ ID RPAREN LBRACK
Analisador léxico
Exemplo:
24 de fevereiro de 2015Paulo Proença – [email protected]
if(x>=y){y=100;
}
ID ASSIGN INT SCOLON RBRACK
lexema: 100
LPROG
FLEX
Ferramenta que permite gerar analisadores léxicos.
24 de fevereiro de 2015Paulo Proença – [email protected]
LPROG
Flex
Formato de um ficheiro FLEX
24 de fevereiro de 2015Paulo Proença – [email protected]
%{int contadorNumeros=0;
%}
DIG [0-9]
%%
{DIG}+ {contadorNumeros++; printf("Número: %s\n",yytext);}
%%
main() {yylex();printf("foram encontrados %d números\n", contadorNumeros);
}
Dec
lara
çõ
es
Ma
cro
sR
eg
ras
Ro
tin
as
em
C
LPROG
Flex
Ambiente de trabalho
linux
• ssh.dei.isep.ipp.pt, ssh1.dei.isep.ipp.pt,
ssh2.dei.isep.ipp.pt, ssh3.dei.isep.ipp.pt
Acesso via putty
24 de fevereiro de 2015Paulo Proença – [email protected]
LPROG
Flex
Geração do código fonte do analisador léxico
Compilação do analisador léxico
24 de fevereiro de 2015Paulo Proença – [email protected]
>> flex ficheiro.flex
>> flex –oficheiro.c ficheiro.flex
Produz: ficheiro.c
Produz: lex.yy.c
>> gcc ficheiro.c -lfl
>> gcc –oPrograma ficheiro.c -lflProduz:
a.out
Produz: Programa
LPROG
Flex
Execução do analisador léxico
24 de fevereiro de 2015Paulo Proença – [email protected]
>> ./Programa <ficheiro.txt
>> ./Programa
Xpto quert as sfsfl
Sf skfk flas kn ebs
Sf sfsç mf827 d0e 9
Fkfkh as dh 9d
<Ctrl+D>
Corresponde ao caracterEOF – End of File
LPROG
Propostas de Exercícios
1. Escrever um programa que permita contar o número de ocorrências de uma cadeia de caracteres
24 de fevereiro de 2015Paulo Proença – [email protected]
ex1.flex
%{int contador=0;
%}%%ISEP|isep {contador++;}.|\n%%main(){
yylex();printf("numero de ocorrências : %d\n",contador);
}
LPROG
Propostas de exercícios
1.
24 de fevereiro de 2015Paulo Proença – [email protected]
>> flex –oex1.c ex1.flex
>> gcc –oProgEx1 ex1.c -lfl
Info.txt
Em 1989, o ISEP é integrado no subsistema de Ensino Superior Politécnico, passando o seu modelo de formação a integrar dois cursos distintos: o bacharelato, com a duração de três anos, e os Cursos de Estudos Superiores Especializados, com a duração de dois anos. Em 1998, no âmbito de uma nova reforma do ensino superior politécnico, o ISEP passa a ministrar as actuais licenciaturas bietápicas, caracterizadas pela sua estruturação em dois ciclos - o bacharelato com a duração de três anos - o que possibilita a inserção no mercado de trabalho, seguido de um segundo ciclo de dois anos - frequentado essencialmente em regime pós-laboral - para a obtenção da licenciatura. Em 2006, por força da adesão de Portugal à Declaração de Bolonha, o isep disponibilizará um novo Plano de Estudos, constituído por licenciaturas e mestrados nas diversas áreas da Engenharia, assim iniciando um novo ciclo da sua já longa história. Em 2008, o Presidente da República Portuguesa, enaltece a qualidade do trabalho desenvolvido no ISEP, durante o Roteiro para a Ciência. A passagem pelo isep constitui a primeira visita oficial de um chefe de Estado português a um instituto politécnico. O ISEP atribui o primeiro grau de mestre pós-Bolonha.
>> ./ProgEx1 <Info.txt
número de ocorrências : 6
LPROG
Propostas de Exercícios
2. Escrever um programa que permita substituir as ocorrências de FEUP por ISEP e de 2007 por 2008
24 de fevereiro de 2015Paulo Proença – [email protected]
ex2.flex
%%
FEUP {printf("ISEP");}2007 {printf("2008");}.|\n {printf("%s",yytext);}
%%main(){
yylex();}
LPROG
Propostas de Exercícios
3. Escrever um programa que permita validar matrículas portuguesas.
24 de fevereiro de 2015Paulo Proença – [email protected]
ex3.flex
ALGAR [0-9]LET [A-Z]
%%
{ALGAR}{2}-{LET}{2}-{ALGAR}{2} {printf("%s\n",yytext);}.|\n%%
main(){
yylex();}
LPROG
Propostas de Exercícios
4. Escrever um programa que dado um ficheiro de texto, mostre:
5. Escrever um programa que permita identificar números naturais
6. Escrever um programa que permita identificar números inteiros (com e sem sinal)
7. Escrever um programa que permita identificar números com parte decimal
24 de fevereiro de 2015Paulo Proença – [email protected]
• Número de algarismos
• Número de letras do alfabeto
• Número de linhas de texto
• Número de espaços ou tabulações
• Numero de outros caracteres