Ejemplo n.º 1
0
 public static void Run(Nodes.Program program, FunctionIndexingStrategy indexingStrategy)
 {
     AddLibraryClasses(program);
     program.PreProcess();
     program.Process();
     program.SetVariableIndexes(indexingStrategy);
 }
Ejemplo n.º 2
0
        public static void SetVariableIndexes(this Nodes.Program program,
                                              FunctionIndexingStrategy functionIndexingStrategy)
        {
            program.ClassNodes.ForEach(classDeclaration =>
            {
                classDeclaration.FunctionDeclarationNodes.ForEach(functionDeclaration =>
                {
                    if (functionIndexingStrategy == FunctionIndexingStrategy.United)
                    {
                        int varIndex = functionDeclaration.IsStatic ? 0 : 1;
                        SetFunctionArgsIndexes(functionDeclaration, ref varIndex);
                        if (functionDeclaration.StatementBlock != null)
                        {
                            SetBlockVarsIndexes(functionDeclaration.StatementBlock, ref varIndex);
                        }
                    }
                    else if (functionIndexingStrategy == FunctionIndexingStrategy.Splitted)
                    {
                        int argumenIndex = functionDeclaration.IsStatic ? 0 : 1;
                        int localIndex   = 0;
                        SetFunctionArgsIndexes(functionDeclaration, ref argumenIndex);
                        if (functionDeclaration.StatementBlock != null)
                        {
                            SetBlockVarsIndexes(functionDeclaration.StatementBlock, ref localIndex);
                        }
                    }
                });
            });

            void SetFunctionArgsIndexes(FunctionDeclaration functionDeclaration, ref int index)
            {
                foreach (var parameter in functionDeclaration.ParameterNodes)
                {
                    parameter.Index = index++;
                }
                //SetBlockVarsIndexes(functionDeclaration.StatementBlock, ref index);
            }

            void SetDeclarationIndex(VariableDeclaration declaration, ref int varIndex)
            {
                declaration.Index = varIndex++;
            }

            void SetBlockVarsIndexes(BlockStatement blockStatement, ref int varIndex)
            {
                foreach (var statement in blockStatement.Statements)
                {
                    SetStatementIndexes(statement, ref varIndex);
                }
            }

            void SetStatementIndexes(IStatement statement, ref int varIndex)
            {
                switch (statement)
                {
                case VariableDeclaration declaration:
                {
                    SetDeclarationIndex(declaration, ref varIndex);
                    break;
                }

                case BlockStatement blockStatement:
                    SetBlockVarsIndexes(blockStatement, ref varIndex);
                    break;

                case IfStatement ifStatement:
                {
                    SetStatementIndexes(ifStatement.TrueCaseBlockStatement, ref varIndex);
                    SetStatementIndexes(ifStatement.FasleCaseBlockStatement, ref varIndex);
                    break;
                }

                case WhileStatement whileStatement:
                {
                    SetStatementIndexes(whileStatement.BlockOrSingleStatement, ref varIndex);
                    break;
                }

                case ForStatement forStatement:
                {
                    SetStatementIndexes(forStatement.InitializationStatement, ref varIndex);
                    SetStatementIndexes(forStatement.BlockOrSingleStatement, ref varIndex);
                    SetStatementIndexes(forStatement.IterationStatement, ref varIndex);
                    break;
                }
                }
            }
        }