Ast
v0.9.122
コンパイラを作成するときに抽象構文ツリーを構築および操作するための C# ライブラリ。
コンパイラーを作成するための Oakley プロジェクトと、それに関連するアセンブラーを作成するための OakAsm プロジェクト (詳細は近日公開) の一環として、C# で抽象構文ツリーを表す必要がありました。このライブラリは、これら 2 つのプロジェクト間でコードを共有できるように作成されました。
抽象構文ツリーの基本ノード タイプを作成します。
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
現時点ではプル リクエストは受け付けていません。このプロジェクトは私の他のプロジェクトに合わせて調整されているため、最初にそれらを適切な状態にしたいと考えています。
バグや提案については自由に問題を提起してください。ただし、それらが検討されるという保証はありません。
マサチューセッツ工科大学