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.
%{ 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); }
Ultima alteração: sexta-feira, 24 de Novembro de 2000 às 21:29