chore(octoasm): scaffold project with token and diagnostic types

This commit is contained in:
dualfroz committed 2026-08-25 21:59:28 +02:00
1 parent 05b0cfafbd
commit d3cf619571
3 files changed
+124

No files matched your search

+16
View File
@@ -0,0 +1,16 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>disable</ImplicitUsings>
<Nullable>enable</Nullable>
<RootNamespace>Chip8.OctoAsm</RootNamespace>
<AssemblyName>Chip8.OctoAsm</AssemblyName>
<LangVersion>10</LangVersion>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Chip8.Core\Chip8.Core.csproj" />
</ItemGroup>
</Project>
+57
View File
@@ -0,0 +1,57 @@
using System;
using System.Collections.Generic;
namespace Chip8.OctoAsm;
public enum OctoSeverity
{
Error,
Warning,
}
public readonly struct OctoDiagnostic
{
public OctoDiagnostic(OctoSeverity severity, string message, SourcePosition position)
{
this.severity = severity;
this.message = message;
this.position = position;
}
public OctoSeverity severity { get; }
public string message { get; }
public SourcePosition position { get; }
public int line => position.line;
public int column => position.column;
public override string ToString() =>
severity.ToString().ToLowerInvariant() + " at " + position + ": " + message;
}
public sealed class OctoCompileException : Exception
{
public OctoCompileException(OctoDiagnostic diagnostic)
: this(new[] { diagnostic })
{
}
public OctoCompileException(IReadOnlyList<OctoDiagnostic> diagnostics)
: base(describe(diagnostics))
{
this.diagnostics = diagnostics;
}
public IReadOnlyList<OctoDiagnostic> diagnostics { get; }
public OctoDiagnostic diagnostic => diagnostics[0];
static string describe(IReadOnlyList<OctoDiagnostic> diagnostics)
{
if (diagnostics.Count == 1)
{
return diagnostics[0].ToString();
}
return diagnostics.Count + " Octo compile errors; first: " + diagnostics[0];
}
}
+51
View File
@@ -0,0 +1,51 @@
namespace Chip8.OctoAsm;
public enum OctoTokenKind
{
Word,
Number,
OpenBrace,
CloseBrace,
OpenParen,
CloseParen,
EndOfFile,
}
public readonly struct SourcePosition
{
public SourcePosition(int line, int column)
{
this.line = line;
this.column = column;
}
public int line { get; }
public int column { get; }
public override string ToString() => "line " + line + ", col " + column;
}
public readonly struct OctoToken
{
public OctoToken(OctoTokenKind kind, string text, int value, SourcePosition position)
{
this.kind = kind;
this.text = text;
this.value = value;
this.position = position;
}
public OctoTokenKind kind { get; }
public string text { get; }
public int value { get; }
public SourcePosition position { get; }
public bool isWord(string word) => kind == OctoTokenKind.Word && text == word;
public override string ToString() => kind switch
{
OctoTokenKind.EndOfFile => "<eof>",
OctoTokenKind.Number => "number(" + value + ")",
_ => "'" + text + "'",
};
}