src/Expression.cc

Tue, 04 Feb 2014 13:38:22 +0200

author
Teemu Piippo <crimsondusk64@gmail.com>
date
Tue, 04 Feb 2014 13:38:22 +0200
changeset 95
4db95b92c29a
parent 94
8915ee6a277d
child 96
3384d7aa036a
permissions
-rw-r--r--

- fixed verification with unary operators

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 #include "Variables.h"
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
5
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
6 struct OperatorInfo
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
7 {
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
8 EToken token;
93
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
9 int priority;
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
10 int numoperands;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
11 EDataHeader header;
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
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
14 static const OperatorInfo gOperators[] =
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
15 {
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
16 { tkExclamationMark, 0, 1, dhNegateLogical, },
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
17 { tkMinus, 0, 1, dhUnaryMinus, },
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
18 { tkMultiply, 10, 2, dhMultiply, },
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
19 { tkDivide, 10, 2, dhDivide, },
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
20 { tkModulus, 10, 2, dhModulus, },
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
21 { tkPlus, 20, 2, dhAdd, },
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
22 { tkMinus, 20, 2, dhSubtract, },
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
23 { tkLeftShift, 30, 2, dhLeftShift, },
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
24 { tkRightShift, 30, 2, dhRightShift, },
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
25 { tkLesser, 40, 2, dhLessThan, },
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
26 { tkGreater, 40, 2, dhGreaterThan, },
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
27 { tkAtLeast, 40, 2, dhAtLeast, },
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
28 { tkAtMost, 40, 2, dhAtMost, },
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
29 { tkEquals, 50, 2, dhEquals },
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
30 { tkNotEquals, 50, 2, dhNotEquals },
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
31 { tkAmperstand, 60, 2, dhAndBitwise },
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
32 { tkCaret, 70, 2, dhEorBitwise },
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
33 { tkBar, 80, 2, dhOrBitwise },
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
34 { tkDoubleAmperstand, 90, 2, dhAndLogical },
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
35 { tkDoubleBar, 100, 2, dhOrLogical },
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
36 { tkQuestionMark, 110, 3, (EDataHeader) 0 },
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 // =============================================================================
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
40 //
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
41 Expression::Expression (BotscriptParser* parser, Lexer* lx, EType reqtype) :
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
42 mParser (parser),
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
43 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
44 mType (reqtype)
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
45 {
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
46 ExpressionSymbol* sym;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
47
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
48 while ((sym = ParseSymbol()) != null)
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
49 mSymbols << sym;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
50
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
51 if (mSymbols.IsEmpty())
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
52 Error ("Expected expression");
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
53
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
54 AdjustOperators();
93
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
55 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
56 Evaluate();
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
57 }
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
58
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 Expression::~Expression()
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 for (ExpressionSymbol* sym : mSymbols)
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
64 delete sym;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
65 }
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
66
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 // Try to parse an expression symbol (i.e. an operator or operand or a colon)
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
70 // from the lexer.
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
71 //
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
72 ExpressionSymbol* Expression::ParseSymbol()
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 int pos = mLexer->GetPosition();
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
75 ExpressionValue* op = null;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
76 enum ELocalException { failed };
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
77
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
78 try
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
79 {
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
80 ScriptVariable* globalvar;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
81 mLexer->MustGetNext();
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
82
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
83 Print ("Token type: %1\n", mLexer->DescribeTokenType (mLexer->GetTokenType()));
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
84
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
85 if (mLexer->GetTokenType() == tkColon)
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
86 return new ExpressionColon;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
87
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
88 // Check for 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
89 for (const OperatorInfo& op : gOperators)
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
90 if (mLexer->GetTokenType() == op.token)
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
91 return new ExpressionOperator ((EOperator) (&op - &gOperators[0]));
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
92
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
93 // Check sub-expression
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
94 if (mLexer->GetTokenType() == tkParenStart)
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
95 {
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
96 Expression expr (mParser, mLexer, mType);
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
97 mLexer->MustGetNext (tkParenEnd);
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
98 return expr.GetResult()->Clone();
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
99 }
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
100
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
101 op = new ExpressionValue (mType);
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
102
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
103 // Check function
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
104 if (CommandInfo* comm = FindCommandByName (GetTokenString()))
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
105 {
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
106 if (mType != EUnknownType && comm->returnvalue != mType)
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
107 Error ("%1 returns an incompatible data type", comm->name);
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
108
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
109 op->SetBuffer (mParser->ParseCommand (comm));
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
110 return op;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
111 }
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
112
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
113 // Check constant
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
114 if (ConstantInfo* constant = mParser->FindConstant (GetTokenString()))
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
115 {
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
116 if (mType != constant->type)
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
117 Error ("constant `%1` is %2, expression requires %3\n",
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
118 constant->name, GetTypeName (constant->type),
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
119 GetTypeName (mType));
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
120
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
121 switch (constant->type)
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
122 {
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
123 case EBoolType:
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
124 case EIntType:
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
125 op->SetValue (constant->val.ToLong());
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
126 break;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
127
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
128 case EStringType:
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
129 op->SetValue (GetStringTableIndex (constant->val));
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
130 break;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
131
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
132 case EVoidType:
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
133 case EUnknownType:
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
134 break;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
135 }
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
136
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
137 return op;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
138 }
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
139
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
140 // Check global variable
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
141 if ((globalvar = FindGlobalVariable (GetTokenString())))
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
142 {
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
143 DataBuffer* buf = new DataBuffer (8);
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
144 buf->WriteDWord (dhPushGlobalVar);
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
145 buf->WriteDWord (globalvar->index);
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
146 op->SetBuffer (buf);
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
147 return op;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
148 }
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
149
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
150 EToken tt;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
151
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
152 // Check for literal
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
153 switch (mType)
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
154 {
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
155 case EVoidType:
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
156 case EUnknownType:
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
157 {
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
158 Error ("unknown identifier `%1` (expected keyword, function or variable)", GetTokenString());
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
159 break;
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
160 }
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
161
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
162 case EBoolType:
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
163 {
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
164 if ((tt = mLexer->GetTokenType()) == tkTrue || tt == tkFalse)
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
165 {
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
166 op->SetValue (tt == tkTrue ? 1 : 0);
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
167 return op;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
168 }
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
169 }
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
170 case EIntType:
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
171 {
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
172 if (mLexer->GetTokenType() != tkNumber)
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
173 throw failed;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
174
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
175 op->SetValue (GetTokenString().ToLong());
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 }
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
178
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
179 case EStringType:
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
180 {
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
181 if (mLexer->GetTokenType() != tkString)
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
182 throw failed;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
183
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
184 op->SetValue (GetStringTableIndex (GetTokenString()));
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 assert (false);
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
190 throw failed;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
191 }
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
192 catch (ELocalException&)
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
193 {
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
194 // We use a local enum here since catch(...) would catch Error() calls.
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
195 mLexer->SetPosition (pos);
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
196 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
197 return null;
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
198 }
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
199
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
200 assert (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
201 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
202 }
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 // =============================================================================
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 // The symbol parsing process only does token-based checking for operators. Thus
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 // ALL minus operators are actually unary minuses simply because both have
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
208 // tkMinus as their token and the unary minus is prior to the binary minus in
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 // the operator table. Now that we have all symbols present, we can correct
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 // 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
211 //
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 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
213 {
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 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
215 {
93
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
216 if ((*it)->GetType() != eOperatorSymbol)
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 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
218
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
219 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
220
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
221 // 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
222 // unary; replace with binary minus.
93
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
223 if (op->GetID() == opUnaryMinus && (*(it - 1))->GetType() == eValueSymbol)
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
224 {
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
225 Print ("Changing symbol operator #%1 from %2 to %3\n",
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
226 it - mSymbols.begin(), op->GetID(), opSubtraction);
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
227 op->SetID (opSubtraction);
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
228 }
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
229 }
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
230 }
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
231
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
232 // =============================================================================
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
233 //
93
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
234 // Verifies a single value. Helper function for Expression::Verify.
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 void Expression::TryVerifyValue (bool* verified, SymbolList::Iterator it)
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
237 {
95
4db95b92c29a - fixed verification with unary operators
Teemu Piippo <crimsondusk64@gmail.com>
parents: 94
diff changeset
238 // If it's an unary operator we skip to its value. The actual operator will
4db95b92c29a - fixed verification with unary operators
Teemu Piippo <crimsondusk64@gmail.com>
parents: 94
diff changeset
239 // be verified separately.
4db95b92c29a - fixed verification with unary operators
Teemu Piippo <crimsondusk64@gmail.com>
parents: 94
diff changeset
240 if ((*it)->GetType() == eOperatorSymbol &&
4db95b92c29a - fixed verification with unary operators
Teemu Piippo <crimsondusk64@gmail.com>
parents: 94
diff changeset
241 gOperators[static_cast<ExpressionOperator*> (*it)->GetID()].numoperands == 1)
4db95b92c29a - fixed verification with unary operators
Teemu Piippo <crimsondusk64@gmail.com>
parents: 94
diff changeset
242 {
4db95b92c29a - fixed verification with unary operators
Teemu Piippo <crimsondusk64@gmail.com>
parents: 94
diff changeset
243 ++it;
4db95b92c29a - fixed verification with unary operators
Teemu Piippo <crimsondusk64@gmail.com>
parents: 94
diff changeset
244 }
4db95b92c29a - fixed verification with unary operators
Teemu Piippo <crimsondusk64@gmail.com>
parents: 94
diff changeset
245
93
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
246 int i = it - mSymbols.begin();
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 // Ensure it's an actual value
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
249 if ((*it)->GetType() != eValueSymbol)
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
250 Error ("malformed expression (symbol #%1 is not a value)", i);
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
251
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
252 verified[i] = true;
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
253 }
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 // =============================================================================
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 // 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
258 // error if this is not the case.
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
259 //
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
260 void Expression::Verify()
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
261 {
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
262 if (mSymbols.Size() == 1)
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
263 {
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
264 if (mSymbols[0]->GetType() != eValueSymbol)
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
265 Error ("bad expression");
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
266
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
267 Print ("Expression speedy-verified (1 expr symbol)\n");
93
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
268 return;
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
269 }
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
270
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
271 if (mType == EStringType)
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
272 Error ("Cannot perform operations on strings");
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
273
93
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
274 bool* verified = new bool[mSymbols.Size()];
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
275 memset (verified, 0, mSymbols.Size() * sizeof (decltype (*verified)));
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
276 const auto last = mSymbols.end() - 1;
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
277 const auto first = mSymbols.begin();
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
278
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
279 for (auto it = mSymbols.begin(); it != mSymbols.end(); ++it)
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
280 {
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
281 int i = (it - first);
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
282
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
283 if ((*it)->GetType() != eOperatorSymbol)
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
284 continue;
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 ExpressionOperator* op = static_cast<ExpressionOperator*> (*it);
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
287 int numoperands = gOperators[op->GetID()].numoperands;
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 switch (numoperands)
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
290 {
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
291 case 1:
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 // Ensure that:
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
294 // - unary operator is not the last symbol
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
295 // - unary operator is succeeded by a value symbol
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
296 // - neither symbol overlaps with something already verified
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
297 TryVerifyValue (verified, it + 1);
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
298
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
299 if (it == last || verified[i] == true)
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
300 Error ("malformed expression");
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
301
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
302 verified[i] = true;
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
303 break;
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
304 }
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
305
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
306 case 2:
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
307 {
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
308 // Ensure that:
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
309 // - binary operator is not the first or last symbol
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
310 // - is preceded and succeeded by values
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
311 // - none of the three tokens are already verified
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
312 //
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
313 // Basically similar logic as above.
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
314 if (it == first || it == last || verified[i] == true)
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
315 Error ("malformed expression");
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 TryVerifyValue (verified, it + 1);
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
318 TryVerifyValue (verified, it - 1);
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
319 verified[i] = true;
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
320 break;
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
321 }
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
322
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
323 case 3:
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
324 {
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
325 // Ternary operator case. This goes a bit nuts.
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
326 // This time we have the following:
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
327 //
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
328 // (VALUE) ? (VALUE) : (VALUE)
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 // --------/ we are here
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
331 //
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
332 // Check that the:
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
333 // - questionmark operator is not misplaced (first or last)
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
334 // - the value behind the operator (-1) is valid
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
335 // - the value after the operator (+1) is valid
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
336 // - the value after the colon (+3) is valid
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
337 // - none of the five tokens are verified
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 TryVerifyValue (verified, it - 1);
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
340 TryVerifyValue (verified, it + 1);
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
341 TryVerifyValue (verified, it + 3);
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 if (it == first ||
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
344 it >= mSymbols.end() - 3 ||
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
345 verified[i] == true ||
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
346 verified[i + 2] == true ||
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
347 (*(it + 2))->GetType() != eColonSymbol)
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 Error ("malformed expression");
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
350 }
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
351
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
352 verified[i] = true;
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
353 verified[i + 2] = true;
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
354 break;
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
355 }
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
356
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
357 default:
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
358 Error ("WTF operator with %1 operands", numoperands);
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
359 }
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
360 }
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
361
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
362 for (int i = 0; i < mSymbols.Size(); ++i)
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
363 if (verified[i] == false)
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
364 Error ("malformed expression: expr symbol #%1 is was left unverified", i);
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
365
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
366 Print ("Expression verified.\n");
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
367 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
368 }
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
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 // =============================================================================
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
372 //
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 // Which operator to evaluate?
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 //
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 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
376 {
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 SymbolList::Iterator best = 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
378 int bestpriority = INT_MAX;
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 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
381 {
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 if ((*it)->GetType() != eOperatorSymbol)
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 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
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 ExpressionOperator* op = static_cast<ExpressionOperator*> (*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
386 const OperatorInfo* info = &gOperators[op->GetID()];
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 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
389 {
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 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
391 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
392 }
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
393 }
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 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
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
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 //
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 // Process the given operator and values into a new value.
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 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
403 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
404 {
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 const OperatorInfo* info = &gOperators[op->GetID()];
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 bool isconstexpr = true;
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
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 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
409 {
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 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
411 {
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
412 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
413 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
414 }
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
415 }
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
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 // 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
418 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
419 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
420 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
421
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 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
423
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
424 if (isconstexpr == false)
95
4db95b92c29a - fixed verification with unary operators
Teemu Piippo <crimsondusk64@gmail.com>
parents: 94
diff changeset
425 {
4db95b92c29a - fixed verification with unary operators
Teemu Piippo <crimsondusk64@gmail.com>
parents: 94
diff changeset
426 // 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
427 // 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
428 // 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
429 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
430
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
431 if (op->GetID() == opTernary)
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 {
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
433 // There isn't a dataheader for ternary operator. Instead, we use dhIfNotGoto
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
434 // 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
435 // 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
436 //
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
437 DataBuffer* buf = newval->GetBuffer();
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 DataBuffer* b0 = values[0]->GetBuffer();
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
439 DataBuffer* b1 = values[1]->GetBuffer();
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
440 DataBuffer* b2 = values[2]->GetBuffer();
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
441 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
442 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
443 buf->MergeAndDestroy (b0);
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 buf->WriteDWord (dhIfNotGoto); // if the first operand (condition)
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
445 buf->AddReference (mark1); // didn't eval true, jump into mark1
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 buf->MergeAndDestroy (b1); // otherwise, perform second operand (true 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
447 buf->WriteDWord (dhGoto); // afterwards, jump to the end, which is
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 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
449 buf->AdjustMark (mark1); // move mark1 at the end of the true 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
450 buf->MergeAndDestroy (b2); // perform third operand (false 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
451 buf->AdjustMark (mark2); // move the ending mark2 here
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 }
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 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
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 // Generic case: write all arguments and apply the operator's
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
456 // 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
457 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
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 newval->GetBuffer()->MergeAndDestroy (val->GetBuffer());
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 // 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
462 // 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
463 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
464 }
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 newval->GetBuffer()->WriteDWord (info->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
467 }
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 }
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
469 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
470 {
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
471 // 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
472 // 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
473 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
474 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
475
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
476 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
477 nums << val->GetValue();
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
478
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
479 switch (op->GetID())
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
480 {
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
481 case opAddition: a = nums[0] + nums[1]; 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
482 case opSubtraction: a = nums[0] - nums[1]; 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
483 case opMultiplication: a = nums[0] * nums[1]; 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
484 case opUnaryMinus: a = -nums[0]; 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
485 case opNegateLogical: a = !nums[0]; 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
486 case opLeftShift: a = nums[0] << nums[1]; 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
487 case opRightShift: a = nums[0] >> nums[1]; 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
488 case opCompareLesser: a = (nums[0] < nums[1]) ? 1 : 0; 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
489 case opCompareGreater: a = (nums[0] > nums[1]) ? 1 : 0; 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
490 case opCompareAtLeast: a = (nums[0] <= nums[1]) ? 1 : 0; 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
491 case opCompareAtMost: a = (nums[0] >= nums[1]) ? 1 : 0; 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
492 case opCompareEquals: a = (nums[0] == nums[1]) ? 1 : 0; 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
493 case opCompareNotEquals: a = (nums[0] != nums[1]) ? 1 : 0; 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
494 case opBitwiseAnd: a = nums[0] & nums[1]; 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
495 case opBitwiseOr: a = nums[0] | nums[1]; 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
496 case opBitwiseXOr: a = nums[0] ^ nums[1]; 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
497 case opLogicalAnd: a = (nums[0] && nums[1]) ? 1 : 0; 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
498 case opLogicalOr: a = (nums[0] || nums[1]) ? 1 : 0; 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
499 case opTernary: a = (nums[0] != 0) ? nums[1] : nums[2]; 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
500
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
501 case opDivision:
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 ("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
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;
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
507
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 case opModulus:
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 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
510 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
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 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
513 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
514 }
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
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 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
517 }
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
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
519 // 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
520 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
521 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
522
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
523 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
524 return newval;
93
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
525 }
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
526
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
527 // =============================================================================
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
528 //
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
529 ExpressionValue* Expression::Evaluate()
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
530 {
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 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
532
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 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
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 int i = it - mSymbols.begin();
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 List<SymbolList::Iterator> operands;
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 ExpressionOperator* op = static_cast<ExpressionOperator*> (*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
538 const OperatorInfo* info = &gOperators[op->GetID()];
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 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
540
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
541 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
542 {
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 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
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 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
546 upper = 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
547 operands << 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
548 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
549 }
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
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 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
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 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
554 upper = 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
555 operands << 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
556 << 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
557 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
558 }
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
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 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
561 {
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 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
563 upper = i + 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
564 operands << 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
565 << 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
566 << 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
567 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
568 }
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
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
570 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
571 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
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
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 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
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 (auto it : operands)
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 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
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 // 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
580 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
581
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
582 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
583 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
584
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
585 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
586 }
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
587
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
588 assert (mSymbols.Size() == 1 && mSymbols.First()->GetType() == eValueSymbol);
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
589 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
590 return val;
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
591 }
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 ExpressionValue* Expression::GetResult()
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
596 {
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
597 return static_cast<ExpressionValue*> (mSymbols.First());
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
598 }
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 String Expression::GetTokenString()
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
603 {
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
604 return mLexer->GetToken()->text;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
605 }
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 //
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
609 ExpressionOperator::ExpressionOperator (EOperator id) :
93
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
610 ExpressionSymbol (Expression::eOperatorSymbol),
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
611 mID (id) {}
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
612
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 //
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
615 ExpressionValue::ExpressionValue (EType valuetype) :
93
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
616 ExpressionSymbol (Expression::eValueSymbol),
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
617 mBuffer (null),
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
618 mValueType (valuetype) {}
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
619
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
620 // =============================================================================
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
621 //
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
622 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
623 {
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
624 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
625 }
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
626
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
627 // =============================================================================
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
628 //
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
629 void ExpressionValue::ConvertToBuffer()
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
630 {
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
631 if (IsConstexpr() == false)
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
632 return;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
633
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
634 SetBuffer (new DataBuffer);
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
635
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
636 switch (mValueType)
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
637 {
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
638 case EBoolType:
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
639 case EIntType:
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
640 GetBuffer()->WriteDWord (dhPushNumber);
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
641 GetBuffer()->WriteDWord (abs (mValue));
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
642
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
643 if (mValue < 0)
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
644 GetBuffer()->WriteDWord (dhUnaryMinus);
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
645 break;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
646
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
647 case EStringType:
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
648 GetBuffer()->WriteDWord (dhPushStringIndex);
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
649 GetBuffer()->WriteDWord (mValue);
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
650 break;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
651
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
652 case EVoidType:
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
653 case EUnknownType:
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
654 assert (false);
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
655 break;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
656 }
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
657 }

mercurial