private string evalSub(StructToken token, int subIndex) { TreeToken subToken = token.SubTokens[subIndex]; int precedence = OperatorProperties.GetPrecedence(token); bool brackets = precedence > OperatorProperties.GetPrecedence(subToken); string expr = subToken.Evaluate(this); if (brackets) { expr = $"<mo>(</mo>{expr}<mo>)</mo>"; } return(expr); }
private static void createTreeNode(Stack <Token> stack, StructToken token) { if (token is SignOperatorToken signToken) { if (stack.Count < 1) { throw new ParserSyntaxException(token.Position); } signToken.SubTokens[1] = (TreeToken)stack.Pop(); signToken.SubTokens[0] = new NumberToken("0", signToken.Position); stack.Push(signToken); } else if (token is OperatorToken opToken) { if (stack.Count < 2) { throw new ParserSyntaxException(token.Position); } opToken.SubTokens[1] = (TreeToken)stack.Pop(); opToken.SubTokens[0] = (TreeToken)stack.Pop(); stack.Push(opToken); } else if (token is FuncToken funcToken) { if (stack.Count < 1) { throw new ParserSyntaxException(token.Position); } var paramToken = stack.Pop() as FuncParamToken; if (paramToken == null) { throw new ParserSyntaxException(token.Position); } if (funcToken.ArgCount != -1 && paramToken.ParamList.Count != funcToken.ArgCount) { throw new ParserFunctionArgumentException(funcToken.Symbol, token.Position, paramToken.ParamList.Count); } int i = 0; foreach (var subTokenList in paramToken.ParamList) { funcToken.SubTokens.Add(CreateTree(subTokenList)); i++; } stack.Push(funcToken); } }