MrKWatkins.Ast
0.9.139
Prefix Reserved
dotnet add package MrKWatkins.Ast --version 0.9.139
NuGet\Install-Package MrKWatkins.Ast -Version 0.9.139
<PackageReference Include="MrKWatkins.Ast" Version="0.9.139" />
<PackageVersion Include="MrKWatkins.Ast" Version="0.9.139" />
<PackageReference Include="MrKWatkins.Ast" />
paket add MrKWatkins.Ast --version 0.9.139
#r "nuget: MrKWatkins.Ast, 0.9.139"
#:package MrKWatkins.Ast@0.9.139
#addin nuget:?package=MrKWatkins.Ast&version=0.9.139
#tool nuget:?package=MrKWatkins.Ast&version=0.9.139
MrKWatkins.Ast
C# library to build and manipulate abstract syntax trees when writing compilers.
Background
As part of my Oakley project to create a compiler and it's associated OakAsm project to create an assembler (details coming soon) I needed to represent abstract syntax trees in C#. This library was created so I could share the code between those two projects.
Full documentation is available at mrkwatkins.github.io/Ast. Source code and issue tracking are on GitHub.
Usage
Create a base node type for your abstract syntax tree:
public abstract class Expression : PropertyNode<Expression>
{
}
Create more specific nodes:
public sealed class ConstantNumber : Expression
{
public ConstantNumber(int value)
{
Value = value;
}
public int Value
{
get => Properties.GetOrThrow<int>(nameof(Value));
init => Properties.Set(nameof(Value), value);
}
}
public sealed class Addition : Expression
{
public Addition(ConstantNumber x, ConstantNumber y)
{
Children.Add(x);
Children.Add(y);
}
}
Walk the tree:
var fifty = new ConstantNumber(50);
var sixty = new ConstantNumber(60);
var expression = new Addition(fifty, sixty);
var allNodes = expression.ThisAndDescendants;
var fiftyAndParent = fifty.ThisAndAncestors;
var fiftyAndSixty = fifty.ThisAndNextSiblings;
var justSixty = sixty.PreviousSibling;
var result = expression.Children.OfType<ConstantNumber>().Sum(n => n.Value);
Mark nodes with errors, warnings and info messages:
sixty.AddError("Value must be less than 55.");
var expressionHasErrors = expression.ThisAndDescendantsHaveErrors; // true.
Associate nodes with their position in source code during parsing:
var source = new TextFile(new FileInfo("MySource.code")); // Contains "50 + 60".
expression.SourcePosition = source.CreatePosition(0, 7, 0, 0); // startIndex, length, startLineIndex, startColumnIndex.
fifty.SourcePosition = source.CreatePosition(0, 2, 0, 0);
sixty.SourcePosition = source.CreatePosition(5, 2, 0, 5);
Output errors with highlighted source information:
var errors = MessageFormatter.FormatErrors(expression, MessageFormatterOptions.PrefixAndHighlight);
// MySource.code (1, 6): Error: Value must be less than 55.
// 50 + 60
// --
Manipulate and copy the tree:
sixty.ReplaceWith(new ConstantNumber(55));
var copy = expression.Copy();
Install
dotnet add package MrKWatkins.Ast
Pull Requests
I'm not accepting pull requests at the current time; this project is tailored for some other projects of mine and I want to get them in a suitable state first.
Feel free to raise issues for bugs or suggestions, but I make no guarantees they will get looked at I'm afraid!
License
MIT
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- No dependencies.
NuGet packages (19)
Showing the top 5 NuGet packages that depend on MrKWatkins.Ast:
| Package | Downloads |
|---|---|
|
MrKWatkins.OakAsm
Shared code for the OakAsm project. |
|
|
MrKWatkins.OakAsm.Z80
Library containing assembly definitions for the Z80 CPU, part of the OakAsm project. |
|
|
MrKWatkins.OakAsm.Formatting
Library for formatting assembly code, part of the OakAsm project. |
|
|
MrKWatkins.OakAsm.Disassembly
CPU-agnostic disassembly of machine code to an assembly AST, part of the OakAsm project. |
|
|
MrKWatkins.OakAsm.Parsing
Library for parsing assembly code, part of the OakAsm project. |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.9.139 | 528 | 10/6/2026 |
| 0.9.138 | 105 | 10/6/2026 |
| 0.9.137 | 908 | 8/1/2026 |
| 0.9.136 | 146 | 7/29/2026 |
| 0.9.135 | 1,540 | 3/10/2026 |
| 0.9.134 | 1,460 | 11/15/2025 |
| 0.9.133 | 747 | 9/8/2025 |
| 0.9.132 | 469 | 8/12/2025 |
| 0.9.131 | 397 | 8/10/2025 |
| 0.9.130 | 469 | 8/6/2025 |
| 0.9.129 | 2,585 | 1/29/2025 |
| 0.9.128 | 2,525 | 12/22/2024 |
| 0.9.127 | 312 | 12/17/2024 |
| 0.9.126 | 245 | 12/17/2024 |
| 0.9.125 | 251 | 12/17/2024 |
| 0.9.124 | 446 | 12/15/2024 |
| 0.9.123 | 553 | 12/8/2024 |
| 0.9.122 | 435 | 11/17/2024 |
| 0.9.121 | 633 | 11/1/2024 |
| 0.9.120 | 1,167 | 10/24/2024 |