From 1511d5d2b8afb7b240ed73036abd8434e279d6c8 Mon Sep 17 00:00:00 2001 From: nub31 Date: Sun, 15 Feb 2026 04:33:21 +0100 Subject: [PATCH] match parsing --- compiler/Parser.cs | 43 +++++++++++++++++++++++++++++++++++++------ compiler/Tokenizer.cs | 3 +++ 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/compiler/Parser.cs b/compiler/Parser.cs index 30a0281..a5217ff 100644 --- a/compiler/Parser.cs +++ b/compiler/Parser.cs @@ -234,15 +234,34 @@ public class Parser return new NodeStatementWhile(TokensFrom(startIndex), condition, thenBlock); } - var target = ParseExpression(); - - if (TryExpectSymbol(Symbol.Equal)) + if (TryExpectKeyword(Keyword.Match)) { - var value = ParseExpression(); - return new NodeStatementAssignment(TokensFrom(startIndex), target, value); + var target = ParseExpression(); + var cases = new List(); + + ExpectSymbol(Symbol.OpenCurly); + while (!TryExpectSymbol(Symbol.CloseCurly)) + { + var caseStartIndex = index; + var name = ExpectIdent(); + var body = ParseStatement(); + cases.Add(new NodeStatementMatch.Case(TokensFrom(caseStartIndex), name, body)); + } + + return new NodeStatementMatch(TokensFrom(startIndex), target, cases); } - return new NodeStatementExpression(TokensFrom(startIndex), target); + { + var target = ParseExpression(); + + if (TryExpectSymbol(Symbol.Equal)) + { + var value = ParseExpression(); + return new NodeStatementAssignment(TokensFrom(startIndex), target, value); + } + + return new NodeStatementExpression(TokensFrom(startIndex), target); + } } private NodeExpression ParseExpression(int minPrecedence = -1) @@ -753,6 +772,18 @@ public class NodeStatementWhile(List tokens, NodeExpression condition, No public NodeStatement Block { get; } = block; } +public class NodeStatementMatch(List tokens, NodeExpression target, List cases) : NodeStatement(tokens) +{ + public NodeExpression Target { get; } = target; + public List Cases { get; } = cases; + + public class Case(List tokens, TokenIdent type, NodeStatement block) : Node(tokens) + { + public TokenIdent Type { get; } = type; + public NodeStatement Block { get; } = block; + } +} + public abstract class NodeExpression(List tokens) : Node(tokens); public class NodeExpressionIntLiteral(List tokens, TokenIntLiteral value) : NodeExpression(tokens) diff --git a/compiler/Tokenizer.cs b/compiler/Tokenizer.cs index ba85704..5d02d51 100644 --- a/compiler/Tokenizer.cs +++ b/compiler/Tokenizer.cs @@ -389,6 +389,7 @@ public class Tokenizer "struct" => new TokenKeyword(line, startColumn, column - startColumn, Keyword.Struct), "packed" => new TokenKeyword(line, startColumn, column - startColumn, Keyword.Packed), "enum" => new TokenKeyword(line, startColumn, column - startColumn, Keyword.Enum), + "match" => new TokenKeyword(line, startColumn, column - startColumn, Keyword.Match), "let" => new TokenKeyword(line, startColumn, column - startColumn, Keyword.Let), "if" => new TokenKeyword(line, startColumn, column - startColumn, Keyword.If), "else" => new TokenKeyword(line, startColumn, column - startColumn, Keyword.Else), @@ -536,6 +537,7 @@ public enum Keyword Struct, Packed, Enum, + Match, Let, If, Else, @@ -601,6 +603,7 @@ public static class TokenExtensions Keyword.Struct => "struct", Keyword.Packed => "packed", Keyword.Enum => "enum", + Keyword.Match => "enum", Keyword.Let => "let", Keyword.If => "if", Keyword.Else => "else",