예제 #1
0
        TreeNode LinkUndefinedVariable(UndefinedVariableTreeNode vTree, CalculationContext context, string[] parameterNames)
        {
            for (int i = 0; i < parameterNames.Length; ++i)
            {
                if (vTree.Name == parameterNames[i])
                {
                    return(new FunctionParameterTreeNode(i));
                }
            }

            if (context.VariableTable.IsIdentifierDefined(vTree.Name))
            {
                // can't optimize to ternary expression, idk why
                if (InsertVariableValuesDirectly)
                {
                    return(new NumberTreeNode(context.VariableTable[vTree.Name], vTree.Parent));
                }
                else
                {
                    return(new VariableIndexTreeNode(context.VariableTable.GetIndex(vTree.Name), vTree.Parent));
                }
            }

            throw new Exception(String.Format("Variable \"{0}\" is not defined", vTree.Name));
        }
예제 #2
0
        static void DefineVariableInput(UndefinedVariableTreeNode vDefinition, string expressionInput, CalculationContext context)
        {
            Token[]          tokens   = lexer.Tokenize(expressionInput);
            TreeNode         tree     = parser.Construct(tokens);
            FinishedFunction function = linker.BuildFunction(tree, context, new string[0]);
            double           value    = treeCalculator.Calculate(function);

            context.VariableTable.AssignItem(vDefinition.Name, value);
        }