从命令行检查C#语法

时间:2012-12-10 22:38:52

标签: c# vim syntax-checking syntastic

有没有人知道Microsoft .NET框架中检查给定C#文件的语法和语法的方法?

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

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

3 个答案:

答案 0 :(得分:2)

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

有关详细信息,我建议为C#下载Walkthrough: Getting Started with Syntax Analysis,因为它向您展示了查看C#文件中语法树的基本方法。

答案 1 :(得分:1)

我之前在icsharpcode IDE中使用过NRefactory。基本的东西很快捷。

看到这篇文章: Using NRefactory for analyzing C# code

我用它来创建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库进行编译。

答案 2 :(得分:0)

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