#include #include using namespace std; class SyntaxNode { public: SyntaxNode() : Left( NULL ), Right( NULL ), Father( NULL ), Op( 0 ), Val( 0 ) {} int FindOp( const string& Str, char Op ) { int i=0; int Level=0; while( i= Str.length() || LastP-Start<=1 ) { cout << "Syntax error at " << Str << endl; exit( 1 ); } Parse( Str.substr( Start+1, LastP-Start-1 ) ); } else if( ( Str[Start] >= '0' && Str[Start] <= '9' ) || Str[Start]=='.' ) { int i=Start; while( ( Str[i] >= '0' && Str[i] <= '9' && iFather = Father; Parse( Str ); } float Eval() { switch( Op ) { case 0: return Val; break; case '+' : if( Left && Right ) return Left->Eval()+Right->Eval(); break; case '-' : if( Left && Right ) return Left->Eval()-Right->Eval(); break; case '*' : if( Left && Right ) return Left->Eval()*Right->Eval(); break; case '/' : if( Left && Right ) return Left->Eval()/Right->Eval(); break; case 'c' : if( Right ) return cos(Right->Eval()); break; case 's' : if( Right ) return sin(Right->Eval()); break; default: return 0; break; } } SyntaxNode* Father; SyntaxNode* Left; SyntaxNode* Right; char Op; float Val; }; ostream& operator<<( ostream& o, const SyntaxNode& n ) { switch( n.Op ) { case 0: o << n.Val; break; case '+' : if( n.Left && n.Right ) o << '(' << *n.Left << '+' << *n.Right << ')'; break; case '-' : if( n.Left && n.Right ) o << '(' << *n.Left << '-' << *n.Right << ')'; break; case '*' : if( n.Left && n.Right ) o << '(' << *n.Left << '*' << *n.Right << ')'; break; case '/' : if( n.Left && n.Right ) o << '(' << *n.Left << '/' << *n.Right << ')'; break; case 'c' : if( n.Right ) o << "cos(" << *n.Right << ')'; break; case 's' : if( n.Right ) o << "sin(" << *n.Right << ')'; break; default: o << "!!!"; break; } } int main( int argc, char** argv ) { if( argc != 2 ) { printf( "pas assez d'args\n" ); return 1; } string Str( argv[1] ); SyntaxNode* SyntaxTree = new SyntaxNode( Str, NULL ); cout << *SyntaxTree << " = " << SyntaxTree->Eval() << endl; return 0; }