#define MAXPARAM  30 //Максимальное количество параметров в функции

#define EMPTY   100
#define NUM    102
#define LS     104   //Левая скобка
#define RS     105   //Правая скобка
#define ZPT    106   //Запятая

#define AllOK      0
#define SCOBKY     1
#define DIVIDE     2
#define UNDEFINED  3
#define FUCK_X     4
#define LOGARIFM   5
#define NONMATHSTR 6
#define EXTRAPARAM 7
#define FEWPARAM   8
#define EVALERR    9

//Функции
#define SIN   0
#define COS   1
#define TAN   2
#define LOG   3
#define EXP   4
#define PLUS  5
#define MINUS 6
#define MUL   7
#define DIV   8
#define STP   9

//Переменные
#define VarX   0
#define VarI   1


#define MAXFUNCTION 10 //Максимальное количество функций
#define MAXVARIANT   2 //Максимальное количество переменных

typedef complex<double> dcomplex;

//Переменные
class TVar
{
public:
  AnsiString Name;            //Название переменной
  dcomplex Value;             //Значение переменной
  void New(AnsiString);       //Добавить новую переменную
};
extern PACKAGE TVar Var[MAXVARIANT];

//Элементарные функции
class TPFunc
{
public:
  void New(AnsiString,int,int,int);    //Добавить новую функцию
  AnsiString Name;                     //Название функции
  int ColParam;                        //Количество параметров функции
  int Prior;                           //Приоритет при вычислении
  int Type;                            //Номер функции
};
extern PACKAGE TPFunc PFunc[MAXFUNCTION];

//Элемент формулы
class TN
{
public:
  TN();
 ~TN();
  TN *Next;
  TN *Prev;
  TN *Param[MAXPARAM];
  int Type;
  int Prior;
  dcomplex Value;
  dcomplex *pValue;
  bool Is;
  TN *Delete();
  dcomplex GetValue();
};
extern PACKAGE TN *N;

//Класс обслуживает все остальные
class TMath
{
public:
  bool Status; //Вычисления успешны
  TMath();
  bool LoadFormula(AnsiString);
  void KillFormula();
  bool Error(int);
  TN *PriorScobka();
  bool ReplaceFunc0(TN *ptr);
  void ReplaceFunc12(TN *ptr);
  dcomplex F();
};
extern PACKAGE TMath Math;
