Функция, которая удаляет все комментарии кода - PullRequest
0 голосов
/ 16 ноября 2018

Мне нужно сделать функцию, которая удаляет все комментарии из текста (кода). Мой код почти закончен, но он не работает, если комментарий начинается в первой строке файла. Он говорит, что индекс выходит за границы, я попытался изменить циклы for, чтобы начать с 1, а затем if на (text[i] == '/' && text[i - 1] == '/'), но это не работает. Любое предложение, как я могу это исправить или улучшить свой код, потому что он выглядит странно.

public void RemoveComments(string text)
        {
            for (int i = 0; i < text.Length; i++)
            {
                if (text[i] == '/' && text[i + 1] == '/')
                {
                    text = text.Remove(i, 2);
                    for (int j = i; j < text.Length; j++)
                    {
                        if (text[j] != '\n')
                        {
                            text = text.Remove(j, 1);
                            j--;
                        }
                        else if (text[j] == '\n')
                        {
                            text = text.Remove(j, 1);
                            j--;
                            while (text[j] == ' ')
                            {
                                text = text.Remove(j, 1);
                                j--;
                            }
                            i = j;
                            break;
                        }
                    }
                }

                else if (text[i] == '/' && text[i + 1] == '*')
                {
                    text = text.Remove(i, 2);
                    for (int j = i; j < text.Length; j++)
                    {
                        if (text[j] != '*' && text[j + 1] != '/')
                        {
                            text = text.Remove(j, 1);
                            j--;
                        }

                        else if (text[j] == '*' && text[j + 1] == '/')
                        {
                            text = text.Remove(j, 2);
                            j = j - 2;
                            while (text[j] == ' ')
                            {
                                text = text.Remove(j, 1);
                                j--;
                                if (text[j] == '\n')
                                {
                                    text = text.Remove(j, 1);
                                    j--;
                                }
                            }
                            i = j;
                            break;
                        }

                    }
                }
            }
            Console.WriteLine(text);
        }

РЕДАКТИРОВАТЬ: Теперь я провел много экспериментов, и я обнаружил, что проблема с (в // цикле) мне нужно этот цикл, чтобы исправить некоторые небольшие проблемы aligment:

while (text[j] == ' ')
{
    text = text.Remove(j, 1);
    j--;
}

Файл Test.txt.

//int a;
int c; //int d;
Console.Write/*Line*/("Hhehehe");
if(1>0)
/*ConsoleWriteLine("Yes")*/
//Nooo

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Похоже, у вас есть файлы кода C #.Таким образом вы можете использовать мощность Roslyn .Просто разберите файл кода в синтаксическое дерево и затем посетите это дерево с посетителем, который пропускает комментарии:

var code = File.ReadAllText("Code.cs");
SyntaxTree tree = CSharpSyntaxTree.ParseText(code);
var root = (CompilationUnitSyntax)tree.GetRoot();
var codeWithoutComments = new CommentsRemover().Visit(root).ToString();
Console.WriteLine(codeWithoutComments);

Посетитель:

class CommentsRemover : CSharpSyntaxRewriter
{
    public override SyntaxTrivia VisitTrivia(SyntaxTrivia trivia)
    {
        switch(trivia.Kind())
        {
            case SyntaxKind.SingleLineCommentTrivia:
            case SyntaxKind.MultiLineCommentTrivia:
                return default;
            default:
                return trivia;                 
        }            
    }
}

Пример файла кода:

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApp
{
    /* Sample
       Multiline Comment */
    class Program
    {
        static void Main(string[] args)
        {
            // Comment
            Console.Write/*Line*/("Hello, World!"); // Print greeting
            /*ConsoleWriteLine("Yes")*/
        }
    }
}

Вывод:

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApp
{

    class Program
    {
        static void Main(string[] args)
        {

            Console.Write("Hello, World!");

        }
    }
}

Примечания: Как видите, после удаления комментариев из строк, в которых не было ничего, кроме комментария, вы получаете пустые строки.Вы можете создать еще одного посетителя, чтобы удалить пустые строки.Также рассмотрите возможность удаления комментариев XML.

0 голосов
/ 16 ноября 2018

У вас есть цикл на основе текста. Длина

для (int i = 0; i

Но внутри цикла вы сокращаете текст. В определенный момент он меньше исходного текста. Длина, и у вас заканчивается индекс I, guiess

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...