6 class ExpressionSymbol; |
6 class ExpressionSymbol; |
7 class ExpressionValue; |
7 class ExpressionValue; |
8 |
8 |
9 // ============================================================================= |
9 // ============================================================================= |
10 // |
10 // |
|
11 enum EOperator |
|
12 { |
|
13 opNegateLogical, |
|
14 opUnaryMinus, |
|
15 opMultiplication, |
|
16 opDivision, |
|
17 opModulus, |
|
18 opAddition, |
|
19 opSubtraction, |
|
20 opLeftShift, |
|
21 opRightShift, |
|
22 opCompareLesser, |
|
23 opCompareGreater, |
|
24 opCompareAtLeast, |
|
25 opCompareAtMost, |
|
26 opCompareEquals, |
|
27 opCompareNotEquals, |
|
28 opBitwiseAnd, |
|
29 opBitwiseXOr, |
|
30 opBitwiseOr, |
|
31 opLogicalAnd, |
|
32 opLogicalOr, |
|
33 opTernary, |
|
34 }; |
|
35 |
|
36 // ============================================================================= |
|
37 // |
11 class Expression final |
38 class Expression final |
12 { |
39 { |
13 public: |
40 public: |
14 Expression (BotscriptParser* parser, EType reqtype, Lexer* lx); |
41 Expression (BotscriptParser* parser, Lexer* lx, EType reqtype); |
15 ~Expression(); |
42 ~Expression(); |
16 ExpressionValue* GetResult(); |
43 ExpressionValue* GetResult(); |
17 |
44 |
18 private: |
45 private: |
|
46 BotscriptParser* mParser; |
19 Lexer* mLexer; |
47 Lexer* mLexer; |
20 List<ExpressionSymbol*> mSymbols; |
48 List<ExpressionSymbol*> mSymbols; |
21 EType mType; |
49 EType mType; |
22 ExpressionValue* mResult; |
50 ExpressionValue* mResult; |
23 BotscriptParser* mParser; |
|
24 |
51 |
25 ExpressionValue* Evaluate(); // Process the expression and yield a result |
52 ExpressionValue* Evaluate(); // Process the expression and yield a result |
26 ExpressionSymbol* ParseSymbol(); |
53 ExpressionSymbol* ParseSymbol(); |
27 String GetTokenString(); |
54 String GetTokenString(); |
|
55 void AdjustOperators(); |
28 void Verify(); // Ensure the expr is valid |
56 void Verify(); // Ensure the expr is valid |
29 }; |
57 }; |
30 |
58 |
31 // ============================================================================= |
59 // ============================================================================= |
32 // |
60 // |
33 class ExpressionSymbol |
61 class ExpressionSymbol |
34 { |
62 { |
35 public: |
63 public: |
36 enum EExpressionSymbolType |
64 enum EExpressionSymbolType |
37 { |
65 { |
38 eOperator, |
66 eOperatorSymbol, |
39 eOperand, |
67 eValueSymbol, |
40 eColon, |
68 eColonSymbol, |
41 }; |
69 }; |
|
70 |
|
71 ExpressionSymbol (EExpressionSymbolType type) : |
|
72 mType (type) {} |
42 |
73 |
43 PROPERTY (private, EExpressionSymbolType, Type, NO_OPS, STOCK_WRITE) |
74 PROPERTY (private, EExpressionSymbolType, Type, NO_OPS, STOCK_WRITE) |
44 }; |
75 }; |
45 |
76 |
46 // ============================================================================= |
77 // ============================================================================= |
47 // |
78 // |
48 class ExpressionOperator final : public ExpressionSymbol |
79 class ExpressionOperator final : public ExpressionSymbol |
49 { |
80 { |
50 PROPERTY (public, int, ID, NO_OPS, STOCK_WRITE) |
81 PROPERTY (public, EOperator, ID, NO_OPS, STOCK_WRITE) |
51 |
82 |
52 public: |
83 public: |
53 ExpressionOperator (int id); |
84 ExpressionOperator (EOperator id); |
54 }; |
85 }; |
55 |
86 |
56 // ============================================================================= |
87 // ============================================================================= |
57 // |
88 // |
58 class ExpressionValue final : public ExpressionSymbol |
89 class ExpressionValue final : public ExpressionSymbol |
59 { |
90 { |
60 PROPERTY (public, int, Value, BOOL_OPS, STOCK_WRITE) |
91 PROPERTY (public, int, Value, NUM_OPS, STOCK_WRITE) |
61 PROPERTY (public, DataBuffer*, Buffer, NO_OPS, STOCK_WRITE) |
92 PROPERTY (public, DataBuffer*, Buffer, NO_OPS, STOCK_WRITE) |
62 PROPERTY (public, EType, ValueType, NO_OPS, STOCK_WRITE) |
93 PROPERTY (public, EType, ValueType, NO_OPS, STOCK_WRITE) |
63 |
94 |
64 public: |
95 public: |
65 ExpressionValue (EType valuetype); |
96 ExpressionValue (EType valuetype); |
|
97 ~ExpressionValue(); |
66 |
98 |
67 void ConvertToBuffer(); |
99 void ConvertToBuffer(); |
68 |
100 |
69 inline bool IsConstexpr() const |
101 inline bool IsConstexpr() const |
70 { |
102 { |