using System; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; namespace CodeParser { public class Program { public static void Main(string[] args) { string code = "using System;\n\nnamespace HelloWorld {\n\tclass Program {\n\t\tstatic void Main(string[] args) {\n\t\t\tConsole.WriteLine(\"Hello, World!\");\n\t\t}\n\t}\n}"; SyntaxTree tree = CSharpSyntaxTree.ParseText(code); SyntaxNode programNode = tree.GetRoot(); // visit each SyntaxNode element and print its kind programNode.Accept(new SyntaxNodePrinter()); } } public class SyntaxNodePrinter : CSharpSyntaxVisitor { public override void Visit(SyntaxNode node) { Console.WriteLine(node.Kind()); base.Visit(node); } } }
using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; namespace CodeParser { public class Program { public static void Main(string[] args) { string code = "int x = 10;\nif (x > 5) {\n\tx *= 2;\n} else {\n\tx /= 2;\n}\n"; SyntaxTree tree = CSharpSyntaxTree.ParseText(code); SyntaxNode programNode = tree.GetRoot(); // visit each SyntaxNode element and count the number of ConditionalExpressionSyntax nodes int count = 0; programNode.Accept(new ConditionalExpressionCounter(ref count)); System.Console.WriteLine($"Number of conditional expressions: {count}"); } } public class ConditionalExpressionCounter : CSharpSyntaxVisitor { private int _count; public ConditionalExpressionCounter(ref int count) { _count = count; } public override void VisitConditionalExpression(ConditionalExpressionSyntax node) { _count++; base.VisitConditionalExpression(node); } } }Both examples use the Roslyn Compiler Framework package library to parse a C# program and traverse its syntax tree using the Accept method. In Example 1, the visitor prints the kind of each SyntaxNode element in the program. In Example 2, the visitor counts the number of ConditionalExpressionSyntax nodes in the program.