C#中带开始和结束标记的简单注释功能

时间:2015-10-20 08:50:00

标签: c# editor

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

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);
}

当有多行需要连续评论时,每一行都会得到自己的开始和结束标记。这将导致代码多于所需的代码。现在我尝试使用streamreader来读取下一行并提前检查它。但这样我再也无法检查线路了。我尝试使用另一个streamreader来只读取下一行,但这样streamreader sr仍会找到下一行并将再次注释。导致该行评论两次。

我可能只是忽略了明显的解决方案,但我无法弄清楚如何做到这一点。

2 个答案:

答案 0 :(得分:0)

执行此操作的一个好方法可能是在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);
    }
}

答案 1 :(得分:0)

通过你的帖子修正了它。它看起来像这样:

    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);
    }

谢谢!