mirror of
https://github.com/Mauler125/r5sdk.git
synced 2025-02-09 19:15:03 +01:00
The KeyValues class belongs here. Also reimplemented most loading methods for KeyValues, and adjusted the VPK building code to account for it. Pointers to the engine's implementation of KeyValues have been moved to a separate header ('keyvalues_iface.h'), as this allows external tools code to utilize the standalone KeyValues class implementation. Playlist utilities are completely separated from the KeyValues header; these have nothing to do with KeyValues other than manipulating a global KeyValues object for the playlists, and thus have been named as such and moved to rtech/playlists.
75 lines
2.3 KiB
C++
75 lines
2.3 KiB
C++
//===== Copyright © 1996-2006, Valve Corporation, All rights reserved. ======//
|
|
//
|
|
// Purpose: ExprSimplifier builds a binary tree from an infix expression (in the
|
|
// form of a character array).
|
|
//
|
|
//===========================================================================//
|
|
|
|
#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; // left sub-expression
|
|
ExprNode *right; // right sub-expression
|
|
Kind kind; // kind of node this is
|
|
union
|
|
{
|
|
char cond; // the conditional
|
|
bool value; // the value
|
|
} data;
|
|
};
|
|
|
|
typedef ExprNode *ExprTree;
|
|
|
|
// callback to evaluate a $<symbol> during evaluation, return true or false
|
|
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& ); // prevent copy constructor being used
|
|
|
|
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; // Tree representation of the expression
|
|
char m_CurToken; // Current token read from the input expression
|
|
const char *m_pExpression; // Array of the expression characters
|
|
int m_CurPosition; // Current position in the input expression
|
|
char m_Identifier[MAX_IDENTIFIER_LEN]; // Stores the identifier string
|
|
GetSymbolProc_t m_pGetSymbolProc;
|
|
SyntaxErrorProc_t m_pSyntaxErrorProc;
|
|
bool m_bSetup;
|
|
};
|
|
|
|
#endif
|