编辑
2025-10-15
C#
00

目录

语法树的基本概念
语法树的主要组成部分
实战示例
基础示例 - 解析Hello World
使用SyntaxWalker遍历语法树
查询语法树
使用LINQ查询
实用技巧
检查节点类型
获取节点的完整文本
总结

语法分析是理解和处理C#代码的基础。通过.NET Compiler Platform SDK (也称为Roslyn),我们可以分析、理解和转换C#代码的结构。

语法树的基本概念

语法树是编译器用来理解代码的数据结构。它具有以下特点:

  • 完整性:代表源代码中的所有信息
  • 不可变性:创建后无法修改
  • 线程安全:可以在多个线程中并发访问

语法树的主要组成部分

C#
// 四个主要构建块 1. SyntaxTree // 表示整个解析树 2. SyntaxNode // 表示语法结构(如声明、语句等) 3. SyntaxToken // 表示关键字、标识符、运算符等 4. SyntaxTrivia // 表示空白、注释等

实战示例

基础示例 - 解析Hello World

C#
using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; namespace AppSyntaxAnalysis { internal class Program { static void Main(string[] args) { // 要分析的代码 string sourceCode = @" using System; class Program { static void Main(string[] args) { Console.WriteLine(""Hello World!""); } }"; // 解析代码生成语法树 SyntaxTree tree = CSharpSyntaxTree.ParseText(sourceCode); // 获取根节点 CompilationUnitSyntax root = tree.GetCompilationUnitRoot(); // 分析using指令 foreach (UsingDirectiveSyntax usingDirective in root.Usings) { Console.WriteLine($"Using: {usingDirective.Name}"); } Console.ReadKey(); } } }

image.png

使用SyntaxWalker遍历语法树

C#
using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; namespace AppSyntaxAnalysis { public class CustomSyntaxWalker : CSharpSyntaxWalker { // 存储找到的方法声明 public List<MethodDeclarationSyntax> Methods { get; } = new List<MethodDeclarationSyntax>(); public override void VisitMethodDeclaration(MethodDeclarationSyntax node) { // 收集方法声明 Methods.Add(node); base.VisitMethodDeclaration(node); } } internal class Program { static void Main(string[] args) { string code = @" class MyClass { void Method1() { } public string Method2() { return """"; } }"; SyntaxTree tree = CSharpSyntaxTree.ParseText(code); var root = tree.GetCompilationUnitRoot(); var walker = new CustomSyntaxWalker(); walker.Visit(root); foreach (var method in walker.Methods) { Console.WriteLine($"Found method: {method.Identifier.Text}"); } Console.ReadKey(); } } }

image.png

查询语法树

使用LINQ查询

C#
// 查找所有public方法 var publicMethods = root.DescendantNodes() .OfType<MethodDeclarationSyntax>() .Where(m => m.Modifiers.Any(modifier => modifier.IsKind(SyntaxKind.PublicKeyword))); // 查找所有类声明 var classes = root.DescendantNodes() .OfType<ClassDeclarationSyntax>();

实用技巧

检查节点类型

C#
if (node is MethodDeclarationSyntax methodDeclaration) { // 处理方法声明 Console.WriteLine($"Method name: {methodDeclaration.Identifier.Text}"); Console.WriteLine($"Return type: {methodDeclaration.ReturnType}"); }

获取节点的完整文本

C#
// 获取节点的原始文本 string nodeText = node.ToFullString(); // 获取节点的规范化文本(不包含trivia) string normalizedText = node.ToString();

总结

语法分析是处理C#代码的强大工具,可用于:

  • 代码分析
  • 代码重构
  • 自定义代码检查
  • 源代码转换

通过Roslyn提供的API,我们可以方便地访问和操作代码的语法结构,实现各种代码分析和转换功能。

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!