[anterior] [seguinte]


Enunciado

Crie um autómato finito e uma gramática de expressões, capaz de representar uma quantia monetária nas seguintes moedas:

Escudos:

(0-9)+ '$' (0-9)(0-9)
Libras: 'L' (0-9)+ '.' (0-9)(0-9)
Francos: 'F' (0-9)+ ',' (0-9)(0-9)
Pesetas: (0-9)+ '.' (0-9)(0-9) 'P'

Escreva o programa flex respectivo, de modo a que o utilizador possa introduzir os valores e o programa lhe diga em que moeda estão representados.


Autómato finito determinístico


Gramática Regular

A produção S tem três alternativas, pois a moeda pode começar por um 'L', por um 'F' ou por um número (escudos e pesetas). A diferenciação entre os escudos e as pesetas é efectuada depois da parte inteira quando para os escudos aparece o '$' e para as pesetas a ','. A produção I valida sequências de um ou mais dígitos.

S → 'L' I ',' C
S → 'F' I ',' C
S I R
R → '$' C
R → ',' C 'P'
C
D D
I D A
A D A
A → ε
D → 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9


Programa flex (exercicio3.lex)

%{
%}

 /* definição de dígito */

digito		[0-9]
centavos 	{digito}{2}

%%

{digito}+\${centavos}		{printf("Escudos: %s\n",yytext);}
[Ll]{digito}+\.{centavos}	{printf("Libras: %s\n",yytext);}
[Ff]{digito}+,{centavos}	{printf("Francos: %s\n",yytext);}
{digito}+,{centavos}[Pp]	{printf("Pesetas: %s\n",yytext);}
[^ \t\n]+			{printf("Erro: %s\n",yytext);}
[ \t\n]				; /* são ignorados */
<<EOF>>				{printf("Fim de dados\n");return;} /* ctrl+D (unix) ctrl+Z return (DOS) */

%%

int main()
{
  printf("Insira dados:\n");
  yylex();

}

/* se definir esta função não necessita de compilar com o parâmetro -lfl */

int yywrap()
{
	return(1);
}

[anterior] [seguinte]

Ultima alteração: sexta-feira, 24 de Novembro de 2000 às 21:29