语法分析是理解和处理C#代码的基础。通过.NET Compiler Platform SDK (也称为Roslyn),我们可以分析、理解和转换C#代码的结构。
语法树是编译器用来理解代码的数据结构。它具有以下特点:
C#// 四个主要构建块
1. SyntaxTree // 表示整个解析树
2. SyntaxNode // 表示语法结构(如声明、语句等)
3. SyntaxToken // 表示关键字、标识符、运算符等
4. SyntaxTrivia // 表示空白、注释等
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();
}
}
}
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();
}
}
}
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 许可协议。转载请注明出处!