Files
SaraP 86f4bb48be Extern :
- C3d aggiornamento delle librerie ( 117960).
2023-10-12 08:53:50 +02:00

175 lines
8.9 KiB
C++

////////////////////////////////////////////////////////////////////////////////
/**
\file
\brief \ru Алгоритм синтаксического разбора алгебраического выражения.
\en Algorithm of syntax parsing of algebraic expression. \~
*/
////////////////////////////////////////////////////////////////////////////////
#ifndef __YACC_H
#define __YACC_H
#include <math_define.h>
#include <pars_tree_variable.h>
#include <vector>
class MATH_CLASS BTreeNode;
class MATH_CLASS TreeIntervalNode;
struct ItTreeVariable;
struct ItUserFunc;
struct ItIntervalTreeVariable;
/// \ru Максимальная длина переменной. \en Maximum length of variable.
constexpr size_t MAX_VARIABLE_NAME_LENGTH = 512;
/// \ru Максимальная длина выражения. \en Maximum length of expression.
constexpr size_t MAX_EQU_LENGTH = 8192; // C3D-5977.
//-------------------------------------------------------------------------------
//
// ---
struct ItEquVarCreator
{
virtual ~ItEquVarCreator()
{
}
virtual ItTreeVariable * GetVariable( const c3d::string_t & ) = 0;
virtual ItIntervalTreeVariable * GetIntervalVariable( const c3d::string_t & ) = 0;
virtual ItUserFunc * GetFunc ( const c3d::string_t &, size_t parCount ) = 0;
virtual bool CreateFunc ( const c3d::string_t &, const std::vector<c3d::string_t> & parNames ) = 0;
virtual bool CreateInterval( const c3d::string_t & ) = 0;
virtual bool CreateVariable( const c3d::string_t &) = 0;
virtual ItTreeVariable * GetVariable( const TCHAR * ) = 0;
virtual ItIntervalTreeVariable * GetIntervalVariable( const TCHAR * ) = 0;
virtual ItUserFunc * GetFunc ( const TCHAR *, size_t parCount ) = 0;
virtual bool CreateInterval( const TCHAR * ) = 0;
virtual bool CreateVariable( const TCHAR * ) = 0;
virtual unsigned int GetUsedCoordsCount() const = 0;
virtual ItTreeVariable & CreateAuxVar() = 0;
// \ru Использовались ли какие-либо переменные? \en Were any variables used?
virtual bool WereVarsUsed() const = 0;
// \ru Использовались ли несуществующие (новые) переменные? \en Were any not existed (new) variables used?
virtual bool WereNewVarsUsed() const = 0;
};
//-------------------------------------------------------------------------------
/** \brief \ru Создать дерево уравнения (a = b + c) через параметрический калькулятор.
\en Create a tree of equations (a = b + c) by parametric calculator. \~
\details \ru Создать дерево уравнения a = b + c) через параметрический калькулятор. \n
\en Create a tree of equations (a = b + c) by parametric calculator. \n \~
\return \ru Код результата операции.
\en Operation result code. \~
\ingroup Parser
*/
// ---
MATH_FUNC(EquTreeResCode) CreateBTreeForEquation( const c3d::string_t & equstr
, ItEquVarCreator & varsCreator
, std::unique_ptr<BTreeNode> & dRoot
);
//-------------------------------------------------------------------------------
/** \brief \ru Создать дерево выражения (b + c + d) через параметрический калькулятор.
\en Create a tree of equations (b + c + d) by parametric calculator. \~
\details \ru Создать дерево выражения (b + c + d) через параметрический калькулятор. \n
\en Create a tree of equations (b + c + d) by parametric calculator. \n \~
\return \ru Код результата операции.
\en Operation result code. \~
\ingroup Parser
*/
// ---
MATH_FUNC(EquTreeResCode) CreateBTreeForExpression( const c3d::string_t & equstr
, ItEquVarCreator * varsCreator
, std::unique_ptr<BTreeNode> & root
, std::unique_ptr<TreeIntervalNode> & iRoot
);
//-------------------------------------------------------------------------------
/** \brief \ru Создать переменную.
\en Create variable. \~
\details \ru Создать переменную по строке. \n
\en Create variable by string. \n \~
\return \ru Код результата операции.
\en Operation result code. \~
\ingroup Parser
*/
// ---
MATH_FUNC(EquTreeResCode) CreateVariable( const c3d::string_t & expression, ItEquVarCreator & );
//-------------------------------------------------------------------------------
/** \brief \ru Является ли выражение неравенством.
\en Whether expression is inequation. \~
\details \ru Является ли выражение неравенством. \n
\en Whether expression is inequation. \n \~
\ingroup Parser
*/
// ---
MATH_FUNC(bool) IsInequality( const c3d::string_t & );
//-------------------------------------------------------------------------------
/** \brief \ru Создать дерево уравнения (a = b + c) через параметрический калькулятор.
\en Create a tree of equations (a = b + c) by parametric calculator. \~
\details \ru Создать дерево уравнения a = b + c) через параметрический калькулятор. \n
\en Create a tree of equations (a = b + c) by parametric calculator. \n \~
\return \ru Код результата операции.
\en Operation result code. \~
\ingroup Parser
*/
// ---
MATH_FUNC(EquTreeResCode) CreateBTreeForEquation( const TCHAR * equstr
, ItEquVarCreator & varsCreator
, std::unique_ptr<BTreeNode> & dRoot
);
//-------------------------------------------------------------------------------
/** \brief \ru Создать дерево выражения (b + c + d) через параметрический калькулятор.
\en Create a tree of equations (b + c + d) by parametric calculator. \~
\details \ru Создать дерево выражения (b + c + d) через параметрический калькулятор. \n
\en Create a tree of equations (b + c + d) by parametric calculator. \n \~
\return \ru Код результата операции.
\en Operation result code. \~
\ingroup Parser
*/
// ---
MATH_FUNC(EquTreeResCode) CreateBTreeForExpression( const TCHAR * equstr
, ItEquVarCreator * varsCreator
, std::unique_ptr<BTreeNode> & root
, std::unique_ptr<TreeIntervalNode> & iRoot
);
//-------------------------------------------------------------------------------
/** \brief \ru Создать переменную.
\en Create variable. \~
\details \ru Создать переменную по строке. \n
\en Create variable by string. \n \~
\return \ru Код результата операции.
\en Operation result code. \~
\ingroup Parser
*/
// ---
MATH_FUNC(EquTreeResCode) CreateVariable( const TCHAR * expression, ItEquVarCreator & );
//-------------------------------------------------------------------------------
/** \brief \ru Является ли выражение неравенством.
\en Whether expression is inequation. \~
\details \ru Является ли выражение неравенством. \n
\en Whether expression is inequation. \n \~
\ingroup Parser
*/
// ---
MATH_FUNC(bool) IsInequality( const TCHAR * );
#endif