src/Expression.h

Mon, 03 Mar 2014 17:02:38 +0200

author
Teemu Piippo <crimsondusk64@gmail.com>
date
Mon, 03 Mar 2014 17:02:38 +0200
changeset 117
cc1e14d55047
parent 115
9be16e1c1e44
permissions
-rw-r--r--

- reserved 'constexpr' as a keyword because I know I will need it someday

91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1 #ifndef BOTC_EXPRESSION_H
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
2 #define BOTC_EXPRESSION_H
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
3 #include "Parser.h"
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
4
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
5 class DataBuffer;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
6 class ExpressionSymbol;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
7 class ExpressionValue;
94
8915ee6a277d - expression evaluation implemented! Expressions are now complete for the most part aside from some unary operator quirks in verification.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 93
diff changeset
8 class ExpressionOperator;
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
9
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
10 // =============================================================================
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
11 //
108
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
12 named_enum ExpressionOperatorType
92
3a00d396bce2 - now compiles again, further work on expressions (proper parsing + assignment operator handling (albeit unrelated) + operator adjusting)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 91
diff changeset
13 {
108
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
14 OPER_NegateLogical,
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
15 OPER_UnaryMinus,
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
16 OPER_Multiplication,
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
17 OPER_Division,
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
18 OPER_Modulus,
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
19 OPER_Addition,
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
20 OPER_Subtraction,
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
21 OPER_LeftShift,
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
22 OPER_RightShift,
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
23 OPER_CompareLesser,
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
24 OPER_CompareGreater,
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
25 OPER_CompareAtLeast,
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
26 OPER_CompareAtMost,
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
27 OPER_CompareEquals,
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
28 OPER_CompareNotEquals,
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
29 OPER_BitwiseAnd,
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
30 OPER_BitwiseXOr,
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
31 OPER_BitwiseOr,
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
32 OPER_LogicalAnd,
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
33 OPER_LogicalOr,
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
34 OPER_Ternary,
92
3a00d396bce2 - now compiles again, further work on expressions (proper parsing + assignment operator handling (albeit unrelated) + operator adjusting)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 91
diff changeset
35 };
3a00d396bce2 - now compiles again, further work on expressions (proper parsing + assignment operator handling (albeit unrelated) + operator adjusting)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 91
diff changeset
36
3a00d396bce2 - now compiles again, further work on expressions (proper parsing + assignment operator handling (albeit unrelated) + operator adjusting)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 91
diff changeset
37 // =============================================================================
3a00d396bce2 - now compiles again, further work on expressions (proper parsing + assignment operator handling (albeit unrelated) + operator adjusting)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 91
diff changeset
38 //
108
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
39 enum ExpressionSymbolType
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
40 {
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
41 EXPRSYM_Operator,
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
42 EXPRSYM_Value,
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
43 EXPRSYM_Colon,
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
44 };
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
45
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
46 class Expression final
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
47 {
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
48 public:
93
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
49 using SymbolList = List<ExpressionSymbol*>;
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
50
108
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
51 Expression (BotscriptParser* parser, Lexer* lx, DataType reqtype);
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
52 ~Expression();
115
9be16e1c1e44 - reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents: 112
diff changeset
53 ExpressionValue* getResult();
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
54
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
55 private:
115
9be16e1c1e44 - reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents: 112
diff changeset
56 BotscriptParser* m_parser;
9be16e1c1e44 - reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents: 112
diff changeset
57 Lexer* m_lexer;
9be16e1c1e44 - reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents: 112
diff changeset
58 SymbolList m_symbols;
9be16e1c1e44 - reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents: 112
diff changeset
59 DataType m_type;
9be16e1c1e44 - reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents: 112
diff changeset
60 String m_badTokenText;
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
61
115
9be16e1c1e44 - reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents: 112
diff changeset
62 ExpressionValue* evaluate(); // Process the expression and yield a result
9be16e1c1e44 - reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents: 112
diff changeset
63 ExpressionSymbol* parseSymbol();
9be16e1c1e44 - reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents: 112
diff changeset
64 String getTokenString();
9be16e1c1e44 - reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents: 112
diff changeset
65 void adjustOperators();
9be16e1c1e44 - reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents: 112
diff changeset
66 void verify(); // Ensure the expr is valid
9be16e1c1e44 - reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents: 112
diff changeset
67 void tryVerifyValue (bool* verified, SymbolList::Iterator it);
9be16e1c1e44 - reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents: 112
diff changeset
68 ExpressionValue* evaluateOperator (const ExpressionOperator* op,
94
8915ee6a277d - expression evaluation implemented! Expressions are now complete for the most part aside from some unary operator quirks in verification.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 93
diff changeset
69 const List<ExpressionValue*>& values);
115
9be16e1c1e44 - reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents: 112
diff changeset
70 SymbolList::Iterator findPrioritizedOperator();
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
71 };
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
72
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
73 // =============================================================================
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
74 //
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
75 class ExpressionSymbol
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
76 {
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
77 public:
108
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
78 ExpressionSymbol (ExpressionSymbolType type) :
115
9be16e1c1e44 - reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents: 112
diff changeset
79 m_type (type) {}
92
3a00d396bce2 - now compiles again, further work on expressions (proper parsing + assignment operator handling (albeit unrelated) + operator adjusting)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 91
diff changeset
80
115
9be16e1c1e44 - reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents: 112
diff changeset
81 PROPERTY (private, ExpressionSymbolType, type, setType, STOCK_WRITE)
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
82 };
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
83
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
84 // =============================================================================
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
85 //
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
86 class ExpressionOperator final : public ExpressionSymbol
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
87 {
115
9be16e1c1e44 - reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents: 112
diff changeset
88 PROPERTY (public, ExpressionOperatorType, id, setID, STOCK_WRITE)
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
89
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
90 public:
108
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
91 ExpressionOperator (ExpressionOperatorType id);
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
92 };
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
93
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
94 // =============================================================================
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
95 //
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
96 class ExpressionValue final : public ExpressionSymbol
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
97 {
115
9be16e1c1e44 - reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents: 112
diff changeset
98 PROPERTY (public, int, value, setValue, STOCK_WRITE)
9be16e1c1e44 - reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents: 112
diff changeset
99 PROPERTY (public, DataBuffer*, buffer, setBuffer, STOCK_WRITE)
9be16e1c1e44 - reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents: 112
diff changeset
100 PROPERTY (public, DataType, valueType, setValueType, STOCK_WRITE)
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
101
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
102 public:
108
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
103 ExpressionValue (DataType valuetype);
92
3a00d396bce2 - now compiles again, further work on expressions (proper parsing + assignment operator handling (albeit unrelated) + operator adjusting)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 91
diff changeset
104 ~ExpressionValue();
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
105
115
9be16e1c1e44 - reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents: 112
diff changeset
106 void convertToBuffer();
94
8915ee6a277d - expression evaluation implemented! Expressions are now complete for the most part aside from some unary operator quirks in verification.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 93
diff changeset
107
115
9be16e1c1e44 - reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents: 112
diff changeset
108 inline ExpressionValue* clone() const
94
8915ee6a277d - expression evaluation implemented! Expressions are now complete for the most part aside from some unary operator quirks in verification.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 93
diff changeset
109 {
8915ee6a277d - expression evaluation implemented! Expressions are now complete for the most part aside from some unary operator quirks in verification.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 93
diff changeset
110 return new ExpressionValue (*this);
8915ee6a277d - expression evaluation implemented! Expressions are now complete for the most part aside from some unary operator quirks in verification.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 93
diff changeset
111 }
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
112
115
9be16e1c1e44 - reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents: 112
diff changeset
113 inline bool isConstexpr() const
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
114 {
115
9be16e1c1e44 - reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents: 112
diff changeset
115 return buffer() == null;
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
116 }
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
117 };
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
118
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
119 // =============================================================================
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
120 //
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
121 // This class represents a ":" in the expression. It serves as the colon for the
108
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
122 // ternary ?: OPER_erator. It's not an OPER_erand nor is an OPER_erator, nor can we just
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
123 // skip it so it is its own thing here.
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
124 //
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
125 class ExpressionColon final : public ExpressionSymbol
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
126 {
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
127 public:
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
128 ExpressionColon() :
108
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
129 ExpressionSymbol (EXPRSYM_Colon) {}
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
130 };
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
131
108
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
132 #endif // BOTC_EXPRESSION_H

mercurial