public void Analyze_AmbiguousPredefinedFunction_ReturnsFunctionNode()
        {
            IdentifierNode left  = new IdentifierNode("sin");
            SyntaxNode     right = new NumberNode(1);
            SyntaxNode     root  = new FunctionOrDistributionNode(left, right);

            root = SemanticAnalyzer.Analyze(root, new Environment());

            Assert.AreEqual("sin(1)", root.ToString());
        }
        public void Analyze_AmbigiousSymbolDistribution_ReturnsOperatorNode()
        {
            IdentifierNode left  = new IdentifierNode("x");
            SyntaxNode     right = new NumberNode(1);
            SyntaxNode     root  = new FunctionOrDistributionNode(left, right);

            Environment environment = new Environment();

            environment.AddSymbol("x");

            root = SemanticAnalyzer.Analyze(root, environment);

            Assert.AreEqual("x * 1", root.ToString());
        }
        private static SyntaxNode AnalyzeAmbiguousFunctionOrDistribution(FunctionOrDistributionNode node)
        {
            if (environment.IsPredefinedFunction(node.Identifier.Value))
            {
                return(CreateFunctionNode(node.Identifier, node.Expression));
            }

            EnvironmentVariable definition = environment.Get(node.Identifier.Value);

            if (definition.IsTypeOf(EnvironmentVariableType.Function))
            {
                return(CreateFunctionNode(node.Identifier, node.Expression));
            }
            return(CreateMultiplicationNode(node.Identifier, node.Expression));
        }