مكتبة C# لبناء ومعالجة أشجار بناء الجملة المجردة عند كتابة المترجمين.
كجزء من مشروع Oakley الخاص بي لإنشاء مترجم ومشروع OakAsm المرتبط به لإنشاء مجمع (ستتوفر التفاصيل قريبًا) كنت بحاجة إلى تمثيل أشجار بناء الجملة المجردة في C#. تم إنشاء هذه المكتبة حتى أتمكن من مشاركة الكود بين هذين المشروعين.
قم بإنشاء نوع العقدة الأساسية لشجرة بناء الجملة المجردة:
public abstract class Expression : Node < Expression >
{
}
إنشاء عقد أكثر تحديدًا:
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 ) ;
}
}
المشي على الشجرة:
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 ) ;
قم بتمييز العقد التي تحتوي على الأخطاء والتحذيرات ورسائل المعلومات:
sixty . AddError ( " Value must be less than 55. " ) ;
var expressionHasErrors = expression . HasErrors ; // true.
ربط العقد بموضعها في الكود المصدري أثناء التحليل:
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 ) ;
أخطاء الإخراج مع معلومات المصدر المميزة:
var errors = MessageFormatter . FormatErrors ( expression ) ;
// MySource.code (1, 6): Error: Parent Value must be less than 55.
// 50 + 60
// --
التعامل مع الشجرة ونسخها:
sixty . ReplaceWith ( new ConstantNumber ( 55 ) ) ;
var copy = expression . Copy ( ) ;
ستكون الوثائق الكاملة متاحة مع الإصدار 1.0.x.
dotnet add package MrKWatkins.Ast
لا أقبل طلبات السحب في الوقت الحالي؛ تم تصميم هذا المشروع لبعض المشاريع الأخرى الخاصة بي وأريد أن أضعها في حالة مناسبة أولاً.
لا تتردد في إثارة المشكلات المتعلقة بالأخطاء أو الاقتراحات، لكنني لا أقدم أي ضمانات بأنه سيتم النظر فيها، أخشى!
معهد ماساتشوستس للتكنولوجيا