mirror of
https://github.com/0TheSpy/Seaside.git
synced 2025-01-07 10:03:29 +08:00
66 lines
1.7 KiB
C++
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 |