/* ------------------------------------------------------------------- * * cml.l Calculadora muito simples, desenvolvida em lex * * Reconhece numero e operador e e' capaz de dar o resultado da * * aplicacao de uma operacao na forma numero operador numero. Nao sao * * tratados erros * * * * Geraracao do analisador lexico: * * $> flex -o cms.c cms.l * * Gerando o executavel: * * $> gcc -o cms cms.c -lfl * * * * Exemplo: * * $> ./cms * * 5 + 3 * * Resultado = 8.000000 * * 4 * * + * * 5 * * Resultado = 9.000000 * * -4 + +2 * * Resultado = -2.000000 * * 4 5 + 1 * * Resultado = 6.000000 * * ^C * * ------------------------------------------------------------------- */ %{ #include /* Servicos C utilizados */ #include #define SOMA 1 /* Macros para identificar operacoes */ #define SUBT 2 #define MULT 3 #define DIVI 4 #define VOID -999 /* Indica se a operacao foi ou nao fornecida */ float op1, op2, res; /* Variaveis auxiliares para operandos e resultado */ int op = VOID; /* Identifica operador entrado (inicialmente void) */ %} /* DEFINICOES */ /* numero: ponto flutuante. Observe que ele pode ser precedido de + ou - */ numero [+-]?(([0-9]+)|([0-9]*\.[0-9]+))([eE][-+]?[0-9]+)? %% {numero} { /* Entrou um numero */ if( op == VOID ) /* Nenhum operador foi informado */ op1 = atof(yytext); /* Obtem o valor do primeiro operando*/ else { /* Um operador ja foi informado */ op2 = atof(yytext); /* Entao obtem o segundo operando */ switch( op ) { /* Conforme a operacao indicada... */ case SOMA : res = op1 + op2; break; case SUBT : res = op1 - op2; break; case MULT : res = op1 * op2; break; case DIVI : res = op1 / op2; break; } printf("Resultado = %f\n", res); /*...apresenta resultado*/ op = VOID; /* Ta pronto para a proxima */ } } "+" { op = SOMA; } "-"/" " { op = SUBT; } "*" { op = MULT; } "/" { op = DIVI; } %%