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 |