src/Expression.h

changeset 93
11a24b697f43
parent 92
3a00d396bce2
child 94
8915ee6a277d
equal deleted inserted replaced
92:3a00d396bce2 93:11a24b697f43
36 // ============================================================================= 36 // =============================================================================
37 // 37 //
38 class Expression final 38 class Expression final
39 { 39 {
40 public: 40 public:
41 enum ESymbolType
42 {
43 eOperatorSymbol,
44 eValueSymbol,
45 eColonSymbol,
46 };
47
48 using SymbolList = List<ExpressionSymbol*>;
49
41 Expression (BotscriptParser* parser, Lexer* lx, EType reqtype); 50 Expression (BotscriptParser* parser, Lexer* lx, EType reqtype);
42 ~Expression(); 51 ~Expression();
43 ExpressionValue* GetResult(); 52 ExpressionValue* GetResult();
44 53
45 private: 54 private:
46 BotscriptParser* mParser; 55 BotscriptParser* mParser;
47 Lexer* mLexer; 56 Lexer* mLexer;
48 List<ExpressionSymbol*> mSymbols; 57 SymbolList mSymbols;
49 EType mType; 58 EType mType;
50 ExpressionValue* mResult; 59 ExpressionValue* mResult;
51 60
52 ExpressionValue* Evaluate(); // Process the expression and yield a result 61 ExpressionValue* Evaluate(); // Process the expression and yield a result
53 ExpressionSymbol* ParseSymbol(); 62 ExpressionSymbol* ParseSymbol();
54 String GetTokenString(); 63 String GetTokenString();
55 void AdjustOperators(); 64 void AdjustOperators();
56 void Verify(); // Ensure the expr is valid 65 void Verify(); // Ensure the expr is valid
66 void TryVerifyValue (bool* verified, SymbolList::Iterator it);
57 }; 67 };
58 68
59 // ============================================================================= 69 // =============================================================================
60 // 70 //
61 class ExpressionSymbol 71 class ExpressionSymbol
62 { 72 {
63 public: 73 public:
64 enum EExpressionSymbolType 74 ExpressionSymbol (Expression::ESymbolType type) :
65 {
66 eOperatorSymbol,
67 eValueSymbol,
68 eColonSymbol,
69 };
70
71 ExpressionSymbol (EExpressionSymbolType type) :
72 mType (type) {} 75 mType (type) {}
73 76
74 PROPERTY (private, EExpressionSymbolType, Type, NO_OPS, STOCK_WRITE) 77 PROPERTY (private, Expression::ESymbolType, Type, NO_OPS, STOCK_WRITE)
75 }; 78 };
76 79
77 // ============================================================================= 80 // =============================================================================
78 // 81 //
79 class ExpressionOperator final : public ExpressionSymbol 82 class ExpressionOperator final : public ExpressionSymbol
80 { 83 {
81 PROPERTY (public, EOperator, ID, NO_OPS, STOCK_WRITE) 84 PROPERTY (public, EOperator, ID, NO_OPS, STOCK_WRITE)
82 85
83 public: 86 public:
84 ExpressionOperator (EOperator id); 87 ExpressionOperator (EOperator id);
85 }; 88 };
86 89
87 // ============================================================================= 90 // =============================================================================
88 // 91 //
89 class ExpressionValue final : public ExpressionSymbol 92 class ExpressionValue final : public ExpressionSymbol
90 { 93 {
91 PROPERTY (public, int, Value, NUM_OPS, STOCK_WRITE) 94 PROPERTY (public, int, Value, NUM_OPS, STOCK_WRITE)
92 PROPERTY (public, DataBuffer*, Buffer, NO_OPS, STOCK_WRITE) 95 PROPERTY (public, DataBuffer*, Buffer, NO_OPS, STOCK_WRITE)
93 PROPERTY (public, EType, ValueType, NO_OPS, STOCK_WRITE) 96 PROPERTY (public, EType, ValueType, NO_OPS, STOCK_WRITE)
94 97
95 public: 98 public:
96 ExpressionValue (EType valuetype); 99 ExpressionValue (EType valuetype);
97 ~ExpressionValue(); 100 ~ExpressionValue();
98 101
112 // 115 //
113 class ExpressionColon final : public ExpressionSymbol 116 class ExpressionColon final : public ExpressionSymbol
114 { 117 {
115 public: 118 public:
116 ExpressionColon() : 119 ExpressionColon() :
117 ExpressionSymbol (eColonSymbol) {} 120 ExpressionSymbol (Expression::eColonSymbol) {}
118 }; 121 };
119 122
120 #endif // BOTC_EXPRESSION_H 123 #endif // BOTC_EXPRESSION_H

mercurial