public void Analyze_Parentheses_ReturnsParenthesesNode()
        {
            Environment environment = new Environment();

            environment.AddSymbol("x");
            SyntaxNode root = new ParenthesesNode(new IdentifierNode("x"));

            root = SemanticAnalyzer.Analyze(root, environment);

            Assert.AreEqual("(x)", root.ToString());
        }
        private static SyntaxNode Analyze(SyntaxNode node)
        {
            switch (node.Type)
            {
            case SyntaxNodeType.Identifier:
                return(AnalyzeIdentifier((IdentifierNode)node));

            case SyntaxNodeType.AmbigiousFunctionOrShortHandMultiplication:
                return(AnalyzeAmbiguousFunctionOrDistribution((FunctionOrDistributionNode)node));

            case SyntaxNodeType.Number:
                return(node);

            case SyntaxNodeType.Parentheses:
                ParenthesesNode parenthesesNode = (ParenthesesNode)node;
                parenthesesNode.Expression = Analyze(parenthesesNode.Expression);
                return(parenthesesNode);

            case SyntaxNodeType.Operator:
                OperatorNode      operatorNode = (OperatorNode)node;
                List <SyntaxNode> newOperands  = new List <SyntaxNode>();
                foreach (SyntaxNode operand in operatorNode.Operands)
                {
                    newOperands.Add(Analyze(operand));
                }
                operatorNode.Operands = newOperands;
                return(AnalyzeOperator(operatorNode));

            case SyntaxNodeType.Function:
                FunctionNode functionNode = (FunctionNode)node;
                functionNode.Name = (IdentifierNode)Analyze(functionNode.Name);
                List <SyntaxNode> newArguments = new List <SyntaxNode>();
                foreach (SyntaxNode argument in functionNode.Arguments)
                {
                    newArguments.Add(Analyze(argument));
                }
                functionNode.Arguments = newArguments;
                return(functionNode);

            default:
                throw new System.ArgumentException($"Unknown syntax node type '{node.Type}'");
            }
        }
        public void Analyze_Parentheses_ThrowsException()
        {
            ParenthesesNode node = new ParenthesesNode(new IdentifierNode("x"));

            Assert.Throws <UndefinedSymbolException>(() => SemanticAnalyzer.Analyze(node, new Environment()));
        }