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
현재로서는 풀 요청을 수락하지 않습니다. 이 프로젝트는 내 다른 프로젝트에 맞게 조정되었으며 먼저 적절한 상태로 만들고 싶습니다.
버그나 제안 사항에 대한 문제를 자유롭게 제기할 수 있지만 해당 내용이 검토될 것이라는 보장은 없습니다.
MIT