Ast
v0.9.122
用於在編寫編譯器時建置和操作抽象語法樹的 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
我目前不接受拉取請求;這個項目是為我的其他一些項目量身定制的,我想首先讓它們處於合適的狀態。
請隨意提出錯誤或建議的問題,但恐怕我不保證它們會得到關注!
麻省理工學院