[seguinte]


Enunciado

Crie um autómato finito e uma gramática de expressões capaz de representar um numero inteiro.

Baseado nestas duas ferramentas, crie um programa em LEX (flex) que detecte se um determinado número introduzido pelo utilizador obedece a essas regras.

Depois de concluído, compare o código gerado pelo flex com o código apresentado de seguida e retire conclusões.

#include<stdio.h>

void main()
{
  int a;
  char estado='A';
  int erro=0;

  printf("Introduza dados:");

  while(((a=getchar())!='\n') && (erro==0))
   if ((a>='0') && (a<='9'))
      estado='B';
   else
      erro=1;

  if ((!erro) && (estado=='B'))
     printf("Foi lido um inteiro.\n");
  else
     printf("Não foi lido um inteiro.\n");
}

Autómato finito determinístico


Gramática Regular

S B A
B B A
A e
B 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9


Programa flex (exercicio1.lex)

%{
%}

       /* definição de dígito */

digito	[0-9]

%%

[0-9]+		{printf("Encontrado inteiro: %s\n",yytext);}
[^ \t\n]+	{printf("Encontrado não inteiro: %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 compilar com o parâmetro -lfl */

int yywrap()
{
	return(1);
}

[seguinte]

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