/**
*
* @File : CExpression.cxx
*
* @Authors : D. Mathieu
*
* @Date : 09/05/2001
*
* @Version : V1.0
*
* @Synopsis :
*
**/
#include <iostream>
#include <fstream>
#include <exception>
#include <string>

#include "CExpression.h"
#include "CNode2Gen.h"
#include "CToken.h"

using namespace std;
using namespace nsSdD;
using namespace nsCompil;

#define CEXPR nsCompil::CExpression

      Question 2

void CEXPR::Prefixe (ostream & os, CNodeToken * const Ptr) const
{
    if (!Ptr) return;
    os << *Ptr << ' ';
    Prefixe (os, Ptr->GetGauche());
    Prefixe (os, Ptr->GetDroit ());

} // Prefixe()

      Question 3

void CEXPR::Postfixe (ostream & os, CNodeToken * const Ptr) const
{
    if (!Ptr) return;
    Postfixe (os, Ptr->GetGauche());
    Postfixe (os, Ptr->GetDroit ());
    os << *Ptr << ' ';

} // Postfixe()

      Question 4

void CEXPR::Infixe (ostream & os, CNodeToken * const Ptr) const
{
    if (!Ptr) return;

    if (!Ptr->IsOperator ())
        os << *Ptr;
    else
    {
        os << " (";
        Infixe (os, Ptr->GetGauche());
        os << ' ' << *Ptr << ' ';
        Infixe (os, Ptr->GetDroit ());
        os << ") ";
     }

} // Infixe()

      Question 5

int CEXPR::Evaluer (CNodeToken * const Ptr) const
{
    if (!Ptr->IsOperator()) return Ptr->m_Value;
    int OperG = Evaluer (Ptr->GetGauche());
    int OperD = Evaluer (Ptr->GetDroit ());
    switch (Ptr->m_Symbole)
    {
      case '+' : return OperG + OperD;
      case '-' : return OperG - OperD;
      case '*' : return OperG * OperD;
      case '/' : return OperG / OperD;
    }

} // Evaluer()

      Question 6

CEXPR::CNodeToken * CEXPR::Ajouter (istream & is /* = cin */)
{
    CNodeToken * Gauche = 0;
    CNodeToken * Droite = 0;

    CToken Token;
    is >> Token;
    if (Token.IsOperator())
    {
        Gauche = Ajouter (is);
        Droite = Ajouter (is);
    }
    return new CNodeToken (Token, Gauche, Droite);

} // Ajouter()