2012-12-10 37 views
8

Có ai biết cách nào trong khuôn khổ Microsoft .NET để kiểm tra cú pháp và chỉ cú pháp của một tệp C# đã cho không?Kiểm tra C# Cú pháp từ Dòng lệnh

Đối với một chút nền tảng, điều tôi quan tâm là thiết lập syntastic để kiểm tra cú pháp của .cs tệp. Ngoài hộp, cú pháp sử dụng trình biên dịch Mono C# với cờ --parse để thực hiện thao tác này nhưng tôi không thể tìm thấy tương đương trong khuôn khổ Microsoft .NET.

Nỗ lực đầu tiên của tôi để làm việc này là sử dụng csc /target:library /nologo thay cho mcs --parse, nhưng vấn đề là điều này được gọi trên cơ sở mỗi tệp. Kết quả là, nó báo cáo thiếu các không gian tên (tồn tại trong toàn bộ dự án xây dựng) thay vì chỉ các lỗi cú pháp.

+0

Lý do để thực hiện việc này là gì? – mellamokb

+4

Tại sao không chỉ cài đặt mono? –

Trả lời

1

Tôi đã sử dụng NRefactory trước từ IDE icsharpcode. Thật nhanh chóng và dễ dàng cho những thứ cơ bản.

xem bài viết này: Using NRefactory for analyzing C# code

tôi sử dụng nó để tạo ra ví dụ VB.NET từ C ví dụ #. Phương pháp mà thực hiện điều này là thực sự thẳng về phía trước và có thể dễ dàng thích nghi với nhu cầu của bạn:

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

Lưu ý: Mã trước là từ một phiên bản cũ và có thể không biên dịch chống lại phiên bản mới nhất của thư viện NRefactory .

+0

Điều này dường như là câu trả lời độc lập thực hiện CLR tốt nhất hiện có. – Michael

0

Tôi nghĩ rằng tôi có thể có giải pháp cho câu hỏi của bạn. Nếu bạn đang cố gắng kiểm tra cú pháp mã của bạn mà không có trong trình gỡ rối, bạn có thể sử dụng một trình biên dịch trực tuyến hút như compilr. Nếu bạn muốn xuất ra các resuts thì bạn có thể sử dụng api tuyệt vời này được gọi là Html Agility để lấy kết quả tắt của trình biên dịch trực tuyến một cách dễ dàng. Hy vọng điều này đã giúp!

2

Bạn có thể thực hiện việc này qua số Roslyn CTP. Nó cho phép bạn phân tích cú pháp tệp .cs hoàn toàn và đi bộ toàn bộ cây, tìm kiếm lỗi.

Để biết chi tiết, tôi khuyên bạn nên tải xuống Walkthrough: Getting Started with Syntax Analysis cho C#, vì nó cho bạn thấy cách tiếp cận cơ bản để xem các cây cú pháp trong tệp C#.

Các vấn đề liên quan