8

有谁知道在 Microsoft .NET 框架中检查给定 C# 文件的语法的方法,并且只检查语法?

对于一些背景知识,我感兴趣的是设置syntastic来检查.cs文件的语法。开箱即用,syntastic 使用带有其--parse标志的 Mono C# 编译器来执行此操作,但我在 Microsoft .NET 框架中找不到等效项。

我第一次尝试使用它csc /target:library /nologo来代替mcs --parse,但问题是它是基于每个文件调用的。因此,它会报告缺少的命名空间(存在于完整的项目构建中),而不仅仅是语法错误。

4

3 回答 3

2

您可以通过Roslyn CTP执行此操作。它允许您完全解析 .cs 文件,并遍历整个树,查找错误。

有关详细信息,我建议下载演练:C# 语法分析入门,因为它向您展示了查看 C# 文件中的语法树的基本方法。

于 2012-12-10T22:45:05.510 回答
1

我之前在 icsharpcode IDE 中使用NRefactory。对于基本的东西来说,它既快速又容易。

看这篇文章: 使用 NRefactory 分析 C# 代码

我用它从 C# 示例创建 VB.NET 示例。执行此操作的方法非常简单,可以轻松适应您的需求:

    private static void ConvertLanguage(TextReader input, TextWriter output, SupportedLanguage language, Action<string> onError)
    {
        using (IParser parser = ParserFactory.CreateParser(language, input))
        {
            parser.Parse();
            var specials = parser.Lexer.SpecialTracker.RetrieveSpecials();
            var result = parser.CompilationUnit;
            //if (parser.Errors.Count > 0)
            //    MessageBox.Show(parser.Errors.ErrorOutput, "Parse errors");

            IOutputAstVisitor outputVisitor;
            if (language == SupportedLanguage.CSharp)
                outputVisitor = new VBNetOutputVisitor();
            else
                outputVisitor = new CSharpOutputVisitor();

            outputVisitor.Options.IndentationChar = ' ';
            outputVisitor.Options.IndentSize = 4;
            outputVisitor.Options.TabSize = 4;

            using (SpecialNodesInserter.Install(specials, outputVisitor))
                result.AcceptVisitor(outputVisitor, null);

            if (outputVisitor.Errors.Count > 0 && onError != null)
                onError(outputVisitor.Errors.ErrorOutput);

            output.Write(outputVisitor.Text);
        }
    }

注意:上述代码来自旧版本,可能无法针对最新版本的 NRefactory 库进行编译。

于 2012-12-11T00:22:18.373 回答
0

我想我可能对你的问题有一个解决方案。如果您尝试在不使用调试器的情况下检查代码的语法,则可以使用在线编译器作为compilr。如果你想输出结果,那么你可以使用这个名为Html Agility的神奇 api轻松地从在线编译器中获取结果。希望这有帮助!

于 2012-12-10T22:45:00.990 回答