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.
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
%{ %} /* 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); }
Ultima alteração: sexta-feira, 24 de Novembro de 2000 às 21:29