コード例 #1
0
        private void ExtractTemporaryVariables(AST.FunctionDeclaration root)
        {
            var variableAccess = this.variableAccessGraphGenerator.GetVariableInfoPerAstNode(root);
            var result         = this.temporaryVariablesExtractor.ExtractTemporaryVariables(variableAccess, root.Body);
            var instructions   = result.Concat(root.Body.Instructions).ToList();

            root.Body = new AST.InstructionBlock(root.Body.InputRange, instructions);
        }
コード例 #2
0
        private void BuildVariableUsages(
            AST.Node node,
            AST.FunctionDeclaration parent,
            IDictionary <AST.VariableDeclaration, HashSet <AST.FunctionDeclaration> > result)
        {
            var newParent = parent;

            switch (node)
            {
            case AST.FunctionDeclaration declaration:
            {
                newParent = declaration;
                break;
            }

            case AST.VariableDeclaration declaration:
            {
                if (!result.ContainsKey(declaration))
                {
                    result.Add(declaration, new HashSet <AST.FunctionDeclaration>());
                }

                result[declaration].Add(parent);
                break;
            }

            case AST.Variable variable:
            {
                if (!result.ContainsKey(variable.Declaration))
                {
                    result.Add(variable.Declaration, new HashSet <AST.FunctionDeclaration>());
                }

                result[variable.Declaration].Add(parent);
                break;
            }
            }

            foreach (var child in node.Children())
            {
                this.BuildVariableUsages(child, newParent, result);
            }
        }
コード例 #3
0
 public ILabel GenerateBody(Function.Function function, AST.FunctionDeclaration root)
 {
     this.ExtractTemporaryVariables(root);
     return(this.functionBodyGenerator.BuildFunctionBody(function, root.Body));
 }