Pustaka C# untuk membangun dan memanipulasi pohon sintaksis abstrak saat menulis kompiler.
Sebagai bagian dari proyek Oakley saya untuk membuat kompiler dan proyek OakAsm terkait untuk membuat assembler (detailnya segera hadir) saya perlu merepresentasikan pohon sintaksis abstrak di C#. Perpustakaan ini dibuat agar saya dapat berbagi kode antara kedua proyek tersebut.
Buat tipe simpul dasar untuk pohon sintaksis abstrak Anda:
public abstract class Expression : Node < Expression >
{
}
Buat node yang lebih spesifik:
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 ) ;
}
}
Berjalan di pohon:
var fifty = new ConstantNumber ( 50 ) ;
var sixty = new ConstantNumber ( 60 ) ;
var expression = new Addition ( fifty , sixty ) ;
var allNodes = expression . ThisAndDescendents ;
var fiftyAndParent = fifty . ThisAndAncestors ;
var fiftyAndSixty = fifty . ThisAndNextSiblings ;
var justSixty = sixty . PreviousSibling ;
var result = expression . Children . OfType < ConstantNumber > ( ) . Sum ( n => n . Value ) ;
Tandai node dengan kesalahan, peringatan, dan pesan info:
sixty . AddError ( " Value must be less than 55. " ) ;
var expressionHasErrors = expression . HasErrors ; // true.
Kaitkan node dengan posisinya dalam kode sumber selama penguraian:
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 ) ;
Kesalahan keluaran dengan informasi sumber yang disorot:
var errors = MessageFormatter . FormatErrors ( expression ) ;
// MySource.code (1, 6): Error: Parent Value must be less than 55.
// 50 + 60
// --
Memanipulasi dan menyalin pohon:
sixty . ReplaceWith ( new ConstantNumber ( 55 ) ) ;
var copy = expression . Copy ( ) ;
Dokumentasi lengkap akan tersedia dengan versi 1.0.x.
dotnet add package MrKWatkins.Ast
Saya tidak menerima permintaan penarikan saat ini; proyek ini disesuaikan untuk beberapa proyek saya yang lain dan saya ingin membuatnya dalam kondisi yang sesuai terlebih dahulu.
Jangan ragu untuk mengajukan masalah untuk bug atau saran, tetapi saya tidak menjamin masalah tersebut akan diperhatikan, saya khawatir!
MIT