[anterior] [seguinte]


Enunciado

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");
}

Autómato finito determinístico


Gramática Regular

SA N E
A → '+' | '-' | ε
NI 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


Programa flex (exercicio4.lex)

%{
%}

 /* 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);
}

[anterior] [seguinte]

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