diff --git a/Parser/Binding/Binder.cs b/Parser/Binding/Binder.cs index 23fb3fd..820fc76 100644 --- a/Parser/Binding/Binder.cs +++ b/Parser/Binding/Binder.cs @@ -70,7 +70,7 @@ namespace Parser.Binding private BoundIfStatement BindIfStatement(IfStatementSyntaxNode node) { var condition = BindExpression(node.Condition); - var body = BindStatementList(node.Body); + var body = BindBlockStatement(node.Body); var elseIfClauses = node.ElseifClauses .Where(n => n.IsNode) .Select(n => (ElseifClause)n.AsNode()!); @@ -91,10 +91,16 @@ namespace Parser.Binding private BoundElseClause BindElseClause(ElseClause node) { - var body = BindStatementList(node.Body); + var body = BindBlockStatement(node.Body); return new BoundElseClause(node, body); } + private BoundBlockStatement BindBlockStatement(BlockStatementSyntaxNode node) + { + var boundStatements = BindStatementList(node.Statements); + return new BoundBlockStatement(node, boundStatements); + } + private ImmutableArray BindStatementList(SyntaxNodeOrTokenList list) { var builder = ImmutableArray.CreateBuilder(); @@ -124,7 +130,7 @@ namespace Parser.Binding private BoundElseIfClause BindElseIfClause(ElseifClause node) { var condition = BindExpression(node.Condition); - var body = BindStatementList(node.Body); + var body = BindBlockStatement(node.Body); return new BoundElseIfClause(node, condition, body); } diff --git a/Parser/Binding/BoundRoot.cs b/Parser/Binding/BoundRoot.cs index b800a7e..2b7761f 100644 --- a/Parser/Binding/BoundRoot.cs +++ b/Parser/Binding/BoundRoot.cs @@ -13,6 +13,7 @@ namespace Parser.Binding // Statements AbstractMethodDeclaration, + BlockStatement, ClassDeclaration, ConcreteMethodDeclaration, EmptyStatement, @@ -144,6 +145,19 @@ namespace Parser.Binding public override BoundNodeKind Kind => BoundNodeKind.AbstractMethodDeclaration; } + public class BoundBlockStatement : BoundStatement + { + public BoundBlockStatement(SyntaxNode syntax, ImmutableArray statements) + : base(syntax) + { + Statements = statements; + } + + public override BoundNodeKind Kind => BoundNodeKind.BlockStatement; + + public ImmutableArray Statements { get; } + } + public class BoundClassDeclaration : BoundStatement { public BoundClassDeclaration(SyntaxNode syntax) @@ -209,7 +223,7 @@ namespace Parser.Binding public class BoundIfStatement : BoundStatement { - public BoundIfStatement(SyntaxNode syntax, BoundExpression condition, ImmutableArray body, IEnumerable elseIfClauses, BoundElseClause? elseClause) + public BoundIfStatement(SyntaxNode syntax, BoundExpression condition, BoundBlockStatement body, IEnumerable elseIfClauses, BoundElseClause? elseClause) : base(syntax) { Condition = condition; @@ -219,7 +233,7 @@ namespace Parser.Binding } public BoundExpression Condition { get; } - public ImmutableArray Body { get; } + public BoundBlockStatement Body { get; } public IEnumerable ElseIfClauses { get; } public BoundElseClause? ElseClause { get; } @@ -511,7 +525,7 @@ namespace Parser.Binding public class BoundElseIfClause : BoundNode { - public BoundElseIfClause(SyntaxNode syntax, BoundExpression condition, ImmutableArray body) + public BoundElseIfClause(SyntaxNode syntax, BoundExpression condition, BoundBlockStatement body) : base(syntax) { Condition = condition; @@ -519,19 +533,19 @@ namespace Parser.Binding } public BoundExpression Condition { get; } - public ImmutableArray Body { get; } + public BoundBlockStatement Body { get; } public override BoundNodeKind Kind => BoundNodeKind.ElseIfClause; } public class BoundElseClause : BoundNode { - public BoundElseClause(SyntaxNode syntax, ImmutableArray body) + public BoundElseClause(SyntaxNode syntax, BoundBlockStatement body) : base(syntax) { Body = body; } - public ImmutableArray Body { get; } + public BoundBlockStatement Body { get; } public override BoundNodeKind Kind => BoundNodeKind.ElseClause; } diff --git a/Parser/Internal/MParserGreen.cs b/Parser/Internal/MParserGreen.cs index 3566598..e935f8d 100644 --- a/Parser/Internal/MParserGreen.cs +++ b/Parser/Internal/MParserGreen.cs @@ -212,7 +212,7 @@ namespace Parser.Internal var name = EatToken(TokenKind.IdentifierToken); var inputDescription = ParseFunctionInputDescription(); var commas = ParseOptionalCommas(); - var body = ParseStatementList(); + var body = ParseBlockStatement(); var endKeyword = ParseEndKeyword(); //var endKeyword = return Factory.FunctionDeclarationSyntax( @@ -685,8 +685,8 @@ namespace Parser.Internal throw new Exception("Case label cannot be empty."); } var commas = ParseOptionalCommas(); - var statementList = ParseStatementList(); - return Factory.SwitchCaseSyntax(caseKeyword, caseId, commas, statementList); + var body = ParseBlockStatement(); + return Factory.SwitchCaseSyntax(caseKeyword, caseId, commas, body); } private SwitchStatementSyntaxNode ParseSwitchStatement() @@ -722,7 +722,7 @@ namespace Parser.Internal } var commas = ParseOptionalCommas(); - var body = ParseStatementList(); + var body = ParseBlockStatement(); var endKeyword = EatIdentifier("end"); return Factory.WhileStatementSyntax( whileKeyword, @@ -741,14 +741,14 @@ namespace Parser.Internal throw new Exception("Condition in elseif clause cannot be empty."); } var commas = ParseOptionalCommas(); - var body = ParseStatementList(); + var body = ParseBlockStatement(); return Factory.ElseifClause(elseifKeyword, condition, commas, body); } private ElseClause ParseElseClause() { var elseKeyword = EatIdentifier("else"); - var body = ParseStatementList(); + var body = ParseBlockStatement(); return Factory.ElseClause(elseKeyword, body); } @@ -761,7 +761,7 @@ namespace Parser.Internal throw new Exception("Condition in if statement cannot be empty."); } var commas = ParseOptionalSemicolonsOrCommas(); - var body = ParseStatementList(); + var body = ParseBlockStatement(); var elseifClauses = new SyntaxListBuilder(); ElseClause? elseClause = null; while (true) @@ -804,7 +804,7 @@ namespace Parser.Internal var forAssignment = (AssignmentExpressionSyntaxNode) expression; var commas = ParseOptionalSemicolonsOrCommas(); - var body = ParseStatementList(); + var body = ParseBlockStatement(); var endKeyword = EatIdentifier("end"); return Factory.ForStatementSyntax( forKeyword, @@ -831,7 +831,7 @@ namespace Parser.Internal private TryCatchStatementSyntaxNode ParseTryCatchStatement() { var tryKeyword = EatIdentifier("try"); - var tryBody = ParseStatementList(); + var tryBody = ParseBlockStatement(); var catchClause = ParseCatchClause(); var endKeyword = EatIdentifier("end"); return Factory.TryCatchStatementSyntax(tryKeyword, tryBody, catchClause, endKeyword); @@ -927,7 +927,7 @@ namespace Parser.Internal var name = ParseCompoundName(); var inputDescription = ParseFunctionInputDescription(); var commas = ParseOptionalCommas(); - var body = ParseStatementList(); + var body = ParseBlockStatement(); var endKeyword = ParseEndKeyword(); return Factory.ConcreteMethodDeclarationSyntax( functionKeyword, @@ -1190,6 +1190,12 @@ namespace Parser.Internal } return ParseExpressionStatement(); } + + private BlockStatementSyntaxNode ParseBlockStatement() + { + var statements = ParseStatementList(); + return Factory.BlockStatementSyntax(statements); + } private SyntaxList ParseStatementList() { diff --git a/Parser/Internal/SyntaxFactory.Generated.cs b/Parser/Internal/SyntaxFactory.Generated.cs index 709f01b..edfbbb1 100644 --- a/Parser/Internal/SyntaxFactory.Generated.cs +++ b/Parser/Internal/SyntaxFactory.Generated.cs @@ -8,7 +8,12 @@ namespace Parser.Internal return new FileSyntaxNode(statementList, endOfFile); } - public FunctionDeclarationSyntaxNode FunctionDeclarationSyntax(SyntaxToken functionKeyword, FunctionOutputDescriptionSyntaxNode? outputDescription, SyntaxToken name, FunctionInputDescriptionSyntaxNode? inputDescription, SyntaxList commas, SyntaxList body, EndKeywordSyntaxNode? endKeyword) + public BlockStatementSyntaxNode BlockStatementSyntax(SyntaxList statements) + { + return new BlockStatementSyntaxNode(statements); + } + + public FunctionDeclarationSyntaxNode FunctionDeclarationSyntax(SyntaxToken functionKeyword, FunctionOutputDescriptionSyntaxNode? outputDescription, SyntaxToken name, FunctionInputDescriptionSyntaxNode? inputDescription, SyntaxList commas, BlockStatementSyntaxNode body, EndKeywordSyntaxNode? endKeyword) { return new FunctionDeclarationSyntaxNode(functionKeyword, outputDescription, name, inputDescription, commas, body, endKeyword); } @@ -28,32 +33,32 @@ namespace Parser.Internal return new SwitchStatementSyntaxNode(switchKeyword, switchExpression, optionalCommas, cases, endKeyword); } - public SwitchCaseSyntaxNode SwitchCaseSyntax(SyntaxToken caseKeyword, ExpressionSyntaxNode caseIdentifier, SyntaxList optionalCommas, SyntaxList body) + public SwitchCaseSyntaxNode SwitchCaseSyntax(SyntaxToken caseKeyword, ExpressionSyntaxNode caseIdentifier, SyntaxList optionalCommas, BlockStatementSyntaxNode body) { return new SwitchCaseSyntaxNode(caseKeyword, caseIdentifier, optionalCommas, body); } - public WhileStatementSyntaxNode WhileStatementSyntax(SyntaxToken whileKeyword, ExpressionSyntaxNode condition, SyntaxList optionalCommas, SyntaxList body, SyntaxToken endKeyword) + public WhileStatementSyntaxNode WhileStatementSyntax(SyntaxToken whileKeyword, ExpressionSyntaxNode condition, SyntaxList optionalCommas, BlockStatementSyntaxNode body, SyntaxToken endKeyword) { return new WhileStatementSyntaxNode(whileKeyword, condition, optionalCommas, body, endKeyword); } - public ElseifClause ElseifClause(SyntaxToken elseifKeyword, ExpressionSyntaxNode condition, SyntaxList optionalCommas, SyntaxList body) + public ElseifClause ElseifClause(SyntaxToken elseifKeyword, ExpressionSyntaxNode condition, SyntaxList optionalCommas, BlockStatementSyntaxNode body) { return new ElseifClause(elseifKeyword, condition, optionalCommas, body); } - public ElseClause ElseClause(SyntaxToken elseKeyword, SyntaxList body) + public ElseClause ElseClause(SyntaxToken elseKeyword, BlockStatementSyntaxNode body) { return new ElseClause(elseKeyword, body); } - public IfStatementSyntaxNode IfStatementSyntax(SyntaxToken ifKeyword, ExpressionSyntaxNode condition, SyntaxList optionalCommas, SyntaxList body, SyntaxList elseifClauses, ElseClause? elseClause, SyntaxToken endKeyword) + public IfStatementSyntaxNode IfStatementSyntax(SyntaxToken ifKeyword, ExpressionSyntaxNode condition, SyntaxList optionalCommas, BlockStatementSyntaxNode body, SyntaxList elseifClauses, ElseClause? elseClause, SyntaxToken endKeyword) { return new IfStatementSyntaxNode(ifKeyword, condition, optionalCommas, body, elseifClauses, elseClause, endKeyword); } - public ForStatementSyntaxNode ForStatementSyntax(SyntaxToken forKeyword, AssignmentExpressionSyntaxNode assignment, SyntaxList optionalCommas, SyntaxList body, SyntaxToken endKeyword) + public ForStatementSyntaxNode ForStatementSyntax(SyntaxToken forKeyword, AssignmentExpressionSyntaxNode assignment, SyntaxList optionalCommas, BlockStatementSyntaxNode body, SyntaxToken endKeyword) { return new ForStatementSyntaxNode(forKeyword, assignment, optionalCommas, body, endKeyword); } @@ -68,7 +73,7 @@ namespace Parser.Internal return new CatchClauseSyntaxNode(catchKeyword, catchBody); } - public TryCatchStatementSyntaxNode TryCatchStatementSyntax(SyntaxToken tryKeyword, SyntaxList tryBody, CatchClauseSyntaxNode? catchClause, SyntaxToken endKeyword) + public TryCatchStatementSyntaxNode TryCatchStatementSyntax(SyntaxToken tryKeyword, BlockStatementSyntaxNode tryBody, CatchClauseSyntaxNode? catchClause, SyntaxToken endKeyword) { return new TryCatchStatementSyntaxNode(tryKeyword, tryBody, catchClause, endKeyword); } @@ -203,7 +208,7 @@ namespace Parser.Internal return new AttributeListSyntaxNode(openingBracket, nodes, closingBracket); } - public ConcreteMethodDeclarationSyntaxNode ConcreteMethodDeclarationSyntax(SyntaxToken functionKeyword, FunctionOutputDescriptionSyntaxNode? outputDescription, CompoundNameExpressionSyntaxNode name, FunctionInputDescriptionSyntaxNode? inputDescription, SyntaxList commas, SyntaxList body, EndKeywordSyntaxNode? endKeyword) + public ConcreteMethodDeclarationSyntaxNode ConcreteMethodDeclarationSyntax(SyntaxToken functionKeyword, FunctionOutputDescriptionSyntaxNode? outputDescription, CompoundNameExpressionSyntaxNode name, FunctionInputDescriptionSyntaxNode? inputDescription, SyntaxList commas, BlockStatementSyntaxNode body, EndKeywordSyntaxNode? endKeyword) { return new ConcreteMethodDeclarationSyntaxNode(functionKeyword, outputDescription, name, inputDescription, commas, body, endKeyword); } diff --git a/Parser/Internal/SyntaxNode.Generated.cs b/Parser/Internal/SyntaxNode.Generated.cs index b556632..9ca04cc 100644 --- a/Parser/Internal/SyntaxNode.Generated.cs +++ b/Parser/Internal/SyntaxNode.Generated.cs @@ -44,6 +44,44 @@ namespace Parser.Internal } } + internal class BlockStatementSyntaxNode : StatementSyntaxNode + { + internal readonly SyntaxList _statements; + internal BlockStatementSyntaxNode(SyntaxList statements): base(TokenKind.BlockStatement) + { + Slots = 1; + this.AdjustWidth(statements); + _statements = statements; + } + + internal BlockStatementSyntaxNode(SyntaxList statements, TokenDiagnostic[] diagnostics): base(TokenKind.BlockStatement, diagnostics) + { + Slots = 1; + this.AdjustWidth(statements); + _statements = statements; + } + + internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position) + { + return new Parser.BlockStatementSyntaxNode(parent, this, position); + } + + public override GreenNode SetDiagnostics(TokenDiagnostic[] diagnostics) + { + return new BlockStatementSyntaxNode(_statements, diagnostics); + } + + public override GreenNode? GetSlot(int i) + { + return i switch + { + 0 => _statements, _ => null + } + + ; + } + } + internal class FunctionDeclarationSyntaxNode : StatementSyntaxNode { internal readonly SyntaxToken _functionKeyword; @@ -51,9 +89,9 @@ namespace Parser.Internal internal readonly SyntaxToken _name; internal readonly FunctionInputDescriptionSyntaxNode? _inputDescription; internal readonly SyntaxList _commas; - internal readonly SyntaxList _body; + internal readonly BlockStatementSyntaxNode _body; internal readonly EndKeywordSyntaxNode? _endKeyword; - internal FunctionDeclarationSyntaxNode(SyntaxToken functionKeyword, FunctionOutputDescriptionSyntaxNode? outputDescription, SyntaxToken name, FunctionInputDescriptionSyntaxNode? inputDescription, SyntaxList commas, SyntaxList body, EndKeywordSyntaxNode? endKeyword): base(TokenKind.FunctionDeclaration) + internal FunctionDeclarationSyntaxNode(SyntaxToken functionKeyword, FunctionOutputDescriptionSyntaxNode? outputDescription, SyntaxToken name, FunctionInputDescriptionSyntaxNode? inputDescription, SyntaxList commas, BlockStatementSyntaxNode body, EndKeywordSyntaxNode? endKeyword): base(TokenKind.FunctionDeclaration) { Slots = 7; this.AdjustWidth(functionKeyword); @@ -72,7 +110,7 @@ namespace Parser.Internal _endKeyword = endKeyword; } - internal FunctionDeclarationSyntaxNode(SyntaxToken functionKeyword, FunctionOutputDescriptionSyntaxNode? outputDescription, SyntaxToken name, FunctionInputDescriptionSyntaxNode? inputDescription, SyntaxList commas, SyntaxList body, EndKeywordSyntaxNode? endKeyword, TokenDiagnostic[] diagnostics): base(TokenKind.FunctionDeclaration, diagnostics) + internal FunctionDeclarationSyntaxNode(SyntaxToken functionKeyword, FunctionOutputDescriptionSyntaxNode? outputDescription, SyntaxToken name, FunctionInputDescriptionSyntaxNode? inputDescription, SyntaxList commas, BlockStatementSyntaxNode body, EndKeywordSyntaxNode? endKeyword, TokenDiagnostic[] diagnostics): base(TokenKind.FunctionDeclaration, diagnostics) { Slots = 7; this.AdjustWidth(functionKeyword); @@ -266,8 +304,8 @@ namespace Parser.Internal internal readonly SyntaxToken _caseKeyword; internal readonly ExpressionSyntaxNode _caseIdentifier; internal readonly SyntaxList _optionalCommas; - internal readonly SyntaxList _body; - internal SwitchCaseSyntaxNode(SyntaxToken caseKeyword, ExpressionSyntaxNode caseIdentifier, SyntaxList optionalCommas, SyntaxList body): base(TokenKind.SwitchCase) + internal readonly BlockStatementSyntaxNode _body; + internal SwitchCaseSyntaxNode(SyntaxToken caseKeyword, ExpressionSyntaxNode caseIdentifier, SyntaxList optionalCommas, BlockStatementSyntaxNode body): base(TokenKind.SwitchCase) { Slots = 4; this.AdjustWidth(caseKeyword); @@ -280,7 +318,7 @@ namespace Parser.Internal _body = body; } - internal SwitchCaseSyntaxNode(SyntaxToken caseKeyword, ExpressionSyntaxNode caseIdentifier, SyntaxList optionalCommas, SyntaxList body, TokenDiagnostic[] diagnostics): base(TokenKind.SwitchCase, diagnostics) + internal SwitchCaseSyntaxNode(SyntaxToken caseKeyword, ExpressionSyntaxNode caseIdentifier, SyntaxList optionalCommas, BlockStatementSyntaxNode body, TokenDiagnostic[] diagnostics): base(TokenKind.SwitchCase, diagnostics) { Slots = 4; this.AdjustWidth(caseKeyword); @@ -319,9 +357,9 @@ namespace Parser.Internal internal readonly SyntaxToken _whileKeyword; internal readonly ExpressionSyntaxNode _condition; internal readonly SyntaxList _optionalCommas; - internal readonly SyntaxList _body; + internal readonly BlockStatementSyntaxNode _body; internal readonly SyntaxToken _endKeyword; - internal WhileStatementSyntaxNode(SyntaxToken whileKeyword, ExpressionSyntaxNode condition, SyntaxList optionalCommas, SyntaxList body, SyntaxToken endKeyword): base(TokenKind.WhileStatement) + internal WhileStatementSyntaxNode(SyntaxToken whileKeyword, ExpressionSyntaxNode condition, SyntaxList optionalCommas, BlockStatementSyntaxNode body, SyntaxToken endKeyword): base(TokenKind.WhileStatement) { Slots = 5; this.AdjustWidth(whileKeyword); @@ -336,7 +374,7 @@ namespace Parser.Internal _endKeyword = endKeyword; } - internal WhileStatementSyntaxNode(SyntaxToken whileKeyword, ExpressionSyntaxNode condition, SyntaxList optionalCommas, SyntaxList body, SyntaxToken endKeyword, TokenDiagnostic[] diagnostics): base(TokenKind.WhileStatement, diagnostics) + internal WhileStatementSyntaxNode(SyntaxToken whileKeyword, ExpressionSyntaxNode condition, SyntaxList optionalCommas, BlockStatementSyntaxNode body, SyntaxToken endKeyword, TokenDiagnostic[] diagnostics): base(TokenKind.WhileStatement, diagnostics) { Slots = 5; this.AdjustWidth(whileKeyword); @@ -377,8 +415,8 @@ namespace Parser.Internal internal readonly SyntaxToken _elseifKeyword; internal readonly ExpressionSyntaxNode _condition; internal readonly SyntaxList _optionalCommas; - internal readonly SyntaxList _body; - internal ElseifClause(SyntaxToken elseifKeyword, ExpressionSyntaxNode condition, SyntaxList optionalCommas, SyntaxList body): base(TokenKind.ElseifClause) + internal readonly BlockStatementSyntaxNode _body; + internal ElseifClause(SyntaxToken elseifKeyword, ExpressionSyntaxNode condition, SyntaxList optionalCommas, BlockStatementSyntaxNode body): base(TokenKind.ElseifClause) { Slots = 4; this.AdjustWidth(elseifKeyword); @@ -391,7 +429,7 @@ namespace Parser.Internal _body = body; } - internal ElseifClause(SyntaxToken elseifKeyword, ExpressionSyntaxNode condition, SyntaxList optionalCommas, SyntaxList body, TokenDiagnostic[] diagnostics): base(TokenKind.ElseifClause, diagnostics) + internal ElseifClause(SyntaxToken elseifKeyword, ExpressionSyntaxNode condition, SyntaxList optionalCommas, BlockStatementSyntaxNode body, TokenDiagnostic[] diagnostics): base(TokenKind.ElseifClause, diagnostics) { Slots = 4; this.AdjustWidth(elseifKeyword); @@ -428,8 +466,8 @@ namespace Parser.Internal internal class ElseClause : SyntaxNode { internal readonly SyntaxToken _elseKeyword; - internal readonly SyntaxList _body; - internal ElseClause(SyntaxToken elseKeyword, SyntaxList body): base(TokenKind.ElseClause) + internal readonly BlockStatementSyntaxNode _body; + internal ElseClause(SyntaxToken elseKeyword, BlockStatementSyntaxNode body): base(TokenKind.ElseClause) { Slots = 2; this.AdjustWidth(elseKeyword); @@ -438,7 +476,7 @@ namespace Parser.Internal _body = body; } - internal ElseClause(SyntaxToken elseKeyword, SyntaxList body, TokenDiagnostic[] diagnostics): base(TokenKind.ElseClause, diagnostics) + internal ElseClause(SyntaxToken elseKeyword, BlockStatementSyntaxNode body, TokenDiagnostic[] diagnostics): base(TokenKind.ElseClause, diagnostics) { Slots = 2; this.AdjustWidth(elseKeyword); @@ -473,11 +511,11 @@ namespace Parser.Internal internal readonly SyntaxToken _ifKeyword; internal readonly ExpressionSyntaxNode _condition; internal readonly SyntaxList _optionalCommas; - internal readonly SyntaxList _body; + internal readonly BlockStatementSyntaxNode _body; internal readonly SyntaxList _elseifClauses; internal readonly ElseClause? _elseClause; internal readonly SyntaxToken _endKeyword; - internal IfStatementSyntaxNode(SyntaxToken ifKeyword, ExpressionSyntaxNode condition, SyntaxList optionalCommas, SyntaxList body, SyntaxList elseifClauses, ElseClause? elseClause, SyntaxToken endKeyword): base(TokenKind.IfStatement) + internal IfStatementSyntaxNode(SyntaxToken ifKeyword, ExpressionSyntaxNode condition, SyntaxList optionalCommas, BlockStatementSyntaxNode body, SyntaxList elseifClauses, ElseClause? elseClause, SyntaxToken endKeyword): base(TokenKind.IfStatement) { Slots = 7; this.AdjustWidth(ifKeyword); @@ -496,7 +534,7 @@ namespace Parser.Internal _endKeyword = endKeyword; } - internal IfStatementSyntaxNode(SyntaxToken ifKeyword, ExpressionSyntaxNode condition, SyntaxList optionalCommas, SyntaxList body, SyntaxList elseifClauses, ElseClause? elseClause, SyntaxToken endKeyword, TokenDiagnostic[] diagnostics): base(TokenKind.IfStatement, diagnostics) + internal IfStatementSyntaxNode(SyntaxToken ifKeyword, ExpressionSyntaxNode condition, SyntaxList optionalCommas, BlockStatementSyntaxNode body, SyntaxList elseifClauses, ElseClause? elseClause, SyntaxToken endKeyword, TokenDiagnostic[] diagnostics): base(TokenKind.IfStatement, diagnostics) { Slots = 7; this.AdjustWidth(ifKeyword); @@ -541,9 +579,9 @@ namespace Parser.Internal internal readonly SyntaxToken _forKeyword; internal readonly AssignmentExpressionSyntaxNode _assignment; internal readonly SyntaxList _optionalCommas; - internal readonly SyntaxList _body; + internal readonly BlockStatementSyntaxNode _body; internal readonly SyntaxToken _endKeyword; - internal ForStatementSyntaxNode(SyntaxToken forKeyword, AssignmentExpressionSyntaxNode assignment, SyntaxList optionalCommas, SyntaxList body, SyntaxToken endKeyword): base(TokenKind.ForStatement) + internal ForStatementSyntaxNode(SyntaxToken forKeyword, AssignmentExpressionSyntaxNode assignment, SyntaxList optionalCommas, BlockStatementSyntaxNode body, SyntaxToken endKeyword): base(TokenKind.ForStatement) { Slots = 5; this.AdjustWidth(forKeyword); @@ -558,7 +596,7 @@ namespace Parser.Internal _endKeyword = endKeyword; } - internal ForStatementSyntaxNode(SyntaxToken forKeyword, AssignmentExpressionSyntaxNode assignment, SyntaxList optionalCommas, SyntaxList body, SyntaxToken endKeyword, TokenDiagnostic[] diagnostics): base(TokenKind.ForStatement, diagnostics) + internal ForStatementSyntaxNode(SyntaxToken forKeyword, AssignmentExpressionSyntaxNode assignment, SyntaxList optionalCommas, BlockStatementSyntaxNode body, SyntaxToken endKeyword, TokenDiagnostic[] diagnostics): base(TokenKind.ForStatement, diagnostics) { Slots = 5; this.AdjustWidth(forKeyword); @@ -688,10 +726,10 @@ namespace Parser.Internal internal class TryCatchStatementSyntaxNode : StatementSyntaxNode { internal readonly SyntaxToken _tryKeyword; - internal readonly SyntaxList _tryBody; + internal readonly BlockStatementSyntaxNode _tryBody; internal readonly CatchClauseSyntaxNode? _catchClause; internal readonly SyntaxToken _endKeyword; - internal TryCatchStatementSyntaxNode(SyntaxToken tryKeyword, SyntaxList tryBody, CatchClauseSyntaxNode? catchClause, SyntaxToken endKeyword): base(TokenKind.TryCatchStatement) + internal TryCatchStatementSyntaxNode(SyntaxToken tryKeyword, BlockStatementSyntaxNode tryBody, CatchClauseSyntaxNode? catchClause, SyntaxToken endKeyword): base(TokenKind.TryCatchStatement) { Slots = 4; this.AdjustWidth(tryKeyword); @@ -704,7 +742,7 @@ namespace Parser.Internal _endKeyword = endKeyword; } - internal TryCatchStatementSyntaxNode(SyntaxToken tryKeyword, SyntaxList tryBody, CatchClauseSyntaxNode? catchClause, SyntaxToken endKeyword, TokenDiagnostic[] diagnostics): base(TokenKind.TryCatchStatement, diagnostics) + internal TryCatchStatementSyntaxNode(SyntaxToken tryKeyword, BlockStatementSyntaxNode tryBody, CatchClauseSyntaxNode? catchClause, SyntaxToken endKeyword, TokenDiagnostic[] diagnostics): base(TokenKind.TryCatchStatement, diagnostics) { Slots = 4; this.AdjustWidth(tryKeyword); @@ -1878,9 +1916,9 @@ namespace Parser.Internal internal readonly CompoundNameExpressionSyntaxNode _name; internal readonly FunctionInputDescriptionSyntaxNode? _inputDescription; internal readonly SyntaxList _commas; - internal readonly SyntaxList _body; + internal readonly BlockStatementSyntaxNode _body; internal readonly EndKeywordSyntaxNode? _endKeyword; - internal ConcreteMethodDeclarationSyntaxNode(SyntaxToken functionKeyword, FunctionOutputDescriptionSyntaxNode? outputDescription, CompoundNameExpressionSyntaxNode name, FunctionInputDescriptionSyntaxNode? inputDescription, SyntaxList commas, SyntaxList body, EndKeywordSyntaxNode? endKeyword): base(TokenKind.ConcreteMethodDeclaration) + internal ConcreteMethodDeclarationSyntaxNode(SyntaxToken functionKeyword, FunctionOutputDescriptionSyntaxNode? outputDescription, CompoundNameExpressionSyntaxNode name, FunctionInputDescriptionSyntaxNode? inputDescription, SyntaxList commas, BlockStatementSyntaxNode body, EndKeywordSyntaxNode? endKeyword): base(TokenKind.ConcreteMethodDeclaration) { Slots = 7; this.AdjustWidth(functionKeyword); @@ -1899,7 +1937,7 @@ namespace Parser.Internal _endKeyword = endKeyword; } - internal ConcreteMethodDeclarationSyntaxNode(SyntaxToken functionKeyword, FunctionOutputDescriptionSyntaxNode? outputDescription, CompoundNameExpressionSyntaxNode name, FunctionInputDescriptionSyntaxNode? inputDescription, SyntaxList commas, SyntaxList body, EndKeywordSyntaxNode? endKeyword, TokenDiagnostic[] diagnostics): base(TokenKind.ConcreteMethodDeclaration, diagnostics) + internal ConcreteMethodDeclarationSyntaxNode(SyntaxToken functionKeyword, FunctionOutputDescriptionSyntaxNode? outputDescription, CompoundNameExpressionSyntaxNode name, FunctionInputDescriptionSyntaxNode? inputDescription, SyntaxList commas, BlockStatementSyntaxNode body, EndKeywordSyntaxNode? endKeyword, TokenDiagnostic[] diagnostics): base(TokenKind.ConcreteMethodDeclaration, diagnostics) { Slots = 7; this.AdjustWidth(functionKeyword); diff --git a/Parser/SyntaxDefinition.xml b/Parser/SyntaxDefinition.xml index de938f6..1ca6f1f 100644 --- a/Parser/SyntaxDefinition.xml +++ b/Parser/SyntaxDefinition.xml @@ -4,13 +4,16 @@ + + + - + @@ -33,30 +36,30 @@ - + - + - + - + - + @@ -65,7 +68,7 @@ - + @@ -79,7 +82,7 @@ - + @@ -196,7 +199,7 @@ - + diff --git a/Parser/SyntaxNode.Generated.cs b/Parser/SyntaxNode.Generated.cs index fa7b896..b99f89d 100644 --- a/Parser/SyntaxNode.Generated.cs +++ b/Parser/SyntaxNode.Generated.cs @@ -41,6 +41,38 @@ namespace Parser } } + public class BlockStatementSyntaxNode : StatementSyntaxNode + { + private SyntaxNode? _statements; + internal BlockStatementSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position): base(parent, green, position) + { + } + + public SyntaxNodeOrTokenList Statements + { + get + { + var red = this.GetRed(ref this._statements!, 0); + return red is null ? throw new System.Exception("statements cannot be null.") : (SyntaxNodeOrTokenList)red; + } + } + + internal override SyntaxNode? GetNode(int i) + { + return i switch + { + 0 => GetRed(ref _statements!, 0), _ => null + } + + ; + } + + public override void Accept(SyntaxVisitor visitor) + { + visitor.VisitBlockStatement(this); + } + } + public class FunctionDeclarationSyntaxNode : StatementSyntaxNode { private SyntaxNode? _outputDescription; @@ -95,12 +127,12 @@ namespace Parser } } - public SyntaxNodeOrTokenList Body + public BlockStatementSyntaxNode Body { get { var red = this.GetRed(ref this._body!, 5); - return red is null ? throw new System.Exception("body cannot be null.") : (SyntaxNodeOrTokenList)red; + return red is null ? throw new System.Exception("body cannot be null.") : (BlockStatementSyntaxNode)red; } } @@ -320,12 +352,12 @@ namespace Parser } } - public SyntaxNodeOrTokenList Body + public BlockStatementSyntaxNode Body { get { var red = this.GetRed(ref this._body!, 3); - return red is null ? throw new System.Exception("body cannot be null.") : (SyntaxNodeOrTokenList)red; + return red is null ? throw new System.Exception("body cannot be null.") : (BlockStatementSyntaxNode)red; } } @@ -388,12 +420,12 @@ namespace Parser } } - public SyntaxNodeOrTokenList Body + public BlockStatementSyntaxNode Body { get { var red = this.GetRed(ref this._body!, 3); - return red is null ? throw new System.Exception("body cannot be null.") : (SyntaxNodeOrTokenList)red; + return red is null ? throw new System.Exception("body cannot be null.") : (BlockStatementSyntaxNode)red; } } @@ -448,12 +480,12 @@ namespace Parser } } - public SyntaxNodeOrTokenList Body + public BlockStatementSyntaxNode Body { get { var red = this.GetRed(ref this._body!, 3); - return red is null ? throw new System.Exception("body cannot be null.") : (SyntaxNodeOrTokenList)red; + return red is null ? throw new System.Exception("body cannot be null.") : (BlockStatementSyntaxNode)red; } } @@ -488,12 +520,12 @@ namespace Parser } } - public SyntaxNodeOrTokenList Body + public BlockStatementSyntaxNode Body { get { var red = this.GetRed(ref this._body!, 1); - return red is null ? throw new System.Exception("body cannot be null.") : (SyntaxNodeOrTokenList)red; + return red is null ? throw new System.Exception("body cannot be null.") : (BlockStatementSyntaxNode)red; } } @@ -558,12 +590,12 @@ namespace Parser } } - public SyntaxNodeOrTokenList Body + public BlockStatementSyntaxNode Body { get { var red = this.GetRed(ref this._body!, 3); - return red is null ? throw new System.Exception("body cannot be null.") : (SyntaxNodeOrTokenList)red; + return red is null ? throw new System.Exception("body cannot be null.") : (BlockStatementSyntaxNode)red; } } @@ -644,12 +676,12 @@ namespace Parser } } - public SyntaxNodeOrTokenList Body + public BlockStatementSyntaxNode Body { get { var red = this.GetRed(ref this._body!, 3); - return red is null ? throw new System.Exception("body cannot be null.") : (SyntaxNodeOrTokenList)red; + return red is null ? throw new System.Exception("body cannot be null.") : (BlockStatementSyntaxNode)red; } } @@ -783,12 +815,12 @@ namespace Parser } } - public SyntaxNodeOrTokenList TryBody + public BlockStatementSyntaxNode TryBody { get { var red = this.GetRed(ref this._tryBody!, 1); - return red is null ? throw new System.Exception("tryBody cannot be null.") : (SyntaxNodeOrTokenList)red; + return red is null ? throw new System.Exception("tryBody cannot be null.") : (BlockStatementSyntaxNode)red; } } @@ -1935,12 +1967,12 @@ namespace Parser } } - public SyntaxNodeOrTokenList Body + public BlockStatementSyntaxNode Body { get { var red = this.GetRed(ref this._body!, 5); - return red is null ? throw new System.Exception("body cannot be null.") : (SyntaxNodeOrTokenList)red; + return red is null ? throw new System.Exception("body cannot be null.") : (BlockStatementSyntaxNode)red; } } diff --git a/Parser/SyntaxVisitor.Generated.cs b/Parser/SyntaxVisitor.Generated.cs index d023690..7249d3b 100644 --- a/Parser/SyntaxVisitor.Generated.cs +++ b/Parser/SyntaxVisitor.Generated.cs @@ -8,6 +8,11 @@ namespace Parser DefaultVisit(node); } + public virtual void VisitBlockStatement(BlockStatementSyntaxNode node) + { + DefaultVisit(node); + } + public virtual void VisitFunctionDeclaration(FunctionDeclarationSyntaxNode node) { DefaultVisit(node); diff --git a/Parser/TokenKind.cs b/Parser/TokenKind.cs index c1b403e..4645763 100644 --- a/Parser/TokenKind.cs +++ b/Parser/TokenKind.cs @@ -142,6 +142,10 @@ // result = abstractMethod(object) AbstractMethodDeclaration, + // statement1 + // statement2; + BlockStatement, + // classdef MyClass < BaseClass, AnotherBaseClass // properties // y