Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.03.2014, 16:21   #1
stationfuk
Пользователь
 
Регистрация: 19.02.2012
Сообщений: 15
По умолчанию Нахождение максимальной вложенности операторов в коде на C# через Roslyn

Добрый день. Требуется найти максимальный уровень вложенности среди всех операторов функции в коде на C# через библиотеку Roslyn. Вот мой код:
Код:
static void parseFile(string pathToFile) 
        {
            SyntaxTree tree = SyntaxTree.ParseFile(pathToFile);
            IEnumerable<MethodDeclarationSyntax> methods = tree
                .GetRoot()
                .DescendantNodes()
                .OfType<MethodDeclarationSyntax>();

            foreach (MethodDeclarationSyntax method in methods) //обрабатываем каждую функцию файла
            {
                SyntaxToken functionName = method.Identifier;   //имя функции
                BlockSyntax functionBody;
                if (method.ChildNodes().OfType<BlockSyntax>().Count() != 0)    
                {
                    functionBody = method.ChildNodes().OfType<BlockSyntax>().Single();  //тело функции

                    int lvl = 0;

                    foreach (var funcNestTest in functionBody.DescendantNodes().OfType<StatementSyntax>())
                    {
                        lvl = 0;
                        DFS(funcNestTest, ref lvl);
                        if (lvl > lvlMax) lvlMax = lvl;
                    }
                    
                }
            }

        static int lvlMax = 0;

        static void DFS(StatementSyntax funcNestTest, ref int lvl)
        {
            foreach (StatementSyntax func in funcNestTest.DescendantNodes().OfType<StatementSyntax>())
            {
                if (func.DescendantNodes().OfType<StatementSyntax>().Count() != 0)
                {
                    lvl++;
                    DFS(func, ref lvl);
                }
                else
                {
                    return;
                }
            }
            return;
        }
methods - все функции. Для каждого method(функция) мы получаем её название и код, далее, если в ней есть операторы, то для каждого вызываем DFS(с 0 в аргументах, т.к. их вложенность 0) Далее, по идее, если в операторе есть вложенные операторы, то вызываем DFS уже для них всех. Каждый вызов прибавляет к lvl единицу. Однако, код работает как-то не так. Просто я не работал раньше с рекурсивными функциями. Может кто подскажет, в чём здесь может быть дело?
stationfuk вне форума Ответить с цитированием
Старый 10.03.2014, 20:17   #2
stationfuk
Пользователь
 
Регистрация: 19.02.2012
Сообщений: 15
По умолчанию

Если кому интересно, вот возможное решение перебором родителей к корню (довольно шустро работает):
Код:
        foreach (var funcNestTest in functionBody.DescendantNodes().OfType<StatementSyntax>())
        {
                int lvl = DFS(funcNestTest, 0);
                if (lvl > lvlMax) lvlMax = lvl; 
        }

        ...

        static int DFS(SyntaxNode funcNestTest, int lvl)
        {
            if (funcNestTest.Parent.Kind != SyntaxKind.MethodDeclaration)
            {
                if (funcNestTest.Parent.Kind != SyntaxKind.Block && funcNestTest.Parent.Kind != SyntaxKind.ElseClause)
                    lvl++;
                lvl = DFS(funcNestTest.Parent, lvl);
            }
            return lvl;
        }
Тему можно закрывать.
stationfuk вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Функции операторов в с++ запутался в коде. Сергей.Ш Общие вопросы C/C++ 11 21.11.2013 12:33
Задача на нахождение максимальной разницы между вырученными и потраченными деньгами) Вася Маклауд Помощь студентам 2 14.06.2011 18:07
Нахождение ошибки в коде (форме) (Visual Basic{двумерный массив]) Bernuar Помощь студентам 0 11.05.2011 14:57
задача на нахождение максимальной прибыли с учётом издержек Mary-Maddlen Microsoft Office Excel 4 24.02.2011 23:49
Нахождение в массиве максимальной суммы элементов byte916 Microsoft Office Excel 1 07.10.2009 13:03