Crie um autómato finito e uma gramática de expressões capaz de representar um número real com vírgula flutuante.
Crie o respectivo programa em flex, que detecte se um determinado número inserido pelo utilizador obedece a essas regras.
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='C'; else if (a=='+' || a=='-') estado='B'; else if (a==',') estado='D'; else erro=1; break; case 'B' : if ((a>='0') && (a<='9')) estado='C'; else if (a==',') estado='D'; else erro=1; break; case 'C' : if ((a>='0') && (a<='9')) estado='C'; else if (a==',') estado='D'; else if ((a=='e') || (a=='E')) estado='F'; else erro=1; break; case 'D' : if ((a>='0') && (a<='9')) estado='E'; else erro=1; break; case 'E' : if ((a>='0') && (a<='9')) estado='E'; else if ((a=='e') || (a=='E')) estado='F'; else erro=1; break; case 'F' : if ((a>='0') && (a<='9')) estado='H'; else if (a=='+' || a=='-') estado='G'; else erro=1; break; case 'G' : case 'H' : if ((a>='0') && (a<='9')) estado='H'; else erro=1; } if ((!erro) && ((estado=='C') || (estado=='E') || (estado=='H'))) printf("Foi lido um real.\n"); else printf("Não foi lido um real.\n"); }
S → A N E
A → '+' | '-' | ε
N → I R
N → ',' I
R → ',' I
R → ε
E → 'e' A I
I → D B
B → D B
B → ε
D → 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
%{ %} /* definição de dígito */ digito [0-9] %% [-+]?({digito}*,)?{digito}+([Ee][-+]?{digito}+)? {printf("Real: %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