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
我目前不接受拉取请求;这个项目是为我的其他一些项目量身定制的,我想首先让它们处于合适的状态。
请随意提出错误或建议的问题,但恐怕我不保证它们会得到关注!
麻省理工学院