...
This commit is contained in:
@@ -501,8 +501,11 @@ public class QBEGenerator
|
|||||||
case ReturnNode @return:
|
case ReturnNode @return:
|
||||||
EmitReturn(@return);
|
EmitReturn(@return);
|
||||||
break;
|
break;
|
||||||
case StatementExpressionNode statementExpression:
|
case StatementFuncCallNode statementFuncCall:
|
||||||
EmitExpression(statementExpression.Expression);
|
EmitFuncCall(statementFuncCall.FuncCall);
|
||||||
|
break;
|
||||||
|
case StatementStructFuncCallNode statementStructFuncCall:
|
||||||
|
EmitStructFuncCall(statementStructFuncCall.StructFuncCall);
|
||||||
break;
|
break;
|
||||||
case VariableDeclarationNode variableDeclaration:
|
case VariableDeclarationNode variableDeclaration:
|
||||||
EmitVariableDeclaration(variableDeclaration);
|
EmitVariableDeclaration(variableDeclaration);
|
||||||
|
|||||||
@@ -211,6 +211,8 @@ public sealed class Parser
|
|||||||
|
|
||||||
private StatementSyntax ParseStatement()
|
private StatementSyntax ParseStatement()
|
||||||
{
|
{
|
||||||
|
var startIndex = _tokenIndex;
|
||||||
|
|
||||||
if (CurrentToken is SymbolToken symbol)
|
if (CurrentToken is SymbolToken symbol)
|
||||||
{
|
{
|
||||||
switch (symbol.Symbol)
|
switch (symbol.Symbol)
|
||||||
@@ -236,12 +238,6 @@ public sealed class Parser
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return ParseStatementExpression();
|
|
||||||
}
|
|
||||||
|
|
||||||
private StatementSyntax ParseStatementExpression()
|
|
||||||
{
|
|
||||||
var startIndex = _tokenIndex;
|
|
||||||
var expr = ParseExpression();
|
var expr = ParseExpression();
|
||||||
|
|
||||||
if (TryExpectSymbol(Symbol.Assign))
|
if (TryExpectSymbol(Symbol.Assign))
|
||||||
|
|||||||
@@ -6,7 +6,9 @@ public abstract record TerminalStatementNode : StatementNode;
|
|||||||
|
|
||||||
public record BlockNode(List<StatementNode> Statements) : StatementNode;
|
public record BlockNode(List<StatementNode> Statements) : StatementNode;
|
||||||
|
|
||||||
public record StatementExpressionNode(ExpressionNode Expression) : StatementNode;
|
public record StatementFuncCallNode(FuncCallNode FuncCall) : StatementNode;
|
||||||
|
|
||||||
|
public record StatementStructFuncCallNode(StructFuncCallNode StructFuncCall) : StatementNode;
|
||||||
|
|
||||||
public record ReturnNode(Optional<ExpressionNode> Value) : TerminalStatementNode;
|
public record ReturnNode(Optional<ExpressionNode> Value) : TerminalStatementNode;
|
||||||
|
|
||||||
|
|||||||
@@ -203,9 +203,16 @@ public sealed class TypeChecker
|
|||||||
return new ReturnNode(value);
|
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)
|
private VariableDeclarationNode CheckVariableDeclaration(VariableDeclarationSyntax statement)
|
||||||
|
|||||||
Reference in New Issue
Block a user