c#中带有开始和结束标记的简单注释函数

本文关键字:简单 注释 函数 结束 开始 | 更新日期: 2023-09-27 18:18:32

我正在创建一个代码编辑器,它将某些行定义为注释,这些行必须标记为开始和结束标记。代码看起来像这样:

StreamReader sr = new StreamReader(filePath);
if (File.Exists(newFilePath))
    File.Delete(newFilePath);
while (!sr.EndOfStream)
{
    string line = sr.ReadLine();
    if (line.Contains("CALL") && !line.Contains("//"))                                                                              //look for functions(macro's) that get called, ignore comments.
    {                 
        if (line.Contains("WAIT('DI'")||line.Contains("WAIT('DO'"))                                                                 //Comment the line when it contains any of these
            CommentOverride(line, newFilePath);
        else                                                                                                                        //if none of the above, writeline but give error message
            WriteLine(line, newFilePath);
    }
}
private void CommentOverride(string code, string filePath)
{
    WriteLineToFile("    :  ! BEGIN OVERRIDE COMMENT ;", filePath);
    string commentedLine = code.Insert(5, "//");
    WriteLineToFile(commentedLine, filePath);
    WriteLineToFile("    :  ! END OVERRIDE COMMENT ;", filePath);
}

当一行中有多行需要注释时,每行都有自己的开始和结束标记。这将导致代码比需要的多很多。现在我尝试使用流阅读器读取下一行并提前检查。但是这样我就不能再检查线路了。我尝试使用另一个流阅读器只读取下一行,但这种方式流阅读器sr仍然会找到下一行并再次注释它。导致该行被注释两次。

我可能只是忽略了显而易见的解决方案,但我还没能弄清楚如何做到这一点。

c#中带有开始和结束标记的简单注释函数

可能一个好的方法是在while循环之外保持一个状态,然后在重写时将其标记为活动:

bool overrideActive = false;
while (!sr.EndOfStream)
{
    string line = sr.ReadLine();
    if (line.Contains("CALL") && !line.Contains("//"))
    {                 
        if (line.Contains("WAIT('DI'")||line.Contains("WAIT('DO'"))
        {
            CommentOverride(line, newFilePath, overrideActive);
            overrideActive = true;
        }
        else
        {
            WriteLine(line, newFilePath);
            overrideActive = false;
        }
    }
}
private void CommentOverride(string code, string filePath, bool overrideActive)
{
    if (!overrideActive)
    {
        WriteLineToFile("    :  ! BEGIN OVERRIDE COMMENT ;", filePath);
    }
    string commentedLine = code.Insert(5, "//");
    WriteLineToFile(commentedLine, filePath);
    if (!overrideActive)
    {
        WriteLineToFile("    :  ! END OVERRIDE COMMENT ;", filePath);
    }
}

感谢您的帖子修复了它。它看起来像这样:

    private void CommentOverride(string code, string filePath, int lineNumber, string inputFilePath)
    {
        if (!overrideActive)
        {
            WriteLineToFile("    :  ! BEGIN OVERRIDE COMMENT ;", filePath);
            overrideActive = true;
        }
        string commentedLine = code.Insert(5, "//");
        WriteLineToFile(commentedLine, filePath);
        string nextLine = GetLine(inputFilePath, lineNumber + 1);
        if ((!nextLine.Contains("WAIT('DI'") && !nextLine.Contains("WAIT('DO'")))
            overrideActive = false;
        if(!overrideActive)
            WriteLineToFile("    :  ! END OVERRIDE COMMENT ;", filePath);
    }

谢谢!