From d4fabdd6c92e13c735b66a9edbeb1510256a32e1 Mon Sep 17 00:00:00 2001 From: nub31 Date: Sat, 20 Sep 2025 02:01:53 +0200 Subject: [PATCH] ... --- compiler/NubLang/Generation/QBE/QBEGenerator.cs | 7 +++++-- compiler/NubLang/Parsing/Parser.cs | 8 ++------ compiler/NubLang/TypeChecking/Node/StatementNode.cs | 4 +++- compiler/NubLang/TypeChecking/TypeChecker.cs | 11 +++++++++-- 4 files changed, 19 insertions(+), 11 deletions(-) diff --git a/compiler/NubLang/Generation/QBE/QBEGenerator.cs b/compiler/NubLang/Generation/QBE/QBEGenerator.cs index 0d97645..588fad7 100644 --- a/compiler/NubLang/Generation/QBE/QBEGenerator.cs +++ b/compiler/NubLang/Generation/QBE/QBEGenerator.cs @@ -501,8 +501,11 @@ public class QBEGenerator case ReturnNode @return: EmitReturn(@return); break; - case StatementExpressionNode statementExpression: - EmitExpression(statementExpression.Expression); + case StatementFuncCallNode statementFuncCall: + EmitFuncCall(statementFuncCall.FuncCall); + break; + case StatementStructFuncCallNode statementStructFuncCall: + EmitStructFuncCall(statementStructFuncCall.StructFuncCall); break; case VariableDeclarationNode variableDeclaration: EmitVariableDeclaration(variableDeclaration); diff --git a/compiler/NubLang/Parsing/Parser.cs b/compiler/NubLang/Parsing/Parser.cs index 0d9640b..1c68d91 100644 --- a/compiler/NubLang/Parsing/Parser.cs +++ b/compiler/NubLang/Parsing/Parser.cs @@ -211,6 +211,8 @@ public sealed class Parser private StatementSyntax ParseStatement() { + var startIndex = _tokenIndex; + if (CurrentToken is SymbolToken symbol) { switch (symbol.Symbol) @@ -236,12 +238,6 @@ public sealed class Parser } } - return ParseStatementExpression(); - } - - private StatementSyntax ParseStatementExpression() - { - var startIndex = _tokenIndex; var expr = ParseExpression(); if (TryExpectSymbol(Symbol.Assign)) diff --git a/compiler/NubLang/TypeChecking/Node/StatementNode.cs b/compiler/NubLang/TypeChecking/Node/StatementNode.cs index 451e92c..3ec3764 100644 --- a/compiler/NubLang/TypeChecking/Node/StatementNode.cs +++ b/compiler/NubLang/TypeChecking/Node/StatementNode.cs @@ -6,7 +6,9 @@ public abstract record TerminalStatementNode : StatementNode; public record BlockNode(List Statements) : StatementNode; -public record StatementExpressionNode(ExpressionNode Expression) : StatementNode; +public record StatementFuncCallNode(FuncCallNode FuncCall) : StatementNode; + +public record StatementStructFuncCallNode(StructFuncCallNode StructFuncCall) : StatementNode; public record ReturnNode(Optional Value) : TerminalStatementNode; diff --git a/compiler/NubLang/TypeChecking/TypeChecker.cs b/compiler/NubLang/TypeChecking/TypeChecker.cs index f4baab4..60c653d 100644 --- a/compiler/NubLang/TypeChecking/TypeChecker.cs +++ b/compiler/NubLang/TypeChecking/TypeChecker.cs @@ -203,9 +203,16 @@ public sealed class TypeChecker return new ReturnNode(value); } - private StatementExpressionNode CheckStatementExpression(StatementExpressionSyntax statement) + private StatementNode CheckStatementExpression(StatementExpressionSyntax statement) { - return new StatementExpressionNode(CheckExpression(statement.Expression)); + var expression = CheckExpression(statement.Expression); + + return expression switch + { + FuncCallNode funcCall => new StatementFuncCallNode(funcCall), + StructFuncCallNode structFuncCall => new StatementStructFuncCallNode(structFuncCall), + _ => throw new TypeCheckerException(Diagnostic.Error("Expressions statements can only be function calls").At(statement).Build()) + }; } private VariableDeclarationNode CheckVariableDeclaration(VariableDeclarationSyntax statement)