ไลบรารี 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
ฉันไม่ยอมรับคำขอดึงข้อมูลในขณะนี้ โปรเจ็กต์นี้ได้รับการปรับแต่งสำหรับโปรเจ็กต์อื่นๆ ของฉัน และฉันต้องการให้พวกเขาอยู่ในสภาพที่เหมาะสมก่อน
อย่าลังเลที่จะแจ้งปัญหาเกี่ยวกับข้อบกพร่องหรือข้อเสนอแนะ แต่ฉันไม่รับประกันว่าพวกเขาจะถูกตรวจสอบ ฉันเกรงว่า!
เอ็มไอที