| |
1 #ifndef BOTC_EXPRESSION_H |
| |
2 #define BOTC_EXPRESSION_H |
| |
3 #include "Parser.h" |
| |
4 |
| |
5 class DataBuffer; |
| |
6 class ExpressionSymbol; |
| |
7 class ExpressionValue; |
| |
8 |
| |
9 // ============================================================================= |
| |
10 // |
| |
11 class Expression final |
| |
12 { |
| |
13 public: |
| |
14 Expression (BotscriptParser* parser, EType reqtype, Lexer* lx); |
| |
15 ~Expression(); |
| |
16 ExpressionValue* GetResult(); |
| |
17 |
| |
18 private: |
| |
19 Lexer* mLexer; |
| |
20 List<ExpressionSymbol*> mSymbols; |
| |
21 EType mType; |
| |
22 ExpressionValue* mResult; |
| |
23 BotscriptParser* mParser; |
| |
24 |
| |
25 ExpressionValue* Evaluate(); // Process the expression and yield a result |
| |
26 ExpressionSymbol* ParseSymbol(); |
| |
27 String GetTokenString(); |
| |
28 void Verify(); // Ensure the expr is valid |
| |
29 }; |
| |
30 |
| |
31 // ============================================================================= |
| |
32 // |
| |
33 class ExpressionSymbol |
| |
34 { |
| |
35 public: |
| |
36 enum EExpressionSymbolType |
| |
37 { |
| |
38 eOperator, |
| |
39 eOperand, |
| |
40 eColon, |
| |
41 }; |
| |
42 |
| |
43 PROPERTY (private, EExpressionSymbolType, Type, NO_OPS, STOCK_WRITE) |
| |
44 }; |
| |
45 |
| |
46 // ============================================================================= |
| |
47 // |
| |
48 class ExpressionOperator final : public ExpressionSymbol |
| |
49 { |
| |
50 PROPERTY (public, int, ID, NO_OPS, STOCK_WRITE) |
| |
51 |
| |
52 public: |
| |
53 ExpressionOperator (int id); |
| |
54 }; |
| |
55 |
| |
56 // ============================================================================= |
| |
57 // |
| |
58 class ExpressionValue final : public ExpressionSymbol |
| |
59 { |
| |
60 PROPERTY (public, int, Value, BOOL_OPS, STOCK_WRITE) |
| |
61 PROPERTY (public, DataBuffer*, Buffer, NO_OPS, STOCK_WRITE) |
| |
62 PROPERTY (public, EType, ValueType, NO_OPS, STOCK_WRITE) |
| |
63 |
| |
64 public: |
| |
65 ExpressionValue (EType valuetype); |
| |
66 |
| |
67 void ConvertToBuffer(); |
| |
68 |
| |
69 inline bool IsConstexpr() const |
| |
70 { |
| |
71 return GetBuffer() == null; |
| |
72 } |
| |
73 }; |
| |
74 |
| |
75 // ============================================================================= |
| |
76 // |
| |
77 // This class represents a ":" in the expression. It serves as the colon for the |
| |
78 // ternary ?: operator. It's not an operand nor is an operator, nor can we just |
| |
79 // skip it so it is its own thing here. |
| |
80 // |
| |
81 class ExpressionColon final : public ExpressionSymbol |
| |
82 { |
| |
83 public: |
| |
84 ExpressionColon() : |
| |
85 mType (eColon) {} |
| |
86 }; |
| |
87 |
| |
88 #endif // BOTC_EXPRESSION_H |