Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ Parse()

ExpressionNode System.Data.ExpressionParser.Parse ( )
inlinepackage

Definition at line 109 of file ExpressionParser.cs.

110 {
111 _expression = null;
112 StartScan();
113 int num = 0;
114 while (_token != Tokens.EOS)
115 {
116 while (true)
117 {
118 Scan();
119 switch (_token)
120 {
121 case Tokens.EOS:
122 break;
123 case Tokens.Name:
124 case Tokens.Numeric:
125 case Tokens.Decimal:
126 case Tokens.Float:
127 case Tokens.StringConst:
128 case Tokens.Date:
129 case Tokens.Parent:
130 {
131 ExpressionNode node = null;
132 string text = null;
133 if (_prevOperand != 0)
134 {
135 throw ExprException.MissingOperator(new string(_text, _start, _pos - _start));
136 }
137 if (_topOperator > 0)
138 {
139 OperatorInfo operatorInfo = _ops[_topOperator - 1];
140 if (operatorInfo._type == Nodes.Binop && operatorInfo._op == 5 && _token != Tokens.Parent)
141 {
142 throw ExprException.InWithoutParentheses();
143 }
144 }
145 _prevOperand = 1;
146 switch (_token)
147 {
148 case Tokens.Parent:
149 {
150 string relationName;
151 try
152 {
153 Scan();
154 if (_token == Tokens.LeftParen)
155 {
156 ScanToken(Tokens.Name);
157 relationName = NameNode.ParseName(_text, _start, _pos);
158 ScanToken(Tokens.RightParen);
159 ScanToken(Tokens.Dot);
160 }
161 else
162 {
163 relationName = null;
164 CheckToken(Tokens.Dot);
165 }
166 }
167 catch (Exception e) when (ADP.IsCatchableExceptionType(e))
168 {
169 throw ExprException.LookupArgument();
170 }
171 ScanToken(Tokens.Name);
172 string columnName = NameNode.ParseName(_text, _start, _pos);
173 OperatorInfo operatorInfo = _ops[_topOperator - 1];
174 node = new LookupNode(_table, columnName, relationName);
175 break;
176 }
177 case Tokens.Name:
178 {
179 OperatorInfo operatorInfo = _ops[_topOperator - 1];
180 node = new NameNode(_table, _text, _start, _pos);
181 break;
182 }
183 case Tokens.Numeric:
184 text = new string(_text, _start, _pos - _start);
185 node = new ConstNode(_table, ValueType.Numeric, text);
186 break;
187 case Tokens.Decimal:
188 text = new string(_text, _start, _pos - _start);
189 node = new ConstNode(_table, ValueType.Decimal, text);
190 break;
191 case Tokens.Float:
192 text = new string(_text, _start, _pos - _start);
193 node = new ConstNode(_table, ValueType.Float, text);
194 break;
195 case Tokens.StringConst:
196 text = new string(_text, _start + 1, _pos - _start - 2);
197 node = new ConstNode(_table, ValueType.Str, text);
198 break;
199 case Tokens.Date:
200 text = new string(_text, _start + 1, _pos - _start - 2);
201 node = new ConstNode(_table, ValueType.Date, text);
202 break;
203 }
204 NodePush(node);
205 continue;
206 }
207 case Tokens.LeftParen:
208 {
209 num++;
210 ExpressionNode node;
211 if (_prevOperand == 0)
212 {
213 OperatorInfo operatorInfo = _ops[_topOperator - 1];
214 if (operatorInfo._type == Nodes.Binop && operatorInfo._op == 5)
215 {
216 node = new FunctionNode(_table, "In");
217 NodePush(node);
218 _ops[_topOperator++] = new OperatorInfo(Nodes.Call, 0, 2);
219 }
220 else
221 {
222 _ops[_topOperator++] = new OperatorInfo(Nodes.Paren, 0, 2);
223 }
224 continue;
225 }
226 BuildExpression(22);
227 _prevOperand = 0;
228 ExpressionNode expressionNode2 = NodePeek();
229 if (expressionNode2 == null || expressionNode2.GetType() != typeof(NameNode))
230 {
231 throw ExprException.SyntaxError();
232 }
233 NameNode nameNode2 = (NameNode)NodePop();
234 node = new FunctionNode(_table, nameNode2._name);
235 Aggregate aggregate = (Aggregate)((FunctionNode)node).Aggregate;
236 if (aggregate != Aggregate.None)
237 {
238 node = ParseAggregateArgument((FunctionId)aggregate);
239 NodePush(node);
240 _prevOperand = 2;
241 }
242 else
243 {
244 NodePush(node);
245 _ops[_topOperator++] = new OperatorInfo(Nodes.Call, 0, 2);
246 }
247 continue;
248 }
249 case Tokens.RightParen:
250 {
251 if (_prevOperand != 0)
252 {
254 }
255 if (_topOperator <= 1)
256 {
257 throw ExprException.TooManyRightParentheses();
258 }
259 _topOperator--;
260 OperatorInfo operatorInfo = _ops[_topOperator];
261 if (_prevOperand == 0 && operatorInfo._type != Nodes.Call)
262 {
263 throw ExprException.MissingOperand(operatorInfo);
264 }
265 if (operatorInfo._type == Nodes.Call)
266 {
267 if (_prevOperand != 0)
268 {
269 ExpressionNode argument2 = NodePop();
270 FunctionNode functionNode2 = (FunctionNode)NodePop();
271 functionNode2.AddArgument(argument2);
272 functionNode2.Check();
273 NodePush(functionNode2);
274 }
275 }
276 else
277 {
278 ExpressionNode node = NodePop();
279 node = new UnaryNode(_table, 0, node);
280 NodePush(node);
281 }
282 _prevOperand = 2;
283 num--;
284 continue;
285 }
286 case Tokens.ListSeparator:
287 {
288 if (_prevOperand == 0)
289 {
290 throw ExprException.MissingOperandBefore(",");
291 }
293 OperatorInfo operatorInfo = _ops[_topOperator - 1];
294 if (operatorInfo._type != Nodes.Call)
295 {
296 throw ExprException.SyntaxError();
297 }
298 ExpressionNode argument = NodePop();
299 FunctionNode functionNode = (FunctionNode)NodePop();
300 functionNode.AddArgument(argument);
301 NodePush(functionNode);
302 _prevOperand = 0;
303 continue;
304 }
305 case Tokens.BinaryOp:
306 if (_prevOperand == 0)
307 {
308 if (_op == 15)
309 {
310 _op = 2;
311 }
312 else
313 {
314 if (_op != 16)
315 {
316 throw ExprException.MissingOperandBefore(Operators.ToString(_op));
317 }
318 _op = 1;
319 }
320 goto case Tokens.UnaryOp;
321 }
322 _prevOperand = 0;
323 BuildExpression(Operators.Priority(_op));
324 _ops[_topOperator++] = new OperatorInfo(Nodes.Binop, _op, Operators.Priority(_op));
325 continue;
326 case Tokens.UnaryOp:
327 _ops[_topOperator++] = new OperatorInfo(Nodes.Unop, _op, Operators.Priority(_op));
328 continue;
329 case Tokens.ZeroOp:
330 if (_prevOperand != 0)
331 {
332 throw ExprException.MissingOperator(new string(_text, _start, _pos - _start));
333 }
334 _ops[_topOperator++] = new OperatorInfo(Nodes.Zop, _op, 24);
335 _prevOperand = 2;
336 continue;
337 case Tokens.Dot:
338 {
339 ExpressionNode expressionNode = NodePeek();
340 if (expressionNode != null && expressionNode.GetType() == typeof(NameNode))
341 {
342 Scan();
343 if (_token == Tokens.Name)
344 {
345 NameNode nameNode = (NameNode)NodePop();
346 string name = nameNode._name + "." + NameNode.ParseName(_text, _start, _pos);
347 NodePush(new NameNode(_table, name));
348 continue;
349 }
350 }
351 goto default;
352 }
353 default:
354 throw ExprException.UnknownToken(new string(_text, _start, _pos - _start), _start + 1);
355 }
356 break;
357 }
358 if (_prevOperand == 0)
359 {
360 if (_topNode != 0)
361 {
362 OperatorInfo operatorInfo = _ops[_topOperator - 1];
363 throw ExprException.MissingOperand(operatorInfo);
364 }
365 }
366 else
367 {
369 if (_topOperator != 1)
370 {
371 throw ExprException.MissingRightParen();
372 }
373 }
374 }
376 return _expression;
377 }
static bool IsCatchableExceptionType(Exception e)
Definition ADP.cs:790
void NodePush(ExpressionNode node)
ExpressionNode ParseAggregateArgument(FunctionId aggregate)

References System.Data.ExpressionParser._expression, System.Data.NameNode._name, System.Data.ExpressionParser._nodeStack, System.Data.ExpressionParser._op, System.Data.OperatorInfo._op, System.Data.ExpressionParser._ops, System.Data.ExpressionParser._pos, System.Data.ExpressionParser._prevOperand, System.Data.ExpressionParser._start, System.Data.ExpressionParser._table, System.Data.ExpressionParser._text, System.Data.ExpressionParser._token, System.Data.ExpressionParser._topNode, System.Data.ExpressionParser._topOperator, System.Data.OperatorInfo._type, System.Data.FunctionNode.AddArgument(), System.Data.ExpressionParser.BuildExpression(), System.Data.FunctionNode.Check(), System.Data.ExpressionParser.CheckToken(), System.Data.ExprException.InWithoutParentheses(), System.Data.Common.ADP.IsCatchableExceptionType(), System.Data.ExprException.LookupArgument(), System.Data.ExprException.MissingOperand(), System.Data.ExprException.MissingOperandBefore(), System.Data.ExprException.MissingOperator(), System.Data.ExprException.MissingRightParen(), System.Data.ExpressionParser.NodePeek(), System.Data.ExpressionParser.NodePop(), System.Data.ExpressionParser.NodePush(), System.Data.ExpressionParser.ParseAggregateArgument(), System.Data.NameNode.ParseName(), System.Data.Operators.Priority(), System.Data.ExpressionParser.Scan(), System.Data.ExpressionParser.ScanToken(), System.Data.ExpressionParser.StartScan(), System.Data.ExprException.SyntaxError(), System.text, System.Data.ExprException.TooManyRightParentheses(), System.Data.Operators.ToString(), and System.Data.ExprException.UnknownToken().