This commit is contained in:
2026-02-08 23:11:43 +01:00
parent 3db412a060
commit 3b89b3d9bb
3 changed files with 36 additions and 18 deletions

View File

@@ -4,23 +4,35 @@ namespace Compiler;
public sealed class Parser(string fileName, List<Token> tokens)
{
public static List<NodeDefinition> Parse(string fileName, List<Token> tokens, out List<Diagnostic> diagnostics)
public static Ast Parse(string fileName, List<Token> tokens, out List<Diagnostic> diagnostics)
{
return new Parser(fileName, tokens).Parse(out diagnostics);
}
private int index;
private List<NodeDefinition> Parse(out List<Diagnostic> diagnostics)
private Ast Parse(out List<Diagnostic> diagnostics)
{
var nodes = new List<NodeDefinition>();
var functionDefinitions = new List<NodeDefinitionFunc>();
var structDefinitions = new List<NodeDefinitionStruct>();
diagnostics = [];
try
{
while (Peek() != null)
{
nodes.Add(ParseDefinition());
var definition = ParseDefinition();
switch (definition)
{
case NodeDefinitionFunc def:
functionDefinitions.Add(def);
break;
case NodeDefinitionStruct def:
structDefinitions.Add(def);
break;
default:
throw new ArgumentOutOfRangeException(nameof(definition));
}
}
}
catch (CompileException e)
@@ -28,7 +40,7 @@ public sealed class Parser(string fileName, List<Token> tokens)
diagnostics.Add(e.Diagnostic);
}
return nodes;
return new Ast(structDefinitions, functionDefinitions);
}
private NodeDefinition ParseDefinition()
@@ -504,6 +516,12 @@ public sealed class Parser(string fileName, List<Token> tokens)
}
}
public sealed class Ast(List<NodeDefinitionStruct> structs, List<NodeDefinitionFunc> functions)
{
public readonly List<NodeDefinitionStruct> Structs = structs;
public readonly List<NodeDefinitionFunc> Functions = functions;
}
public abstract class Node(List<Token> tokens)
{
public readonly List<Token> Tokens = tokens;