This commit is contained in:
nub31
2025-07-06 20:56:56 +02:00
parent 92ebefd3d6
commit 91e93fa0bf
26 changed files with 94 additions and 170 deletions

View File

@@ -10,8 +10,7 @@
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Generation\Generation.csproj" />
<ProjectReference Include="..\Syntax\Syntax.csproj" />
<ProjectReference Include="..\NubLang\NubLang.csproj" />
</ItemGroup>
<ItemGroup>

View File

@@ -1,12 +1,12 @@
using System.Reflection;
using CLI;
using Generation.QBE;
using Syntax;
using Syntax.Diagnostics;
using Syntax.Node;
using Syntax.Parsing;
using Syntax.Tokenization;
using Binder = Syntax.Binding.Binder;
using NubLang;
using NubLang.Diagnostics;
using NubLang.Generation.QBE;
using NubLang.Syntax.Node;
using NubLang.Syntax.Parsing;
using NubLang.Syntax.Tokenization;
using Binder = NubLang.Syntax.Binding.Binder;
const string BIN_DIR = "bin";
const string INT_DIR = "bin-int";
@@ -207,4 +207,7 @@ async Task<string> CreateBuiltinRuntime()
return runtimePath;
}
internal class RuntimeCreationException(string message) : Exception(message);
namespace CLI
{
internal class RuntimeCreationException(string message) : Exception(message);
}

View File

@@ -1,11 +1,9 @@

Microsoft Visual Studio Solution File, Format Version 12.00
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Syntax", "Syntax\Syntax.csproj", "{5047E21F-590D-4CB3-AFF3-064316485009}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NubLang", "NubLang\NubLang.csproj", "{5047E21F-590D-4CB3-AFF3-064316485009}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CLI", "CLI\CLI.csproj", "{A22F17ED-FA17-45AB-92BA-CD02C28B3524}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Generation", "Generation\Generation.csproj", "{F903F1B9-69A6-4522-B483-81A4B072C8B1}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Common", "Common\Common.csproj", "{91ECE034-32D4-48E6-A905-5F95DB95A3D4}"
EndProject
Global
@@ -22,10 +20,6 @@ Global
{A22F17ED-FA17-45AB-92BA-CD02C28B3524}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A22F17ED-FA17-45AB-92BA-CD02C28B3524}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A22F17ED-FA17-45AB-92BA-CD02C28B3524}.Release|Any CPU.Build.0 = Release|Any CPU
{F903F1B9-69A6-4522-B483-81A4B072C8B1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F903F1B9-69A6-4522-B483-81A4B072C8B1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F903F1B9-69A6-4522-B483-81A4B072C8B1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F903F1B9-69A6-4522-B483-81A4B072C8B1}.Release|Any CPU.Build.0 = Release|Any CPU
{91ECE034-32D4-48E6-A905-5F95DB95A3D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{91ECE034-32D4-48E6-A905-5F95DB95A3D4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{91ECE034-32D4-48E6-A905-5F95DB95A3D4}.Release|Any CPU.ActiveCfg = Release|Any CPU

View File

@@ -1,6 +1,6 @@
using Syntax.Node;
using NubLang.Syntax.Node;
namespace Syntax;
namespace NubLang;
public sealed class DefinitionTable
{

View File

@@ -1,7 +1,7 @@
using System.Text;
using Syntax.Tokenization;
using NubLang.Syntax.Tokenization;
namespace Syntax.Diagnostics;
namespace NubLang.Diagnostics;
public static class ConsoleColors
{

View File

@@ -1,8 +1,8 @@
using System.Text;
using Syntax.Parsing;
using Syntax.Tokenization;
using NubLang.Syntax.Node;
using NubLang.Syntax.Tokenization;
namespace Syntax.Diagnostics;
namespace NubLang.Diagnostics;
public class Diagnostic
{
@@ -25,7 +25,7 @@ public class Diagnostic
return this;
}
public DiagnosticBuilder At(Node.Node node)
public DiagnosticBuilder At(Node node)
{
_sourceSpan = SourceSpan.Merge(node.Tokens.Select(t => t.Span));
return this;

View File

@@ -2,11 +2,10 @@
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.Text;
using Syntax;
using Syntax.Node;
using Syntax.Tokenization;
using NubLang.Syntax.Node;
using NubLang.Syntax.Tokenization;
namespace Generation.QBE;
namespace NubLang.Generation.QBE;
public static class QBEGenerator
{

View File

@@ -1,8 +1,7 @@
using System.Text;
using Syntax;
using Syntax.Node;
using NubLang.Syntax.Node;
namespace Generation.QBE;
namespace NubLang.Generation.QBE;
internal class QBEWriter
{

View File

@@ -1,6 +1,6 @@
using System.Diagnostics.CodeAnalysis;
namespace Syntax;
namespace NubLang;
public abstract class BoundNubType : IEquatable<BoundNubType>
{

View File

@@ -9,7 +9,11 @@
<ItemGroup>
<ProjectReference Include="..\Common\Common.csproj" />
<ProjectReference Include="..\Syntax\Syntax.csproj" />
</ItemGroup>
<ItemGroup>
<Folder Include="Generation\" />
<Folder Include="Syntax\" />
</ItemGroup>
</Project>

View File

@@ -1,29 +1,7 @@
using System.Diagnostics.CodeAnalysis;
namespace Syntax;
namespace NubLang;
public abstract class NubType : IEquatable<NubType>
{
public bool Is8BitInteger => this is NubPrimitiveType { Kind: PrimitiveTypeKind.I8 or PrimitiveTypeKind.U8 };
public bool Is16BitInteger => this is NubPrimitiveType { Kind: PrimitiveTypeKind.I16 or PrimitiveTypeKind.U16 };
public bool Is32BitInteger => this is NubPrimitiveType { Kind: PrimitiveTypeKind.I32 or PrimitiveTypeKind.U32 };
public bool Is64BitInteger => this is NubPrimitiveType { Kind: PrimitiveTypeKind.I64 or PrimitiveTypeKind.U64 };
public bool IsSignedInteger => this is NubPrimitiveType { Kind: PrimitiveTypeKind.I8 or PrimitiveTypeKind.I16 or PrimitiveTypeKind.I32 or PrimitiveTypeKind.I64 };
public bool IsUnsignedInteger => this is NubPrimitiveType { Kind: PrimitiveTypeKind.U8 or PrimitiveTypeKind.U16 or PrimitiveTypeKind.U32 or PrimitiveTypeKind.U64 };
public bool IsInteger => IsSignedInteger || IsUnsignedInteger;
public bool IsFloat32 => this is NubPrimitiveType { Kind: PrimitiveTypeKind.F32 };
public bool IsFloat64 => this is NubPrimitiveType { Kind: PrimitiveTypeKind.F64 };
public bool IsFloat => IsFloat32 || IsFloat64;
public bool IsNumber => IsFloat || IsInteger;
public bool IsVoid => this is NubVoidType;
public bool IsString => this is NubStringType;
public bool IsCString => this is NubCStringType;
public bool IsBool => this is NubPrimitiveType { Kind: PrimitiveTypeKind.Bool };
public override bool Equals(object? obj) => obj is NubType other && Equals(other);
public abstract bool Equals(NubType? other);
@@ -34,25 +12,21 @@ public abstract class NubType : IEquatable<NubType>
public static bool operator !=(NubType? left, NubType? right) => !Equals(left, right);
}
public abstract class NubComplexType : NubType;
public abstract class NubSimpleType : NubType;
public class NubCStringType : NubComplexType
public class NubCStringType : NubType
{
public override string ToString() => "cstring";
public override bool Equals(NubType? other) => other is NubCStringType;
public override int GetHashCode() => HashCode.Combine(typeof(NubCStringType));
}
public class NubStringType : NubComplexType
public class NubStringType : NubType
{
public override string ToString() => "string";
public override bool Equals(NubType? other) => other is NubStringType;
public override int GetHashCode() => HashCode.Combine(typeof(NubStringType));
}
public class NubFuncType(NubType returnType, List<NubType> parameters) : NubSimpleType
public class NubFuncType(NubType returnType, List<NubType> parameters) : NubType
{
public NubType ReturnType { get; } = returnType;
public List<NubType> Parameters { get; } = parameters;
@@ -75,7 +49,7 @@ public class NubFuncType(NubType returnType, List<NubType> parameters) : NubSimp
}
}
public class NubCustomType(string @namespace, string name) : NubComplexType
public class NubCustomType(string @namespace, string name) : NubType
{
public string Namespace { get; } = @namespace;
public string Name { get; } = name;
@@ -86,7 +60,7 @@ public class NubCustomType(string @namespace, string name) : NubComplexType
public override int GetHashCode() => HashCode.Combine(typeof(NubCustomType), Namespace, Name);
}
public class NubPointerType(NubType baseType) : NubSimpleType
public class NubPointerType(NubType baseType) : NubType
{
public NubType BaseType { get; } = baseType;
@@ -96,7 +70,7 @@ public class NubPointerType(NubType baseType) : NubSimpleType
public override int GetHashCode() => HashCode.Combine(typeof(NubPointerType), BaseType);
}
public class NubArrayType(NubType elementType) : NubComplexType
public class NubArrayType(NubType elementType) : NubType
{
public NubType ElementType { get; } = elementType;
@@ -106,53 +80,17 @@ public class NubArrayType(NubType elementType) : NubComplexType
public override int GetHashCode() => HashCode.Combine(typeof(NubArrayType), ElementType);
}
public class NubVoidType : NubSimpleType
public class NubVoidType : NubType
{
public override string ToString() => "void";
public override bool Equals(NubType? other) => other is NubVoidType;
public override int GetHashCode() => HashCode.Combine(typeof(NubVoidType));
}
public class NubPrimitiveType(PrimitiveTypeKind kind) : NubSimpleType
public class NubPrimitiveType(PrimitiveTypeKind kind) : NubType
{
public PrimitiveTypeKind Kind { get; } = kind;
public static NubPrimitiveType I64 => new(PrimitiveTypeKind.I64);
public static NubPrimitiveType I32 => new(PrimitiveTypeKind.I32);
public static NubPrimitiveType I16 => new(PrimitiveTypeKind.I16);
public static NubPrimitiveType I8 => new(PrimitiveTypeKind.I8);
public static NubPrimitiveType U64 => new(PrimitiveTypeKind.U64);
public static NubPrimitiveType U32 => new(PrimitiveTypeKind.U32);
public static NubPrimitiveType U16 => new(PrimitiveTypeKind.U16);
public static NubPrimitiveType U8 => new(PrimitiveTypeKind.U8);
public static NubPrimitiveType F64 => new(PrimitiveTypeKind.F64);
public static NubPrimitiveType F32 => new(PrimitiveTypeKind.F32);
public static NubPrimitiveType Bool => new(PrimitiveTypeKind.Bool);
public static bool TryParse(string s, [NotNullWhen(true)] out PrimitiveTypeKind? kind)
{
kind = s switch
{
"i64" => PrimitiveTypeKind.I64,
"i32" => PrimitiveTypeKind.I32,
"i16" => PrimitiveTypeKind.I16,
"i8" => PrimitiveTypeKind.I8,
"u64" => PrimitiveTypeKind.U64,
"u32" => PrimitiveTypeKind.U32,
"u16" => PrimitiveTypeKind.U16,
"u8" => PrimitiveTypeKind.U8,
"f64" => PrimitiveTypeKind.F64,
"f32" => PrimitiveTypeKind.F32,
"bool" => PrimitiveTypeKind.Bool,
_ => null
};
return kind != null;
}
public override string ToString()
{
return Kind switch

View File

@@ -1,6 +1,6 @@
using System.Diagnostics.CodeAnalysis;
namespace Syntax;
namespace NubLang;
/// <summary>
/// Represents a location in source code with line and column information.

View File

@@ -1,11 +1,11 @@
using System.Diagnostics;
using Common;
using Syntax.Diagnostics;
using Syntax.Node;
using Syntax.Tokenization;
using UnaryExpressionNode = Syntax.Node.UnaryExpressionNode;
using NubLang.Diagnostics;
using NubLang.Syntax.Node;
using NubLang.Syntax.Tokenization;
using Node_UnaryExpressionNode = NubLang.Syntax.Node.UnaryExpressionNode;
namespace Syntax.Binding;
namespace NubLang.Syntax.Binding;
// TODO: Currently anonymous function does not get a new scope
public sealed class Binder
@@ -273,7 +273,7 @@ public sealed class Binder
LiteralNode expression => BindLiteral(expression, expectedType),
MemberAccessNode expression => BindMemberAccess(expression),
StructInitializerNode expression => BindStructInitializer(expression),
UnaryExpressionNode expression => BindUnaryExpression(expression),
Node_UnaryExpressionNode expression => BindUnaryExpression(expression),
_ => throw new ArgumentOutOfRangeException(nameof(node))
};
}
@@ -519,7 +519,7 @@ public sealed class Binder
return new BoundStructInitializerNode(expression.Tokens, BindType(structType), new BoundNubStructType(@struct.Namespace, @struct.Name), initializers);
}
private BoundUnaryExpressionNode BindUnaryExpression(UnaryExpressionNode expression)
private BoundUnaryExpressionNode BindUnaryExpression(Node_UnaryExpressionNode expression)
{
var boundOperand = BindExpression(expression.Operand);

View File

@@ -1,7 +1,7 @@
using Common;
using Syntax.Tokenization;
using NubLang.Syntax.Tokenization;
namespace Syntax.Node;
namespace NubLang.Syntax.Node;
public record FuncParameterNode(IEnumerable<Token> Tokens, string Name, NubType Type) : DefinitionNode(Tokens);
public record BoundFuncParameterNode(IEnumerable<Token> Tokens, string Name, BoundNubType Type) : DefinitionNode(Tokens);

View File

@@ -1,7 +1,7 @@
using Common;
using Syntax.Tokenization;
using NubLang.Syntax.Tokenization;
namespace Syntax.Node;
namespace NubLang.Syntax.Node;
public enum UnaryExpressionOperator
{

View File

@@ -1,6 +1,6 @@
using Syntax.Tokenization;
using NubLang.Syntax.Tokenization;
namespace Syntax.Node;
namespace NubLang.Syntax.Node;
public abstract record Node(IEnumerable<Token> Tokens);
public abstract record BoundNode(IEnumerable<Token> Tokens);

View File

@@ -1,7 +1,7 @@
using Common;
using Syntax.Tokenization;
using NubLang.Syntax.Tokenization;
namespace Syntax.Node;
namespace NubLang.Syntax.Node;
public record StatementNode(IEnumerable<Token> Tokens) : Node(Tokens);

View File

@@ -1,6 +1,6 @@
using Syntax.Diagnostics;
using NubLang.Diagnostics;
namespace Syntax.Node;
namespace NubLang.Syntax.Node;
public record SyntaxTree(string Namespace, IEnumerable<TopLevelNode> TopLevelNodes, IEnumerable<Diagnostic> Diagnostics);
public record BoundSyntaxTree(string Namespace, IEnumerable<BoundTopLevelNode> TopLevelNodes, IEnumerable<Diagnostic> Diagnostics);

View File

@@ -1,10 +1,10 @@
using System.Diagnostics.CodeAnalysis;
using Common;
using Syntax.Diagnostics;
using Syntax.Node;
using Syntax.Tokenization;
using NubLang.Diagnostics;
using NubLang.Syntax.Node;
using NubLang.Syntax.Tokenization;
namespace Syntax.Parsing;
namespace NubLang.Syntax.Parsing;
public sealed class Parser
{
@@ -668,33 +668,35 @@ public sealed class Parser
{
if (TryExpectIdentifier(out var name))
{
if (name.Value == "void")
return name.Value switch
{
return new NubVoidType();
}
"void" => new NubVoidType(),
"string" => new NubStringType(),
"cstring" => new NubCStringType(),
"i64" => new NubPrimitiveType(PrimitiveTypeKind.I64),
"i32" => new NubPrimitiveType(PrimitiveTypeKind.I32),
"i16" => new NubPrimitiveType(PrimitiveTypeKind.I16),
"i8" => new NubPrimitiveType(PrimitiveTypeKind.I8),
"u64" => new NubPrimitiveType(PrimitiveTypeKind.U64),
"u32" => new NubPrimitiveType(PrimitiveTypeKind.U32),
"u16" => new NubPrimitiveType(PrimitiveTypeKind.U16),
"u8" => new NubPrimitiveType(PrimitiveTypeKind.U8),
"f64" => new NubPrimitiveType(PrimitiveTypeKind.F64),
"f32" => new NubPrimitiveType(PrimitiveTypeKind.F32),
"bool" => new NubPrimitiveType(PrimitiveTypeKind.Bool),
_ => ParseCustomType()
};
if (name.Value == "string")
NubCustomType ParseCustomType()
{
return new NubStringType();
}
var @namespace = _namespace;
if (TryExpectSymbol(Symbol.DoubleColon))
{
@namespace = ExpectIdentifier().Value;
}
if (name.Value == "cstring")
{
return new NubCStringType();
return new NubCustomType(@namespace, name.Value);
}
if (NubPrimitiveType.TryParse(name.Value, out var primitiveTypeKind))
{
return new NubPrimitiveType(primitiveTypeKind.Value);
}
var @namespace = _namespace;
if (TryExpectSymbol(Symbol.DoubleColon))
{
@namespace = ExpectIdentifier().Value;
}
return new NubCustomType(@namespace, name.Value);
}
if (TryExpectSymbol(Symbol.Caret))

View File

@@ -1,4 +1,4 @@
namespace Syntax.Tokenization;
namespace NubLang.Syntax.Tokenization;
public class IdentifierToken(SourceSpan span, string value) : Token(span)
{

View File

@@ -1,4 +1,4 @@
namespace Syntax.Tokenization;
namespace NubLang.Syntax.Tokenization;
public class LiteralToken(SourceSpan span, LiteralKind kind, string value) : Token(span)
{

View File

@@ -1,4 +1,4 @@
namespace Syntax.Tokenization;
namespace NubLang.Syntax.Tokenization;
public class ModifierToken(SourceSpan span, Modifier modifier) : Token(span)
{

View File

@@ -1,4 +1,4 @@
namespace Syntax.Tokenization;
namespace NubLang.Syntax.Tokenization;
public class SymbolToken(SourceSpan span, Symbol symbol) : Token(span)
{

View File

@@ -1,4 +1,4 @@
namespace Syntax.Tokenization;
namespace NubLang.Syntax.Tokenization;
public abstract class Token(SourceSpan span)
{

View File

@@ -1,7 +1,7 @@
using Common;
using Syntax.Diagnostics;
using NubLang.Diagnostics;
namespace Syntax.Tokenization;
namespace NubLang.Syntax.Tokenization;
public static class Tokenizer
{

View File

@@ -1,14 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsAotCompatible>true</IsAotCompatible>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Common\Common.csproj" />
</ItemGroup>
</Project>