src/Expression.cc

Tue, 04 Feb 2014 02:28:33 +0200

author
Teemu Piippo <crimsondusk64@gmail.com>
date
Tue, 04 Feb 2014 02:28:33 +0200
changeset 92
3a00d396bce2
parent 91
427eb377d53e
child 93
11a24b697f43
permissions
-rw-r--r--

- now compiles again, further work on expressions (proper parsing + assignment operator handling (albeit unrelated) + operator adjusting)

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;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
9 int numoperands;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
10 int priority;
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 {
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
77 case ExpressionSymbol::eOperatorSymbol:
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
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 case ExpressionSymbol::eValueSymbol:
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
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
97 case ExpressionSymbol::eColonSymbol:
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
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
105 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
106
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 /*
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
108 Verify();
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 {
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
272 if ((*it)->GetType() != ExpressionSymbol::eOperatorSymbol)
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.
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
279 if (op->GetID() == opUnaryMinus && (*(it - 1))->GetType() == ExpressionSymbol::eValueSymbol)
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 //
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
290 ExpressionValue* Expression::Evaluate()
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
291 {
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
292
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
293 }
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
294
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
295 // =============================================================================
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
296 //
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
297 ExpressionValue* Expression::GetResult()
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
298 {
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
299 return mResult;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
300 }
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
301
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
302 // =============================================================================
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
303 //
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
304 String Expression::GetTokenString()
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
305 {
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
306 return mLexer->GetToken()->text;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
307 }
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
308
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
309 // =============================================================================
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
310 //
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
311 ExpressionOperator::ExpressionOperator (EOperator id) :
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
312 ExpressionSymbol (eOperatorSymbol),
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
313 mID (id) {}
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
314
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
315 // =============================================================================
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
316 //
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
317 ExpressionValue::ExpressionValue (EType valuetype) :
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
318 ExpressionSymbol (eValueSymbol),
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
319 mBuffer (null),
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
320 mValueType (valuetype) {}
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
321
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
322 // =============================================================================
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
323 //
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
324 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
325 {
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
326 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
327 }
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
328
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
329 // =============================================================================
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
330 //
91
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
331 void ExpressionValue::ConvertToBuffer()
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
332 {
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
333 if (IsConstexpr() == false)
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
334 return;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
335
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
336 SetBuffer (new DataBuffer);
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
337
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
338 switch (mValueType)
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
339 {
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
340 case EBoolType:
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
341 case EIntType:
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
342 GetBuffer()->WriteDWord (dhPushNumber);
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
343 GetBuffer()->WriteDWord (abs (mValue));
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
344
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
345 if (mValue < 0)
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
346 GetBuffer()->WriteDWord (dhUnaryMinus);
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
347 break;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
348
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
349 case EStringType:
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
350 GetBuffer()->WriteDWord (dhPushStringIndex);
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
351 GetBuffer()->WriteDWord (mValue);
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
352 break;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
353
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
354 case EVoidType:
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
355 case EUnknownType:
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
356 assert (false);
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
357 break;
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
358 }
427eb377d53e - committed work so far done on expressions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
359 }

mercurial