src/Expression.cc

Sun, 23 Feb 2014 17:45:34 +0200

author
Teemu Piippo <crimsondusk64@gmail.com>
date
Sun, 23 Feb 2014 17:45:34 +0200
changeset 112
def56932f938
parent 110
7a7a53f1d51b
child 115
9be16e1c1e44
permissions
-rw-r--r--

- changed the PROPERTY macro to a simper version and brought some refactoring with it

91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1 #include "Expression.h"
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
2 #include "DataBuffer.h"
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
3 #include "Lexer.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 struct OperatorInfo
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
6 {
112
def56932f938 - changed the PROPERTY macro to a simper version and brought some refactoring with it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 110
diff changeset
7 ETokenType token;
93
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
8 int priority;
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
9 int numoperands;
108
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
10 DataHeader header;
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
11 };
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
12
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
13 static const OperatorInfo gOperators[] =
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
14 {
110
7a7a53f1d51b - extended refactor to EToken (now TokenType)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 108
diff changeset
15 {TK_ExclamationMark, 0, 1, DH_NegateLogical, },
7a7a53f1d51b - extended refactor to EToken (now TokenType)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 108
diff changeset
16 {TK_Minus, 0, 1, DH_UnaryMinus, },
7a7a53f1d51b - extended refactor to EToken (now TokenType)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 108
diff changeset
17 {TK_Multiply, 10, 2, DH_Multiply, },
7a7a53f1d51b - extended refactor to EToken (now TokenType)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 108
diff changeset
18 {TK_Divide, 10, 2, DH_Divide, },
7a7a53f1d51b - extended refactor to EToken (now TokenType)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 108
diff changeset
19 {TK_Modulus, 10, 2, DH_Modulus, },
7a7a53f1d51b - extended refactor to EToken (now TokenType)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 108
diff changeset
20 {TK_Plus, 20, 2, DH_Add, },
7a7a53f1d51b - extended refactor to EToken (now TokenType)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 108
diff changeset
21 {TK_Minus, 20, 2, DH_Subtract, },
7a7a53f1d51b - extended refactor to EToken (now TokenType)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 108
diff changeset
22 {TK_LeftShift, 30, 2, DH_LeftShift, },
7a7a53f1d51b - extended refactor to EToken (now TokenType)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 108
diff changeset
23 {TK_RightShift, 30, 2, DH_RightShift, },
7a7a53f1d51b - extended refactor to EToken (now TokenType)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 108
diff changeset
24 {TK_Lesser, 40, 2, DH_LessThan, },
7a7a53f1d51b - extended refactor to EToken (now TokenType)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 108
diff changeset
25 {TK_Greater, 40, 2, DH_GreaterThan, },
7a7a53f1d51b - extended refactor to EToken (now TokenType)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 108
diff changeset
26 {TK_AtLeast, 40, 2, DH_AtLeast, },
7a7a53f1d51b - extended refactor to EToken (now TokenType)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 108
diff changeset
27 {TK_AtMost, 40, 2, DH_AtMost, },
7a7a53f1d51b - extended refactor to EToken (now TokenType)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 108
diff changeset
28 {TK_Equals, 50, 2, DH_Equals },
7a7a53f1d51b - extended refactor to EToken (now TokenType)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 108
diff changeset
29 {TK_NotEquals, 50, 2, DH_NotEquals },
7a7a53f1d51b - extended refactor to EToken (now TokenType)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 108
diff changeset
30 {TK_Amperstand, 60, 2, DH_AndBitwise },
7a7a53f1d51b - extended refactor to EToken (now TokenType)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 108
diff changeset
31 {TK_Caret, 70, 2, DH_EorBitwise },
7a7a53f1d51b - extended refactor to EToken (now TokenType)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 108
diff changeset
32 {TK_Bar, 80, 2, DH_OrBitwise },
7a7a53f1d51b - extended refactor to EToken (now TokenType)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 108
diff changeset
33 {TK_DoubleAmperstand, 90, 2, DH_AndLogical },
7a7a53f1d51b - extended refactor to EToken (now TokenType)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 108
diff changeset
34 {TK_DoubleBar, 100, 2, DH_OrLogical },
7a7a53f1d51b - extended refactor to EToken (now TokenType)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 108
diff changeset
35 {TK_QuestionMark, 110, 3, (DataHeader) 0 },
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
36 };
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
37
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
38 // =============================================================================
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
39 //
108
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
40 Expression::Expression (BotscriptParser* parser, Lexer* lx, DataType reqtype) :
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
41 mParser (parser),
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
42 mLexer (lx),
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
43 mType (reqtype)
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
44 {
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
45 ExpressionSymbol* sym;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
46
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
47 while ((sym = ParseSymbol()) != null)
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
48 mSymbols << sym;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
49
106
9174be9ac686 - improved error handling a tad
Teemu Piippo <crimsondusk64@gmail.com>
parents: 105
diff changeset
50 // If we were unable to get any expression symbols, something's wonky with
9174be9ac686 - improved error handling a tad
Teemu Piippo <crimsondusk64@gmail.com>
parents: 105
diff changeset
51 // the script. Report an error. mBadTokenText is set to the token that
9174be9ac686 - improved error handling a tad
Teemu Piippo <crimsondusk64@gmail.com>
parents: 105
diff changeset
52 // ParseSymbol ends at when it returns false.
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
53 if (mSymbols.IsEmpty())
106
9174be9ac686 - improved error handling a tad
Teemu Piippo <crimsondusk64@gmail.com>
parents: 105
diff changeset
54 Error ("unknown identifier '%1'", mBadTokenText);
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
55
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
56 AdjustOperators();
93
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
57 Verify();
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
58 Evaluate();
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
59 }
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
60
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
61 // =============================================================================
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
62 //
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
63 Expression::~Expression()
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
64 {
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
65 for (ExpressionSymbol* sym : mSymbols)
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
66 delete sym;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
67 }
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
68
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
69 // =============================================================================
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
70 //
108
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
71 // Try to parse an expression symbol (i.e. an OPER_erator or OPER_erand or a colon)
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
72 // from the lexer.
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 ExpressionSymbol* Expression::ParseSymbol()
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
75 {
112
def56932f938 - changed the PROPERTY macro to a simper version and brought some refactoring with it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 110
diff changeset
76 int pos = mLexer->Position();
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
77 ExpressionValue* op = null;
107
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
78
112
def56932f938 - changed the PROPERTY macro to a simper version and brought some refactoring with it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 110
diff changeset
79 if (mLexer->Next (TK_Colon))
107
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
80 return new ExpressionColon;
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
81
108
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
82 // Check for OPER_erator
107
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
83 for (const OperatorInfo& op : gOperators)
112
def56932f938 - changed the PROPERTY macro to a simper version and brought some refactoring with it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 110
diff changeset
84 if (mLexer->Next (op.token))
108
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
85 return new ExpressionOperator ((ExpressionOperatorType) (&op - &gOperators[0]));
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
86
107
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
87 // Check sub-expression
112
def56932f938 - changed the PROPERTY macro to a simper version and brought some refactoring with it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 110
diff changeset
88 if (mLexer->Next (TK_ParenStart))
107
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
89 {
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
90 Expression expr (mParser, mLexer, mType);
110
7a7a53f1d51b - extended refactor to EToken (now TokenType)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 108
diff changeset
91 mLexer->MustGetNext (TK_ParenEnd);
112
def56932f938 - changed the PROPERTY macro to a simper version and brought some refactoring with it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 110
diff changeset
92 return expr.Result()->Clone();
107
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
93 }
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
94
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
95 op = new ExpressionValue (mType);
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
96
107
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
97 // Check function
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
98 if (CommandInfo* comm = FindCommandByName (mLexer->PeekNextString()))
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
99 {
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
100 mLexer->Skip();
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
101
108
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
102 if (mType != TYPE_Unknown && comm->returnvalue != mType)
107
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
103 Error ("%1 returns an incompatible data type", comm->name);
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
104
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
105 op->SetBuffer (mParser->ParseCommand (comm));
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
106 return op;
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
107 }
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
108
107
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
109 // Check for variables
112
def56932f938 - changed the PROPERTY macro to a simper version and brought some refactoring with it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 110
diff changeset
110 if (mLexer->Next (TK_DollarSign))
107
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
111 {
110
7a7a53f1d51b - extended refactor to EToken (now TokenType)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 108
diff changeset
112 mLexer->MustGetNext (TK_Symbol);
112
def56932f938 - changed the PROPERTY macro to a simper version and brought some refactoring with it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 110
diff changeset
113 Variable* var = mParser->FindVariable (TokenString());
107
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
114
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
115 if (var == null)
112
def56932f938 - changed the PROPERTY macro to a simper version and brought some refactoring with it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 110
diff changeset
116 Error ("unknown variable %1", TokenString());
107
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
117
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
118 if (var->type != mType)
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
119 Error ("expression requires %1, variable $%2 is of type %3",
112
def56932f938 - changed the PROPERTY macro to a simper version and brought some refactoring with it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 110
diff changeset
120 DataTypeName (mType), var->name, DataTypeName (var->type));
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
121
107
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
122 if (var->isarray)
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
123 {
110
7a7a53f1d51b - extended refactor to EToken (now TokenType)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 108
diff changeset
124 mLexer->MustGetNext (TK_BracketStart);
108
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
125 Expression expr (mParser, mLexer, TYPE_Int);
112
def56932f938 - changed the PROPERTY macro to a simper version and brought some refactoring with it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 110
diff changeset
126 expr.Result()->ConvertToBuffer();
def56932f938 - changed the PROPERTY macro to a simper version and brought some refactoring with it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 110
diff changeset
127 DataBuffer* buf = expr.Result()->Buffer()->Clone();
108
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
128 buf->WriteDWord (DH_PushGlobalArray);
107
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
129 buf->WriteDWord (var->index);
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
130 op->SetBuffer (buf);
110
7a7a53f1d51b - extended refactor to EToken (now TokenType)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 108
diff changeset
131 mLexer->MustGetNext (TK_BracketEnd);
107
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
132 }
108
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
133 elif (var->writelevel == WRITE_Constexpr)
107
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
134 op->SetValue (var->value);
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
135 else
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
136 {
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
137 DataBuffer* buf = new DataBuffer (8);
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
138
107
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
139 if (var->IsGlobal())
108
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
140 buf->WriteDWord (DH_PushGlobalVar);
107
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
141 else
108
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
142 buf->WriteDWord (DH_PushLocalVar);
107
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
143
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
144 buf->WriteDWord (var->index);
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
145 op->SetBuffer (buf);
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
146 }
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
147
107
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
148 return op;
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
149 }
101
9ffae10ef76f - variables: merged const and mutable variables into one system, added constexpr variable support. still no locals
Teemu Piippo <crimsondusk64@gmail.com>
parents: 100
diff changeset
150
107
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
151 // Check for literal
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
152 switch (mType)
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
153 {
108
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
154 case TYPE_Void:
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
155 case TYPE_Unknown:
107
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
156 {
112
def56932f938 - changed the PROPERTY macro to a simper version and brought some refactoring with it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 110
diff changeset
157 Error ("unknown identifier `%1` (expected keyword, function or variable)", TokenString());
107
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
158 break;
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
159 }
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
160
108
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
161 case TYPE_Bool:
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
162 {
112
def56932f938 - changed the PROPERTY macro to a simper version and brought some refactoring with it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 110
diff changeset
163 if (mLexer->Next (TK_True) || mLexer->Next (TK_False))
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
164 {
112
def56932f938 - changed the PROPERTY macro to a simper version and brought some refactoring with it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 110
diff changeset
165 ETokenType tt = mLexer->TokenType();
def56932f938 - changed the PROPERTY macro to a simper version and brought some refactoring with it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 110
diff changeset
166 op->SetValue (tt == TK_True ? 1 : 0);
107
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
167 return op;
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
168 }
107
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
169 }
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
170
108
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
171 case TYPE_Int:
107
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
172 {
112
def56932f938 - changed the PROPERTY macro to a simper version and brought some refactoring with it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 110
diff changeset
173 if (mLexer->Next (TK_Number))
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
174 {
112
def56932f938 - changed the PROPERTY macro to a simper version and brought some refactoring with it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 110
diff changeset
175 op->SetValue (TokenString().ToLong());
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
176 return op;
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
177 }
107
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
178 }
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
179
108
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
180 case TYPE_String:
107
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
181 {
112
def56932f938 - changed the PROPERTY macro to a simper version and brought some refactoring with it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 110
diff changeset
182 if (mLexer->Next (TK_String))
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
183 {
112
def56932f938 - changed the PROPERTY macro to a simper version and brought some refactoring with it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 110
diff changeset
184 op->SetValue (StringTableIndex (TokenString()));
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
185 return op;
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
186 }
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
187 }
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
188 }
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
189
112
def56932f938 - changed the PROPERTY macro to a simper version and brought some refactoring with it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 110
diff changeset
190 mBadTokenText = mLexer->Token()->text;
107
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
191 mLexer->SetPosition (pos);
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
192 delete op;
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
193 return null;
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
194 }
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
195
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
196 // =============================================================================
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
197 //
108
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
198 // The symbol parsing process only does token-based checking for OPER_erators. Thus
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
199 // ALL minus OPER_erators are actually unary minuses simply because both have
110
7a7a53f1d51b - extended refactor to EToken (now TokenType)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 108
diff changeset
200 //TK_Minus as their token and the unary minus is prior to the binary minus in
108
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
201 // the OPER_erator table. Now that we have all symbols present, we can correct
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
202 // cases like this.
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
203 //
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
204 void Expression::AdjustOperators()
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
205 {
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
206 for (auto it = mSymbols.begin() + 1; it != mSymbols.end(); ++it)
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
207 {
112
def56932f938 - changed the PROPERTY macro to a simper version and brought some refactoring with it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 110
diff changeset
208 if ((*it)->Type() != EXPRSYM_Operator)
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
209 continue;
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
210
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
211 ExpressionOperator* op = static_cast<ExpressionOperator*> (*it);
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
212
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
213 // Unary minus with a value as the previous symbol cannot really be
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
214 // unary; replace with binary minus.
112
def56932f938 - changed the PROPERTY macro to a simper version and brought some refactoring with it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 110
diff changeset
215 if (op->ID() == OPER_UnaryMinus && (*(it - 1))->Type() == EXPRSYM_Value)
108
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
216 op->SetID (OPER_Subtraction);
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
217 }
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
218 }
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
219
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
220 // =============================================================================
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
221 //
93
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
222 // Verifies a single value. Helper function for Expression::Verify.
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
223 //
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
224 void Expression::TryVerifyValue (bool* verified, SymbolList::Iterator it)
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
225 {
108
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
226 // If it's an unary OPER_erator we skip to its value. The actual OPER_erator will
95
4db95b92c29a - fixed verification with unary operators
Teemu Piippo <crimsondusk64@gmail.com>
parents: 94
diff changeset
227 // be verified separately.
112
def56932f938 - changed the PROPERTY macro to a simper version and brought some refactoring with it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 110
diff changeset
228 if ((*it)->Type() == EXPRSYM_Operator &&
def56932f938 - changed the PROPERTY macro to a simper version and brought some refactoring with it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 110
diff changeset
229 gOperators[static_cast<ExpressionOperator*> (*it)->ID()].numoperands == 1)
95
4db95b92c29a - fixed verification with unary operators
Teemu Piippo <crimsondusk64@gmail.com>
parents: 94
diff changeset
230 {
4db95b92c29a - fixed verification with unary operators
Teemu Piippo <crimsondusk64@gmail.com>
parents: 94
diff changeset
231 ++it;
4db95b92c29a - fixed verification with unary operators
Teemu Piippo <crimsondusk64@gmail.com>
parents: 94
diff changeset
232 }
4db95b92c29a - fixed verification with unary operators
Teemu Piippo <crimsondusk64@gmail.com>
parents: 94
diff changeset
233
93
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
234 int i = it - mSymbols.begin();
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
235
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
236 // Ensure it's an actual value
112
def56932f938 - changed the PROPERTY macro to a simper version and brought some refactoring with it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 110
diff changeset
237 if ((*it)->Type() != EXPRSYM_Value)
93
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
238 Error ("malformed expression (symbol #%1 is not a value)", i);
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
239
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
240 verified[i] = true;
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
241 }
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
242
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
243 // =============================================================================
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
244 //
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
245 // Ensures the expression is valid and well-formed and not OMGWTFBBQ. Throws an
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
246 // error if this is not the case.
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
247 //
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
248 void Expression::Verify()
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
249 {
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
250 if (mSymbols.Size() == 1)
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
251 {
112
def56932f938 - changed the PROPERTY macro to a simper version and brought some refactoring with it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 110
diff changeset
252 if (mSymbols[0]->Type() != EXPRSYM_Value)
93
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
253 Error ("bad expression");
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
254
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
255 return;
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
256 }
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
257
108
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
258 if (mType == TYPE_String)
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
259 Error ("Cannot perform OPER_erations on strings");
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
260
93
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
261 bool* verified = new bool[mSymbols.Size()];
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
262 memset (verified, 0, mSymbols.Size() * sizeof (decltype (*verified)));
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
263 const auto last = mSymbols.end() - 1;
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
264 const auto first = mSymbols.begin();
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
265
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
266 for (auto it = mSymbols.begin(); it != mSymbols.end(); ++it)
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
267 {
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
268 int i = (it - first);
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
269
112
def56932f938 - changed the PROPERTY macro to a simper version and brought some refactoring with it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 110
diff changeset
270 if ((*it)->Type() != EXPRSYM_Operator)
93
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
271 continue;
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
272
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
273 ExpressionOperator* op = static_cast<ExpressionOperator*> (*it);
112
def56932f938 - changed the PROPERTY macro to a simper version and brought some refactoring with it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 110
diff changeset
274 int numoperands = gOperators[op->ID()].numoperands;
93
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
275
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
276 switch (numoperands)
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
277 {
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
278 case 1:
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
279 {
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
280 // Ensure that:
108
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
281 // - unary OPER_erator is not the last symbol
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
282 // - unary OPER_erator is succeeded by a value symbol
93
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
283 // - neither symbol overlaps with something already verified
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
284 TryVerifyValue (verified, it + 1);
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
285
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
286 if (it == last || verified[i] == true)
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
287 Error ("malformed expression");
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
288
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
289 verified[i] = true;
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
290 break;
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
291 }
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
292
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
293 case 2:
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
294 {
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
295 // Ensure that:
108
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
296 // - binary OPER_erator is not the first or last symbol
93
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
297 // - is preceded and succeeded by values
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
298 // - none of the three tokens are already verified
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
299 //
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
300 // Basically similar logic as above.
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
301 if (it == first || it == last || verified[i] == true)
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
302 Error ("malformed expression");
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
303
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
304 TryVerifyValue (verified, it + 1);
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
305 TryVerifyValue (verified, it - 1);
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
306 verified[i] = true;
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
307 break;
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
308 }
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
309
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
310 case 3:
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
311 {
108
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
312 // Ternary OPER_erator case. This goes a bit nuts.
93
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
313 // This time we have the following:
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
314 //
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
315 // (VALUE) ? (VALUE) : (VALUE)
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
316 // ^
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
317 // --------/ we are here
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
318 //
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
319 // Check that the:
108
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
320 // - questionmark OPER_erator is not misplaced (first or last)
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
321 // - the value behind the OPER_erator (-1) is valid
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
322 // - the value after the OPER_erator (+1) is valid
93
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
323 // - the value after the colon (+3) is valid
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
324 // - none of the five tokens are verified
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
325 //
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
326 TryVerifyValue (verified, it - 1);
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
327 TryVerifyValue (verified, it + 1);
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
328 TryVerifyValue (verified, it + 3);
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
329
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
330 if (it == first ||
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
331 it >= mSymbols.end() - 3 ||
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
332 verified[i] == true ||
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
333 verified[i + 2] == true ||
112
def56932f938 - changed the PROPERTY macro to a simper version and brought some refactoring with it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 110
diff changeset
334 (*(it + 2))->Type() != EXPRSYM_Colon)
93
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
335 {
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
336 Error ("malformed expression");
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
337 }
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
338
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
339 verified[i] = true;
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
340 verified[i + 2] = true;
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
341 break;
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
342 }
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
343
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
344 default:
108
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
345 Error ("WTF OPER_erator with %1 OPER_erands", numoperands);
93
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
346 }
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
347 }
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
348
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
349 for (int i = 0; i < mSymbols.Size(); ++i)
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
350 if (verified[i] == false)
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
351 Error ("malformed expression: expr symbol #%1 is was left unverified", i);
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
352
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
353 delete verified;
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
354 }
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
355
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
356
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
357 // =============================================================================
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
358 //
108
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
359 // Which OPER_erator to evaluate?
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
360 //
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
361 Expression::SymbolList::Iterator Expression::FindPrioritizedOperator()
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
362 {
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
363 SymbolList::Iterator best = mSymbols.end();
112
def56932f938 - changed the PROPERTY macro to a simper version and brought some refactoring with it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 110
diff changeset
364 int bestpriority = __INT_MAX__;
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
365
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
366 for (SymbolList::Iterator it = mSymbols.begin(); it != mSymbols.end(); ++it)
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
367 {
112
def56932f938 - changed the PROPERTY macro to a simper version and brought some refactoring with it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 110
diff changeset
368 if ((*it)->Type() != EXPRSYM_Operator)
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
369 continue;
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
370
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
371 ExpressionOperator* op = static_cast<ExpressionOperator*> (*it);
112
def56932f938 - changed the PROPERTY macro to a simper version and brought some refactoring with it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 110
diff changeset
372 const OperatorInfo* info = &gOperators[op->ID()];
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
373
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
374 if (info->priority < bestpriority)
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
375 {
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
376 best = it;
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
377 bestpriority = info->priority;
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
378 }
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
379 }
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
380
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
381 return best;
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
382 }
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
383
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
384 // =============================================================================
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
385 //
108
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
386 // Process the given OPER_erator and values into a new value.
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
387 //
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
388 ExpressionValue* Expression::EvaluateOperator (const ExpressionOperator* op,
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
389 const List<ExpressionValue*>& values)
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
390 {
112
def56932f938 - changed the PROPERTY macro to a simper version and brought some refactoring with it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 110
diff changeset
391 const OperatorInfo* info = &gOperators[op->ID()];
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
392 bool isconstexpr = true;
107
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
393 assert (values.Size() == info->numoperands);
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
394
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
395 for (ExpressionValue* val : values)
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
396 {
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
397 if (val->IsConstexpr() == false)
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
398 {
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
399 isconstexpr = false;
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
400 break;
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
401 }
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
402 }
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
403
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
404 // If not all of the values are constant expressions, none of them shall be.
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
405 if (isconstexpr == false)
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
406 for (ExpressionValue* val : values)
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
407 val->ConvertToBuffer();
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
408
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
409 ExpressionValue* newval = new ExpressionValue (mType);
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
410
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
411 if (isconstexpr == false)
95
4db95b92c29a - fixed verification with unary operators
Teemu Piippo <crimsondusk64@gmail.com>
parents: 94
diff changeset
412 {
4db95b92c29a - fixed verification with unary operators
Teemu Piippo <crimsondusk64@gmail.com>
parents: 94
diff changeset
413 // This is not a constant expression so we'll have to use databuffers
4db95b92c29a - fixed verification with unary operators
Teemu Piippo <crimsondusk64@gmail.com>
parents: 94
diff changeset
414 // to convey the expression to bytecode. Actual value cannot be evaluated
4db95b92c29a - fixed verification with unary operators
Teemu Piippo <crimsondusk64@gmail.com>
parents: 94
diff changeset
415 // until Zandronum processes it at run-time.
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
416 newval->SetBuffer (new DataBuffer);
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
417
112
def56932f938 - changed the PROPERTY macro to a simper version and brought some refactoring with it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 110
diff changeset
418 if (op->ID() == OPER_Ternary)
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
419 {
108
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
420 // There isn't a dataheader for ternary OPER_erator. Instead, we use DH_IfNotGoto
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
421 // to create an "if-block" inside an expression.
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
422 // Behold, big block of writing madness! :P
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
423 //
112
def56932f938 - changed the PROPERTY macro to a simper version and brought some refactoring with it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 110
diff changeset
424 DataBuffer* buf = newval->Buffer();
def56932f938 - changed the PROPERTY macro to a simper version and brought some refactoring with it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 110
diff changeset
425 DataBuffer* b0 = values[0]->Buffer();
def56932f938 - changed the PROPERTY macro to a simper version and brought some refactoring with it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 110
diff changeset
426 DataBuffer* b1 = values[1]->Buffer();
def56932f938 - changed the PROPERTY macro to a simper version and brought some refactoring with it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 110
diff changeset
427 DataBuffer* b2 = values[2]->Buffer();
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
428 ByteMark* mark1 = buf->AddMark (""); // start of "else" case
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
429 ByteMark* mark2 = buf->AddMark (""); // end of expression
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
430 buf->MergeAndDestroy (b0);
108
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
431 buf->WriteDWord (DH_IfNotGoto); // if the first OPER_erand (condition)
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
432 buf->AddReference (mark1); // didn't eval true, jump into mark1
108
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
433 buf->MergeAndDestroy (b1); // otherwise, perform second OPER_erand (true case)
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
434 buf->WriteDWord (DH_Goto); // afterwards, jump to the end, which is
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
435 buf->AddReference (mark2); // marked by mark2.
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
436 buf->AdjustMark (mark1); // move mark1 at the end of the true case
108
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
437 buf->MergeAndDestroy (b2); // perform third OPER_erand (false case)
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
438 buf->AdjustMark (mark2); // move the ending mark2 here
96
3384d7aa036a - ternary operator now works properly
Teemu Piippo <crimsondusk64@gmail.com>
parents: 95
diff changeset
439
3384d7aa036a - ternary operator now works properly
Teemu Piippo <crimsondusk64@gmail.com>
parents: 95
diff changeset
440 for (int i = 0; i < 3; ++i)
3384d7aa036a - ternary operator now works properly
Teemu Piippo <crimsondusk64@gmail.com>
parents: 95
diff changeset
441 values[i]->SetBuffer (null);
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
442 }
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
443 else
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
444 {
108
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
445 // Generic case: write all arguments and apply the OPER_erator's
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
446 // data header.
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
447 for (ExpressionValue* val : values)
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
448 {
112
def56932f938 - changed the PROPERTY macro to a simper version and brought some refactoring with it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 110
diff changeset
449 newval->Buffer()->MergeAndDestroy (val->Buffer());
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
450
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
451 // Null the pointer out so that the value's destructor will not
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
452 // attempt to double-free it.
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
453 val->SetBuffer (null);
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
454 }
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
455
112
def56932f938 - changed the PROPERTY macro to a simper version and brought some refactoring with it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 110
diff changeset
456 newval->Buffer()->WriteDWord (info->header);
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
457 }
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
458 }
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
459 else
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
460 {
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
461 // We have a constant expression. We know all the values involved and
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
462 // can thus compute the result of this expression on compile-time.
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
463 List<int> nums;
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
464 int a;
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
465
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
466 for (ExpressionValue* val : values)
112
def56932f938 - changed the PROPERTY macro to a simper version and brought some refactoring with it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 110
diff changeset
467 nums << val->Value();
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
468
112
def56932f938 - changed the PROPERTY macro to a simper version and brought some refactoring with it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 110
diff changeset
469 switch (op->ID())
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
470 {
108
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
471 case OPER_Addition: a = nums[0] + nums[1]; break;
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
472 case OPER_Subtraction: a = nums[0] - nums[1]; break;
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
473 case OPER_Multiplication: a = nums[0] * nums[1]; break;
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
474 case OPER_UnaryMinus: a = -nums[0]; break;
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
475 case OPER_NegateLogical: a = !nums[0]; break;
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
476 case OPER_LeftShift: a = nums[0] << nums[1]; break;
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
477 case OPER_RightShift: a = nums[0] >> nums[1]; break;
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
478 case OPER_CompareLesser: a = (nums[0] < nums[1]) ? 1 : 0; break;
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
479 case OPER_CompareGreater: a = (nums[0] > nums[1]) ? 1 : 0; break;
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
480 case OPER_CompareAtLeast: a = (nums[0] <= nums[1]) ? 1 : 0; break;
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
481 case OPER_CompareAtMost: a = (nums[0] >= nums[1]) ? 1 : 0; break;
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
482 case OPER_CompareEquals: a = (nums[0] == nums[1]) ? 1 : 0; break;
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
483 case OPER_CompareNotEquals: a = (nums[0] != nums[1]) ? 1 : 0; break;
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
484 case OPER_BitwiseAnd: a = nums[0] & nums[1]; break;
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
485 case OPER_BitwiseOr: a = nums[0] | nums[1]; break;
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
486 case OPER_BitwiseXOr: a = nums[0] ^ nums[1]; break;
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
487 case OPER_LogicalAnd: a = (nums[0] && nums[1]) ? 1 : 0; break;
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
488 case OPER_LogicalOr: a = (nums[0] || nums[1]) ? 1 : 0; break;
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
489 case OPER_Ternary: a = (nums[0] != 0) ? nums[1] : nums[2]; break;
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
490
108
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
491 case OPER_Division:
107
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
492 {
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
493 if (nums[1] == 0)
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
494 Error ("division by zero in constant expression");
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
495
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
496 a = nums[0] / nums[1];
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
497 break;
107
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
498 }
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
499
108
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
500 case OPER_Modulus:
107
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
501 {
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
502 if (nums[1] == 0)
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
503 Error ("modulus by zero in constant expression");
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
504
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
505 a = nums[0] % nums[1];
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
506 break;
107
55c2bcd8ed5c - implemented arrays, don't quite work 100% yet
Teemu Piippo <crimsondusk64@gmail.com>
parents: 106
diff changeset
507 }
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
508 }
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
509
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
510 newval->SetValue (a);
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
511 }
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
512
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
513 // The new value has been generated. We don't need the old stuff anymore.
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
514 for (ExpressionValue* val : values)
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
515 delete val;
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
516
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
517 delete op;
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
518 return newval;
93
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
519 }
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
520
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
521 // =============================================================================
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
522 //
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
523 ExpressionValue* Expression::Evaluate()
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
524 {
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
525 SymbolList::Iterator it;
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
526
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
527 while ((it = FindPrioritizedOperator()) != mSymbols.end())
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
528 {
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
529 int i = it - mSymbols.begin();
108
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
530 List<SymbolList::Iterator> OPER_erands;
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
531 ExpressionOperator* op = static_cast<ExpressionOperator*> (*it);
112
def56932f938 - changed the PROPERTY macro to a simper version and brought some refactoring with it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 110
diff changeset
532 const OperatorInfo* info = &gOperators[op->ID()];
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
533 int lower, upper; // Boundaries of area to replace
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
534
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
535 switch (info->numoperands)
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
536 {
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
537 case 1:
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
538 {
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
539 lower = i;
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
540 upper = i + 1;
108
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
541 OPER_erands << it + 1;
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
542 break;
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
543 }
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
544
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
545 case 2:
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
546 {
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
547 lower = i - 1;
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
548 upper = i + 1;
108
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
549 OPER_erands << it - 1
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
550 << it + 1;
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
551 break;
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
552 }
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
553
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
554 case 3:
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
555 {
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
556 lower = i - 1;
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
557 upper = i + 3;
108
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
558 OPER_erands << it - 1
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
559 << it + 1
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
560 << it + 3;
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
561 break;
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
562 }
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
563
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
564 default:
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
565 assert (false);
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
566 }
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
567
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
568 List<ExpressionValue*> values;
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
569
108
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
570 for (auto it : OPER_erands)
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
571 values << static_cast<ExpressionValue*> (*it);
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
572
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
573 // Note: @op and all of @values are invalid after this call.
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
574 ExpressionValue* newvalue = EvaluateOperator (op, values);
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
575
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
576 for (int i = upper; i >= lower; --i)
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
577 mSymbols.RemoveAt (i);
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
578
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
579 mSymbols.Insert (lower, newvalue);
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
580 }
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
581
112
def56932f938 - changed the PROPERTY macro to a simper version and brought some refactoring with it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 110
diff changeset
582 assert (mSymbols.Size() == 1 && mSymbols.First()->Type() == EXPRSYM_Value);
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
583 ExpressionValue* val = static_cast<ExpressionValue*> (mSymbols.First());
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
584 return val;
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
585 }
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
586
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
587 // =============================================================================
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
588 //
112
def56932f938 - changed the PROPERTY macro to a simper version and brought some refactoring with it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 110
diff changeset
589 ExpressionValue* Expression::Result()
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
590 {
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
591 return static_cast<ExpressionValue*> (mSymbols.First());
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
592 }
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
593
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
594 // =============================================================================
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
595 //
112
def56932f938 - changed the PROPERTY macro to a simper version and brought some refactoring with it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 110
diff changeset
596 String Expression::TokenString()
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
597 {
112
def56932f938 - changed the PROPERTY macro to a simper version and brought some refactoring with it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 110
diff changeset
598 return mLexer->Token()->text;
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
599 }
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
600
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
601 // =============================================================================
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
602 //
108
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
603 ExpressionOperator::ExpressionOperator (ExpressionOperatorType id) :
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
604 ExpressionSymbol (EXPRSYM_Operator),
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
605 mID (id) {}
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
606
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
607 // =============================================================================
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
608 //
108
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
609 ExpressionValue::ExpressionValue (DataType valuetype) :
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
610 ExpressionSymbol (EXPRSYM_Value),
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
611 mBuffer (null),
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
612 mValueType (valuetype) {}
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
613
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
614 // =============================================================================
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
615 //
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
616 ExpressionValue::~ExpressionValue()
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
617 {
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
618 delete mBuffer;
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
619 }
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
620
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
621 // =============================================================================
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
622 //
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
623 void ExpressionValue::ConvertToBuffer()
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
624 {
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
625 if (IsConstexpr() == false)
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
626 return;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
627
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
628 SetBuffer (new DataBuffer);
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
629
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
630 switch (mValueType)
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
631 {
108
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
632 case TYPE_Bool:
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
633 case TYPE_Int:
112
def56932f938 - changed the PROPERTY macro to a simper version and brought some refactoring with it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 110
diff changeset
634 Buffer()->WriteDWord (DH_PushNumber);
def56932f938 - changed the PROPERTY macro to a simper version and brought some refactoring with it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 110
diff changeset
635 Buffer()->WriteDWord (abs (mValue));
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
636
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
637 if (mValue < 0)
112
def56932f938 - changed the PROPERTY macro to a simper version and brought some refactoring with it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 110
diff changeset
638 Buffer()->WriteDWord (DH_UnaryMinus);
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
639 break;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
640
108
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
641 case TYPE_String:
112
def56932f938 - changed the PROPERTY macro to a simper version and brought some refactoring with it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 110
diff changeset
642 Buffer()->WriteDWord (DH_PushStringIndex);
def56932f938 - changed the PROPERTY macro to a simper version and brought some refactoring with it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 110
diff changeset
643 Buffer()->WriteDWord (mValue);
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
644 break;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
645
108
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
646 case TYPE_Void:
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
647 case TYPE_Unknown:
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
648 assert (false);
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
649 break;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
650 }
108
6409ece8297c - refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents: 107
diff changeset
651 }

mercurial