Seaside/SpyCustom/sdk/exprevaluator.h
2021-06-16 18:45:17 +03:00

66 lines
1.7 KiB
C++

#ifndef EXPREVALUATOR_H
#define EXPREVALUATOR_H
#if defined( _WIN32 )
#pragma once
#endif
static const char OR_OP = '|';
static const char AND_OP = '&';
static const char NOT_OP = '!';
#define MAX_IDENTIFIER_LEN 128
enum Kind { CONDITIONAL, NOT, LITERAL };
struct ExprNode
{
ExprNode* left;
ExprNode* right;
Kind kind;
union
{
char cond;
bool value;
} data;
};
typedef ExprNode* ExprTree;
typedef bool (*GetSymbolProc_t)(const char* pKey);
typedef void (*SyntaxErrorProc_t)(const char* pReason);
class CExpressionEvaluator
{
public:
CExpressionEvaluator();
~CExpressionEvaluator();
bool Evaluate(bool& result, const char* pInfixExpression, GetSymbolProc_t pGetSymbolProc = 0, SyntaxErrorProc_t pSyntaxErrorProc = 0);
private:
CExpressionEvaluator(CExpressionEvaluator&);
char GetNextToken(void);
void FreeNode(ExprNode* pNode);
ExprNode* AllocateNode(void);
void FreeTree(ExprTree& node);
bool IsConditional(bool& bCondition, const char token);
bool IsNotOp(const char token);
bool IsIdentifierOrConstant(const char token);
bool MakeExprNode(ExprTree& tree, char token, Kind kind, ExprTree left, ExprTree right);
bool MakeFactor(ExprTree& tree);
bool MakeTerm(ExprTree& tree);
bool MakeExpression(ExprTree& tree);
bool BuildExpression(void);
bool SimplifyNode(ExprTree& node);
ExprTree m_ExprTree;
char m_CurToken;
const char* m_pExpression;
int m_CurPosition;
char m_Identifier[MAX_IDENTIFIER_LEN];
GetSymbolProc_t m_pGetSymbolProc;
SyntaxErrorProc_t m_pSyntaxErrorProc;
bool m_bSetup;
};
#endif