1
0
Fork 0
x64dbg/x64_dbg_dbg/expressionparser.h

68 lines
1.8 KiB
C++

#ifndef _EXPRESSION_PARSER_H
#define _EXPRESSION_PARSER_H
#include "_global.h"
class ExpressionParser
{
public:
ExpressionParser(const String & expression);
bool calculate(uint & value, bool signedcalc, bool silent, bool baseonly, int* value_size, bool* isvar, bool* hexonly);
class Token
{
public:
enum class Type
{
Data,
OpenBracket,
CloseBracket,
OperatorUnarySub,
OperatorNot,
OperatorMul,
OperatorHiMul,
OperatorDiv,
OperatorMod,
OperatorAdd,
OperatorSub,
OperatorShl,
OperatorShr,
OperatorAnd,
OperatorXor,
OperatorOr
};
enum class Associativity
{
LeftToRight,
RightToLeft,
Unspecified
};
Token(const String & data, const Type type);
const String data() const;
const Type type() const;
const Associativity associativity() const;
const int precedence() const;
const bool isOperator() const;
private:
String _data;
Type _type;
};
private:
String fixClosingBrackets(const String & expression);
bool isUnaryOperator();
void tokenize(const String & expression);
void shuntingYard();
void addOperatorToken(const char ch, const Token::Type type);
bool unsignedoperation(const Token::Type type, const uint op1, const uint op2, uint & result);
bool signedoperation(const Token::Type type, const sint op1, const sint op2, uint & result);
std::vector<Token> _tokens;
std::vector<Token> _prefixTokens;
String _curToken;
};
#endif //_EXPRESSION_PARSER_H