private void OnClosingBracket() { var funcNode = new MultiTreeNode <Value>(new Value(ValueType.Function, null)); while (OperationsStack.Peek() != "(") { if (EvalOperator() == ",") { funcNode.AddChild(OperandsStack.Pop()); } } OperationsStack.Pop(); if (OperationsStack.Count > 0 && Library.IsFunction(OperationsStack.Peek())) { funcNode.Data.Val = OperationsStack.Pop(); OperandsStack.Push(funcNode); return; } if (funcNode.Count > 0) { funcNode.Data.Val = "MkTuple"; OperandsStack.Push(funcNode); } }
private void OnClosingSquareBracket() { var funcNode = new MultiTreeNode <Value>(new Value(ValueType.Function, null)); while (OperationsStack.Peek() != "[") { if (EvalOperator() == ",") { funcNode.AddChild(OperandsStack.Pop()); } } OperationsStack.Pop(); if (OperationsStack.Count > 0 && OperationsStack.Peek() == "MkList") { funcNode.Data.Val = OperationsStack.Pop(); OperandsStack.Push(funcNode); return; } if (OperationsStack.Count > 0 && OperationsStack.Peek() == "ByIdx") { funcNode.Data.Val = OperationsStack.Pop(); funcNode.AddChild(OperandsStack.Pop()); funcNode.AddChild(OperandsStack.Pop()); OperandsStack.Push(funcNode); return; } }
private void ParseToken(TokenLine.TokenEnum token) { if (Library.IsFunction(token.Current)) { OnFunction(token); } else if (token.Current == "[") { OnOpeningSquareBracket(token); } else if (RouteOperators.Contains(token.Current)) { OperationsStack.Push(token.Current); } else if (token.Current == ")") { OnClosingBracket(); } else if (token.Current == "]") { OnClosingSquareBracket(); } else if (Library.IsOperator(token.Current)) { while (OperationsStack.Count > 0 && Library.Operators[OperationsStack.Peek()] >= Library.Operators[token.Current]) { EvalOperator(); } OperationsStack.Push(token.Current); } else { var value = Translator.ParseTypes(token.Current); OperandsStack.Push(value == null ? new MultiTreeNode <Value>(new Value(ValueType.Variable, token.Current)) : new MultiTreeNode <Value>(new Value(ValueType.Value, value))); } }