Linguagens e Programação FLEX
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
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.
Analisador léxico Exemplo: if(x>=y){ y=100; } IF LPAREN ID GEQ ID RPAREN LBRACK ID ASSIGN INT SCOLON RBRACK lexema: 100
FLEX Ferramenta que permite gerar analisadores léxicos.
Rotinas em C Regras Macros Declarações Flex Formato de um ficheiro FLEX %{ %} int contadornumeros=0; DIG [0-9] {DIG}+ {contadornumeros++; printf("número: %s\n",yytext);} main() { yylex(); printf("foram encontrados %d números\n", contadornumeros); }
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
Flex Geração do código fonte do analisador léxico >> flex ficheiro.flex >> flex oficheiro.c ficheiro.flex Compilação do analisador léxico Produz: lex.yy.c Produz: ficheiro.c >> gcc ficheiro.c -lfl >> gcc oprograma ficheiro.c -lfl Produz: a.out Produz: Programa
Flex Execução do analisador léxico >>./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 caracter EOF End of File
Propostas de Exercícios 1. Escrever um programa que permita contar o número de ocorrências de uma cadeia de caracteres ex1.flex %{ int contador=0; %} ISEP isep {contador++;}. \n main() { yylex(); printf("numero de ocorrências : %d\n",contador); }
Propostas de exercícios 1. >> 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
Propostas de Exercícios 2. Escrever um programa que permita substituir as ocorrências de FEUP por ISEP e de 2007 por 2008 ex2.flex FEUP {printf("isep");} 2007 {printf("2008");}. \n {printf("%s",yytext);} main() { } yylex();
Propostas de Exercícios 3. Escrever um programa que permita validar matrículas portuguesas. ex3.flex ALGAR [0-9] LET [A-Z] {ALGAR}{2}-{LET}{2}-{ALGAR}{2}. \n {printf("%s\n",yytext);} main() { } yylex();
Propostas de Exercícios 4. Escrever um programa que dado um ficheiro de texto, mostre: 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 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
Linguagens e Programação FLEX