Tópicos

Análise lexical com a ferramenta Flex.

Exercício 1: Identificação de referências em HTML

Realize um programa que permita extrair, imprimindo no terminal, as referências de um ficheiro em HTML. Estas referências existem dentro de elementos HTML. Os elementos são delimitados pelos caracteres menor (<) e maior (>). As referências são cadeias de caracteres delimitadas por '\"' ou '\'', precedidas da palavra chave HREF e do sinal de igualdade (=). Por exemplo, <A href="file:/etc/passwd">

Podem existir zero ou mais caracteres brancos - espaços ( ), tabulações (\t) ou mudanças de linha (\n). As referências são impressas excluindo as aspas que as delimitam e, por simplificação, considere que não existem aspas dentro da cadeia de caracteres. Em HTML não há distinção entre maiúsculas de minúsculas, pelo que href, Href, hREF, e outras combinações também são válidas.

Não devem ser recolhidas as referências que se encontram dentro de comentários (podem ser aninhados e são delimitados pelas sequências <!-- e -->), nem em cadeias de caracteres.

Exercício 2: Identificação de literais em Pascal

Realize um programa que identifique os seguintes elementos de um programa em Pascal: identificadores, números inteiros, números reais em vírgula flutuante de precisão simples e cadeias de caracteres. Ignore a possibilidade de a cadeia de caracteres conter aspas (").

Na realização do exercício, assuma as seguintes definições feitas pelo YACC (nesta fase, apenas interessa saber que as definições correspondem a tokens e que a %union serve para comunicar dados entre o Flex e o YACC -- ver exemplos no Compact):

%union{ int i; float r; char *s; }
%token<s> ID STR
%token<i> INT
%token<r> REAL
%token ASSIGN LE GE NE DIV MOD AND NIL NOT BEGin END
%token IF THEN ELSE WHILE DO REPEAT UNTIL FOR TO DOWNTO
%token PROGRAM LABEL CONST TYPE VAR PROCEDURE FUNCTION
%token PACKED ARRAY RECORD OF SET FILe CASE WITH GOTO

Note-se que os nomes dos tokens correspondem a macros em C/C++ e que devem ser escolhidos por forma a não colidirem com outras definições (e.g., nomes de classes).

Exercício 3: Identificação de Cadeias de Caracteres

Realize um programa que permita extrair, imprimindo no terminal, as cadeias de caracteres em programas nas linguagens: Smalltalk, C e PostScript.

Em Smalltalk, uma cadeia de caracteres é delimitada pelo carácter '\'', podendo este carácter ser introduzido no cadeira através da sua duplicação: 'batata''cebola'.

Em C, uma cadeia de caracteres é delimitada pelo carácter aspa '\"', podendo este carácter ser introduzido na cadeia através da sequência (\"): "batata\"cebola".

Em PostScript, uma cadeia de caracteres é delimitada por parenteses curvos, podendo os parenteses ser introduzidos livremente no texto se estiverem emparelhados. Parenteses não emparelhados podem também ser introduzidos se precedidos do carácter (\): (batata()cebola).

Soluções

Ver o wiki da disciplina.