Baseado no exercício anterior, crie um autómato finito e uma gramática de expressões capaz de representar números reais no seguinte formato:
inteiro','inteiro
O número terá sempre de ter uma vírgula e uma casa decimal , mas não necessita ter parte inteira.
Crie o respectivo programa em flex.
Depois de concluído, compare o seu código com o do programa C apresentado a seguir e retire conclusões.
#include<stdio.h> void main() { int a; int real=1; char estado='A'; int erro=0; printf("Introduza dados:"); while(((a=getchar())!='\n') && (erro==0)) switch (estado){ case 'A' : if ((a>='0') && (a<='9')) estado='A'; else if (a=='.') estado='B'; else erro=1; break; case 'B' : if ((a>='0') && (a<='9')) estado='C'; else erro=1; break; case 'C' : if ((a>='0') && (a<='9')) estado='C'; else erro=1; break; } if ((!erro) && (estado=='C')) printf("Foi lido um real.\n"); else printf("Não foi lido um real.\n"); }
S → A ',' B A
A → B A
A → ε
B → 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
%{ %} /* definição de dígito */ digito [0-9] %% {digito}*,{digito}+ {printf("Encontrado real: %s\n",yytext);} [^ \t\n]+ {printf("Encontrado não real: %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