[anterior] [seguinte]


Enunciado

Crie um autómato programa em flex, que identifique os tokens de uma determinada expressão lógica. Sempre que um token é identificado, a função yylex deve devolver um identificador. A gramática é a seguinte.

E → E or E | E and E | E xor E | not E | ( E ) | ID | INT | REAL

onde ID é um identificador (letra seguida de letra ou número), INT um número inteiro e REAL um número real.

Os espaços, tabs e mudanças de linha devem ser ignorados. Qualquer outro caracter deve originar um erro.


Programa flex (exercicio5.lex)

%{
	enum{OR,XOR,AND,NOT,ABRIR_P,FECHAR_P,INT,REAL,ID,FIM};
%}

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

digito [0-9]
letra [a-zA-Z]

%%

or 						return OR;
xor 						return XOR;
and 						return AND;
not 						return NOT;
"(" 						return ABRIR_P;
")" 						return FECHAR_P;
{digito}+ 					return INT;
({digito}*,)?{digito}+([Ee][-+]?{digito}+)? 	return REAL;
{letra}({letra}|{digito})* 			return ID;
[ \t\n]						;
<<EOF>> 					return FIM;
. 						printf ("Erro léxico:%s\n",yytext);

%%

int main()
{
  int token;

  printf("Insira dados:\n");

  do {
    token=yylex();
    switch(token) {
      case OR        : printf("token OR\n");
                   break;
      case XOR       : printf("token XOR\n");
                   break;
      case AND       : printf("token AND\n");
                   break;
      case ABRIR_P   : printf("token '('\n");
                   break;
      case FECHAR_P  : printf("token ')'\n");
                   break;
      case INT       : printf("token INT %s\n",yytext);
                   break;
      case REAL      : printf("token REAL %s\n",yytext);
                   break;
      case ID        : printf("token ID %s\n",yytext);
                   break;
      case FIM       : printf("token FIM %s\n",yytext);
                   break;
      default        : printf("token desconhecido %s\n",yytext);
    }
  }while (token!=FIM);

}

/* 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