Analyseur d'expression

Description

Voici toutes les operations:
l'addition <a> avec <b> : a+b
la soustraction <a> auquel on hote <b> : a-b
le moins unaire, l'oppose de <a> : -a
la mulplication de <a> avec <b> : a*b
la division de <a> par <b> : a/b

De plus il y a la possibilite de mettre des parentheses !
Les blancs ne sont pas admis, mais ceci est facilement resolvable ...

Pour quitter rentrer comme formule "quit", en miuscule.

Voici quelques exemples :
1+2+3+4+5+6+7+8+9
12/3/2
3.1415926535/2
(1+8)*-(-4-5)
((1+2)-5)/4
quit

Source / Exemple :


#ifndef _EXPR_H_
  #include "expr.h"
#endif // _EXPR_H_
//========================================================
static jmp_buf  jumpError;
static char     bufError[256];

//========================================================
static double Expr0(char **pText);
static double Expr1(char **pText);
static double Expr2(char **pText);

//========================================================
double StringToDouble(char **pText)
{
double a;

a = 0.0;

do
  {
  char c;
  c = **pText;
  if(c < '0' || c > '9')
    {
    break;
    }
  a *= 10.0;
  a += c - '0';
  (*pText) ++;
  }while(TRUE);

if(**pText == '.')
  {
  double f;
  (*pText) ++;

  f = 1;
  do
    {
    char c;
    c = **pText;
    if(c < '0' || c > '9')
      {
      break;
      }
    f /= 10.0;
    a += f * (c - '0');
    (*pText) ++;
    }while(TRUE);
  }

return a;
}
//========================================================
// gere les constantes
static double Expr2(char **pText)
{
// le moins unaire
if(**pText == '-')
  {
  (*pText) ++;
  return - Expr2(pText);
  }
else
  {
  switch(**pText)
    {
    case '(':
      {
      double a;
      (*pText) ++;
      a = Expr0(pText);
      if(**pText != ')')
        {
        sprintf(bufError,"Fin de parenthese attendue");
        longjmp(jumpError,1);
        }
      (*pText) ++;
      return a;
      }
    default:
      {
      char c;
      c = **pText;
      if(c < '0' || c > '9')
        {
        sprintf(bufError,"Nombre attendu : \"%s\"",*pText);
        longjmp(jumpError,1);
        }
      return StringToDouble(pText);
      }
    }
  }
}
//========================================================
// gere les operateurs :
// multiplication (*)
// division (/)
static double Expr1(char **pText)
{
// <a> pour le nombres de gauche
double a;
a = Expr2(pText);
do
  {
  switch(**pText)
    {
    case '*':
      {
      (*pText) ++;
      a *= Expr2(pText);
      break;
      }
    case '/':
      {
      double b;
      (*pText) ++;
      b = Expr2(pText);
      // si b appartient [-e ; +e]
      if(b >= -EPSILON && b <= EPSILON)
        {
        sprintf(bufError,"Division par 0 !");
        longjmp(jumpError,1);
        }
      a /= b;
      break;
      }
    default:
      {
      return a;
      }
    }
  }while(TRUE);
}
//========================================================
// gere les operateurs :
// addition (+)
// soustraction (-)
static double Expr0(char **pText)
{
// <a> pour le nombres de gauche
double a;
a = Expr1(pText);
do
  {
  switch(**pText)
    {
    case '+':
      {
      (*pText) ++;
       a += Expr1(pText);
      break;
      }
    case '-':
      {
      (*pText) ++;
       a -= Expr1(pText);
      break;
      }
    default:
      {
      return a;
      }
    }
  }while(TRUE);
}
//========================================================
BOOL EvaluateExpr(
                 char   *text,
                 double *pRes,
                 char   *buf
                 )
{
sprintf(bufError,"");
if(!setjmp(jumpError))
  {

  • pRes = Expr0(&text);
// si l'on a eu tous les caracteres if(*text == '\0') { return TRUE; } else { sprintf(bufError,"Chaine non-finie : \"%s\"",text); } } // sinon toutes ces conditions, erreur ; if(*bufError == '\0') { sprintf(buf,"Erreur non-traitee !"); } else { strcpy(buf,bufError); } return FALSE; }

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.