[anterior] [seguinte]


Enunciado

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

Autómato finito determinístico


Gramática Regular

SA ',' B A
A B A
A → ε
B → 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9


Programa flex (exercicio2.lex)

%{
%}

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

[anterior] [seguinte]

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