src/Expression.cc

Tue, 04 Feb 2014 03:16:14 +0200

author
Teemu Piippo <crimsondusk64@gmail.com>
date
Tue, 04 Feb 2014 03:16:14 +0200
changeset 93
11a24b697f43
parent 92
3a00d396bce2
child 94
8915ee6a277d
permissions
-rw-r--r--

- Expression verification done

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 // There isn't a dataheader for ternary operator. Instead, we use dhIfNotGoto
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
41 // to create an "if-block" inside an expression.
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
42 // Behold, big block of writing madness! :P
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
43 ByteMark* mark1 = retbuf->AddMark (""); // start of "else" case
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
44 ByteMark* mark2 = retbuf->AddMark (""); // end of expression
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
45 retbuf->WriteDWord (dhIfNotGoto); // if the first operand (condition)
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
46 retbuf->AddReference (mark1); // didn't eval true, jump into mark1
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
47 retbuf->MergeAndDestroy (rb); // otherwise, perform second operand (true case)
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
48 retbuf->WriteDWord (dhGoto); // afterwards, jump to the end, which is
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
49 retbuf->AddReference (mark2); // marked by mark2.
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
50 retbuf->AdjustMark (mark1); // move mark1 at the end of the true case
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
51 retbuf->MergeAndDestroy (tb); // perform third operand (false case)
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
52 retbuf->AdjustMark (mark2); // move the ending mark2 here
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
53 */
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
54
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
55 // =============================================================================
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
56 //
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
57 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
58 mParser (parser),
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
59 mLexer (lx),
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
60 mType (reqtype),
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
61 mResult (null)
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 ExpressionSymbol* sym;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
64
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
65 while ((sym = ParseSymbol()) != null)
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
66 mSymbols << sym;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
67
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
68 if (mSymbols.IsEmpty())
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
69 Error ("Expected expression");
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
70
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
71 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
72
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
73 for (ExpressionSymbol* sym : mSymbols)
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
74 {
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
75 switch (sym->GetType())
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
76 {
93
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
77 case 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
78 {
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
79 Print ("\t- Operator: %1\n", static_cast<ExpressionOperator*> (sym)->GetID());
3a00d396bce2 - now compiles again, further work on expressions (proper parsing + assignment operator handling (albeit unrelated) + operator adjusting)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 91
diff changeset
80 break;
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
81 }
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
82
93
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
83 case 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
84 {
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
85 ExpressionValue* val = static_cast<ExpressionValue*> (sym);
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
86
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
87 if (val->IsConstexpr())
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
88 Print ("\t- Constant expression value: %1\n", val->GetValue());
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 else
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 {
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 Print ("\t- Databuffer value:\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
92 val->GetBuffer()->Dump();
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
93 }
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
94 break;
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
95 }
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
96
93
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
97 case eColonSymbol:
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
98 {
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
99 Print ("\t- Colon");
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
100 break;
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 }
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
102 }
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
103 }
3a00d396bce2 - now compiles again, further work on expressions (proper parsing + assignment operator handling (albeit unrelated) + operator adjusting)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 91
diff changeset
104
93
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
105 Verify();
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
106 exit (0);
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
107
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
108 /*
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
109 mResult = Evaluate();
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
110 */
91
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 // =============================================================================
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
114 //
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
115 Expression::~Expression()
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
116 {
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
117 for (ExpressionSymbol* sym : mSymbols)
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
118 delete sym;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
119
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
120 delete mResult;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
121 }
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 // =============================================================================
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
124 //
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
125 // 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
126 // from the lexer.
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 ExpressionSymbol* Expression::ParseSymbol()
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
129 {
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
130 int pos = mLexer->GetPosition();
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
131 ExpressionValue* op = null;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
132 enum ELocalException { failed };
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
133
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
134 try
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 ScriptVariable* globalvar;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
137 mLexer->MustGetNext();
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
138
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
139 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
140
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
141 if (mLexer->GetTokenType() == tkColon)
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
142 return new ExpressionColon;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
143
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
144 // 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
145 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
146 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
147 return new ExpressionOperator ((EOperator) (&op - &gOperators[0]));
91
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 // Check sub-expression
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
150 if (mLexer->GetTokenType() == tkParenStart)
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 Expression expr (mParser, mLexer, mType);
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
153 mLexer->MustGetNext (tkParenEnd);
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
154 return expr.GetResult();
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
155 }
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
156
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 op = new ExpressionValue (mType);
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
158
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
159 // Check function
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
160 if (CommandInfo* comm = FindCommandByName (GetTokenString()))
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 if (mType != EUnknownType && comm->returnvalue != mType)
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
163 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
164
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
165 op->SetBuffer (mParser->ParseCommand (comm));
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
166 return op;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
167 }
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
168
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
169 // Check constant
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
170 if (ConstantInfo* constant = mParser->FindConstant (GetTokenString()))
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
171 {
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
172 if (mType != constant->type)
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
173 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
174 constant->name, GetTypeName (constant->type),
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
175 GetTypeName (mType));
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
176
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
177 switch (constant->type)
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 EBoolType:
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
180 case EIntType:
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
181 op->SetValue (constant->val.ToLong());
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
182 break;
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 case EStringType:
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
185 op->SetValue (GetStringTableIndex (constant->val));
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
186 break;
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 case EVoidType:
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
189 case EUnknownType:
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
190 break;
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
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
193 return op;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
194 }
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
195
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
196 // Check global variable
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
197 if ((globalvar = FindGlobalVariable (GetTokenString())))
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 DataBuffer* buf = new DataBuffer (8);
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
200 buf->WriteDWord (dhPushGlobalVar);
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
201 buf->WriteDWord (globalvar->index);
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
202 op->SetBuffer (buf);
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
203 return op;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
204 }
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
205
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
206 EToken tt;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
207
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
208 // Check for literal
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
209 switch (mType)
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
210 {
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
211 case EVoidType:
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
212 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
213 {
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
214 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
215 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
216 }
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
217
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
218 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
219 {
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
220 if ((tt = mLexer->GetTokenType()) == tkTrue || tt == tkFalse)
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
221 {
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
222 op->SetValue (tt == tkTrue ? 1 : 0);
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
223 return op;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
224 }
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
225 }
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
226 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
227 {
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 if (mLexer->GetTokenType() != tkNumber)
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
229 throw failed;
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 op->SetValue (GetTokenString().ToLong());
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
232 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
233 }
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
234
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
235 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
236 {
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
237 if (mLexer->GetTokenType() != tkString)
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
238 throw failed;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
239
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
240 op->SetValue (GetStringTableIndex (GetTokenString()));
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
241 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
242 }
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
243 }
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
244
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
245 assert (false);
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
246 throw failed;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
247 }
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
248 catch (ELocalException&)
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
249 {
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
250 // 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
251 mLexer->SetPosition (pos);
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
252 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
253 return null;
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
254 }
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
255
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
256 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
257 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
258 }
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
259
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
260 // =============================================================================
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
261 //
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
262 // 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
263 // 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
264 // 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
265 // 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
266 // 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
267 //
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
268 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
269 {
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
270 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
271 {
93
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
272 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
273 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
274
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
275 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
276
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
277 // 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
278 // unary; replace with binary minus.
93
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
279 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
280 {
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
281 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
282 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
283 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
284 }
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
285 }
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
286 }
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
287
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
288 // =============================================================================
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
289 //
93
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
290 // Verifies a single value. Helper function for Expression::Verify.
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
291 //
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
292 void Expression::TryVerifyValue (bool* verified, SymbolList::Iterator it)
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
293 {
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
294 int i = it - mSymbols.begin();
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
295
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
296 // Ensure it's an actual value
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
297 if ((*it)->GetType() != eValueSymbol)
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
298 Error ("malformed expression (symbol #%1 is not a value)", i);
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
299
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
300 verified[i] = true;
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
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
303 // =============================================================================
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
304 //
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
305 // 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
306 // error if this is not the case.
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 void Expression::Verify()
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
309 {
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
310 if (mSymbols.Size() == 1)
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
311 {
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
312 if (mSymbols[0]->GetType() != eValueSymbol)
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
313 Error ("bad expression");
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
314
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
315 Print ("Expression speedy-verified (1 expr symbol)");
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
316 return;
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
317 }
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
318
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
319 bool* verified = new bool[mSymbols.Size()];
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
320 memset (verified, 0, mSymbols.Size() * sizeof (decltype (*verified)));
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
321 const auto last = mSymbols.end() - 1;
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
322 const auto first = mSymbols.begin();
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
323
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
324 for (auto it = mSymbols.begin(); it != mSymbols.end(); ++it)
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
325 {
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
326 int i = (it - first);
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 if ((*it)->GetType() != eOperatorSymbol)
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
329 continue;
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
330
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
331 ExpressionOperator* op = static_cast<ExpressionOperator*> (*it);
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
332 int numoperands = gOperators[op->GetID()].numoperands;
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
333
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
334 switch (numoperands)
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
335 {
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
336 case 1:
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
337 {
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
338 // Ensure that:
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
339 // - unary operator is not the last symbol
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
340 // - unary operator is succeeded by a value symbol
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
341 // - neither symbol overlaps with something already verified
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
342 TryVerifyValue (verified, it + 1);
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
343
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
344 if (it == last || verified[i] == true)
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
345 Error ("malformed expression");
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
346
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
347 verified[i] = true;
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
348 break;
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
349 }
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 case 2:
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
352 {
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
353 // Ensure that:
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
354 // - binary operator is not the first or last symbol
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
355 // - is preceded and succeeded by values
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
356 // - none of the three tokens are already verified
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
357 //
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
358 // Basically similar logic as above.
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
359 if (it == first || it == last || verified[i] == true)
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
360 Error ("malformed expression");
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 TryVerifyValue (verified, it + 1);
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
363 TryVerifyValue (verified, it - 1);
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
364 verified[i] = true;
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
365 break;
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
366 }
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
367
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
368 case 3:
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
369 {
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
370 // Ternary operator case. This goes a bit nuts.
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
371 // This time we have the following:
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
372 //
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
373 // (VALUE) ? (VALUE) : (VALUE)
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
374 // ^
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
375 // --------/ we are here
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
376 //
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
377 // Check that the:
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
378 // - questionmark operator is not misplaced (first or last)
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
379 // - the value behind the operator (-1) is valid
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
380 // - the value after the operator (+1) is valid
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
381 // - the value after the colon (+3) is valid
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
382 // - none of the five tokens are verified
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
383 //
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
384 TryVerifyValue (verified, it - 1);
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
385 TryVerifyValue (verified, it + 1);
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
386 TryVerifyValue (verified, it + 3);
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
387
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
388 if (it == first ||
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
389 it >= mSymbols.end() - 3 ||
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
390 verified[i] == true ||
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
391 verified[i + 2] == true ||
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
392 (*(it + 2))->GetType() != eColonSymbol)
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
393 {
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
394 Error ("malformed expression");
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
395 }
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
396
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
397 verified[i] = true;
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
398 verified[i + 2] = true;
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
399 break;
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
400 }
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
401
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
402 default:
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
403 Error ("WTF operator with %1 operands", numoperands);
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
404 }
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
405 }
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
406
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
407 for (int i = 0; i < mSymbols.Size(); ++i)
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
408 if (verified[i] == false)
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
409 Error ("malformed expression: expr symbol #%1 is was left unverified", i);
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
410
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
411 Print ("Expression verified.\n");
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
412 }
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
413
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
414 // =============================================================================
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
415 //
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
416 ExpressionValue* Expression::Evaluate()
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
417 {
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
418
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
419 }
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
420
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
421 // =============================================================================
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
422 //
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
423 ExpressionValue* Expression::GetResult()
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
424 {
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
425 return mResult;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
426 }
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
427
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
428 // =============================================================================
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
429 //
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
430 String Expression::GetTokenString()
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
431 {
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
432 return mLexer->GetToken()->text;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
433 }
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
434
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
435 // =============================================================================
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
436 //
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
437 ExpressionOperator::ExpressionOperator (EOperator id) :
93
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
438 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
439 mID (id) {}
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
440
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
441 // =============================================================================
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
442 //
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
443 ExpressionValue::ExpressionValue (EType valuetype) :
93
11a24b697f43 - Expression verification done
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
444 ExpressionSymbol (Expression::eValueSymbol),
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
445 mBuffer (null),
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
446 mValueType (valuetype) {}
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
447
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
448 // =============================================================================
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
449 //
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
450 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
451 {
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
452 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
453 }
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
454
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
455 // =============================================================================
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
456 //
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
457 void ExpressionValue::ConvertToBuffer()
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
458 {
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
459 if (IsConstexpr() == false)
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
460 return;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
461
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
462 SetBuffer (new DataBuffer);
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
463
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
464 switch (mValueType)
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
465 {
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
466 case EBoolType:
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
467 case EIntType:
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
468 GetBuffer()->WriteDWord (dhPushNumber);
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
469 GetBuffer()->WriteDWord (abs (mValue));
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
470
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
471 if (mValue < 0)
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
472 GetBuffer()->WriteDWord (dhUnaryMinus);
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
473 break;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
474
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
475 case EStringType:
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
476 GetBuffer()->WriteDWord (dhPushStringIndex);
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
477 GetBuffer()->WriteDWord (mValue);
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
478 break;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
479
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
480 case EVoidType:
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
481 case EUnknownType:
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
482 assert (false);
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
483 break;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
484 }
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
485 }

mercurial