Add BlockStatement

This commit is contained in:
Alexander Luzgarev 2020-07-15 09:43:48 +02:00
parent 188dca85d8
commit d613ea3f12
9 changed files with 195 additions and 82 deletions

View File

@ -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<BoundStatement> BindStatementList(SyntaxNodeOrTokenList list)
{
var builder = ImmutableArray.CreateBuilder<BoundStatement>();
@ -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);
}

View File

@ -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<BoundStatement> statements)
: base(syntax)
{
Statements = statements;
}
public override BoundNodeKind Kind => BoundNodeKind.BlockStatement;
public ImmutableArray<BoundStatement> 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<BoundStatement> body, IEnumerable<ElseifClause> elseIfClauses, BoundElseClause? elseClause)
public BoundIfStatement(SyntaxNode syntax, BoundExpression condition, BoundBlockStatement body, IEnumerable<ElseifClause> elseIfClauses, BoundElseClause? elseClause)
: base(syntax)
{
Condition = condition;
@ -219,7 +233,7 @@ namespace Parser.Binding
}
public BoundExpression Condition { get; }
public ImmutableArray<BoundStatement> Body { get; }
public BoundBlockStatement Body { get; }
public IEnumerable<ElseifClause> ElseIfClauses { get; }
public BoundElseClause? ElseClause { get; }
@ -511,7 +525,7 @@ namespace Parser.Binding
public class BoundElseIfClause : BoundNode
{
public BoundElseIfClause(SyntaxNode syntax, BoundExpression condition, ImmutableArray<BoundStatement> 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<BoundStatement> Body { get; }
public BoundBlockStatement Body { get; }
public override BoundNodeKind Kind => BoundNodeKind.ElseIfClause;
}
public class BoundElseClause : BoundNode
{
public BoundElseClause(SyntaxNode syntax, ImmutableArray<BoundStatement> body)
public BoundElseClause(SyntaxNode syntax, BoundBlockStatement body)
: base(syntax)
{
Body = body;
}
public ImmutableArray<BoundStatement> Body { get; }
public BoundBlockStatement Body { get; }
public override BoundNodeKind Kind => BoundNodeKind.ElseClause;
}

View File

@ -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<ElseifClause>();
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,
@ -1191,6 +1191,12 @@ namespace Parser.Internal
return ParseExpressionStatement();
}
private BlockStatementSyntaxNode ParseBlockStatement()
{
var statements = ParseStatementList();
return Factory.BlockStatementSyntax(statements);
}
private SyntaxList ParseStatementList()
{
var builder = new SyntaxListBuilder();

View File

@ -8,7 +8,12 @@ namespace Parser.Internal
return new FileSyntaxNode(statementList, endOfFile);
}
public FunctionDeclarationSyntaxNode FunctionDeclarationSyntax(SyntaxToken functionKeyword, FunctionOutputDescriptionSyntaxNode? outputDescription, SyntaxToken name, FunctionInputDescriptionSyntaxNode? inputDescription, SyntaxList<SyntaxToken> 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<SyntaxToken> 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<SyntaxToken> optionalCommas, SyntaxList body)
public SwitchCaseSyntaxNode SwitchCaseSyntax(SyntaxToken caseKeyword, ExpressionSyntaxNode caseIdentifier, SyntaxList<SyntaxToken> optionalCommas, BlockStatementSyntaxNode body)
{
return new SwitchCaseSyntaxNode(caseKeyword, caseIdentifier, optionalCommas, body);
}
public WhileStatementSyntaxNode WhileStatementSyntax(SyntaxToken whileKeyword, ExpressionSyntaxNode condition, SyntaxList<SyntaxToken> optionalCommas, SyntaxList body, SyntaxToken endKeyword)
public WhileStatementSyntaxNode WhileStatementSyntax(SyntaxToken whileKeyword, ExpressionSyntaxNode condition, SyntaxList<SyntaxToken> optionalCommas, BlockStatementSyntaxNode body, SyntaxToken endKeyword)
{
return new WhileStatementSyntaxNode(whileKeyword, condition, optionalCommas, body, endKeyword);
}
public ElseifClause ElseifClause(SyntaxToken elseifKeyword, ExpressionSyntaxNode condition, SyntaxList<SyntaxToken> optionalCommas, SyntaxList body)
public ElseifClause ElseifClause(SyntaxToken elseifKeyword, ExpressionSyntaxNode condition, SyntaxList<SyntaxToken> 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<SyntaxToken> optionalCommas, SyntaxList body, SyntaxList<ElseifClause> elseifClauses, ElseClause? elseClause, SyntaxToken endKeyword)
public IfStatementSyntaxNode IfStatementSyntax(SyntaxToken ifKeyword, ExpressionSyntaxNode condition, SyntaxList<SyntaxToken> optionalCommas, BlockStatementSyntaxNode body, SyntaxList<ElseifClause> elseifClauses, ElseClause? elseClause, SyntaxToken endKeyword)
{
return new IfStatementSyntaxNode(ifKeyword, condition, optionalCommas, body, elseifClauses, elseClause, endKeyword);
}
public ForStatementSyntaxNode ForStatementSyntax(SyntaxToken forKeyword, AssignmentExpressionSyntaxNode assignment, SyntaxList<SyntaxToken> optionalCommas, SyntaxList body, SyntaxToken endKeyword)
public ForStatementSyntaxNode ForStatementSyntax(SyntaxToken forKeyword, AssignmentExpressionSyntaxNode assignment, SyntaxList<SyntaxToken> 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<SyntaxToken> commas, SyntaxList body, EndKeywordSyntaxNode? endKeyword)
public ConcreteMethodDeclarationSyntaxNode ConcreteMethodDeclarationSyntax(SyntaxToken functionKeyword, FunctionOutputDescriptionSyntaxNode? outputDescription, CompoundNameExpressionSyntaxNode name, FunctionInputDescriptionSyntaxNode? inputDescription, SyntaxList<SyntaxToken> commas, BlockStatementSyntaxNode body, EndKeywordSyntaxNode? endKeyword)
{
return new ConcreteMethodDeclarationSyntaxNode(functionKeyword, outputDescription, name, inputDescription, commas, body, endKeyword);
}

View File

@ -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<SyntaxToken> _commas;
internal readonly SyntaxList _body;
internal readonly BlockStatementSyntaxNode _body;
internal readonly EndKeywordSyntaxNode? _endKeyword;
internal FunctionDeclarationSyntaxNode(SyntaxToken functionKeyword, FunctionOutputDescriptionSyntaxNode? outputDescription, SyntaxToken name, FunctionInputDescriptionSyntaxNode? inputDescription, SyntaxList<SyntaxToken> commas, SyntaxList body, EndKeywordSyntaxNode? endKeyword): base(TokenKind.FunctionDeclaration)
internal FunctionDeclarationSyntaxNode(SyntaxToken functionKeyword, FunctionOutputDescriptionSyntaxNode? outputDescription, SyntaxToken name, FunctionInputDescriptionSyntaxNode? inputDescription, SyntaxList<SyntaxToken> 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<SyntaxToken> commas, SyntaxList body, EndKeywordSyntaxNode? endKeyword, TokenDiagnostic[] diagnostics): base(TokenKind.FunctionDeclaration, diagnostics)
internal FunctionDeclarationSyntaxNode(SyntaxToken functionKeyword, FunctionOutputDescriptionSyntaxNode? outputDescription, SyntaxToken name, FunctionInputDescriptionSyntaxNode? inputDescription, SyntaxList<SyntaxToken> 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<SyntaxToken> _optionalCommas;
internal readonly SyntaxList _body;
internal SwitchCaseSyntaxNode(SyntaxToken caseKeyword, ExpressionSyntaxNode caseIdentifier, SyntaxList<SyntaxToken> optionalCommas, SyntaxList body): base(TokenKind.SwitchCase)
internal readonly BlockStatementSyntaxNode _body;
internal SwitchCaseSyntaxNode(SyntaxToken caseKeyword, ExpressionSyntaxNode caseIdentifier, SyntaxList<SyntaxToken> 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<SyntaxToken> optionalCommas, SyntaxList body, TokenDiagnostic[] diagnostics): base(TokenKind.SwitchCase, diagnostics)
internal SwitchCaseSyntaxNode(SyntaxToken caseKeyword, ExpressionSyntaxNode caseIdentifier, SyntaxList<SyntaxToken> 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<SyntaxToken> _optionalCommas;
internal readonly SyntaxList _body;
internal readonly BlockStatementSyntaxNode _body;
internal readonly SyntaxToken _endKeyword;
internal WhileStatementSyntaxNode(SyntaxToken whileKeyword, ExpressionSyntaxNode condition, SyntaxList<SyntaxToken> optionalCommas, SyntaxList body, SyntaxToken endKeyword): base(TokenKind.WhileStatement)
internal WhileStatementSyntaxNode(SyntaxToken whileKeyword, ExpressionSyntaxNode condition, SyntaxList<SyntaxToken> 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<SyntaxToken> optionalCommas, SyntaxList body, SyntaxToken endKeyword, TokenDiagnostic[] diagnostics): base(TokenKind.WhileStatement, diagnostics)
internal WhileStatementSyntaxNode(SyntaxToken whileKeyword, ExpressionSyntaxNode condition, SyntaxList<SyntaxToken> 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<SyntaxToken> _optionalCommas;
internal readonly SyntaxList _body;
internal ElseifClause(SyntaxToken elseifKeyword, ExpressionSyntaxNode condition, SyntaxList<SyntaxToken> optionalCommas, SyntaxList body): base(TokenKind.ElseifClause)
internal readonly BlockStatementSyntaxNode _body;
internal ElseifClause(SyntaxToken elseifKeyword, ExpressionSyntaxNode condition, SyntaxList<SyntaxToken> 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<SyntaxToken> optionalCommas, SyntaxList body, TokenDiagnostic[] diagnostics): base(TokenKind.ElseifClause, diagnostics)
internal ElseifClause(SyntaxToken elseifKeyword, ExpressionSyntaxNode condition, SyntaxList<SyntaxToken> 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<SyntaxToken> _optionalCommas;
internal readonly SyntaxList _body;
internal readonly BlockStatementSyntaxNode _body;
internal readonly SyntaxList<ElseifClause> _elseifClauses;
internal readonly ElseClause? _elseClause;
internal readonly SyntaxToken _endKeyword;
internal IfStatementSyntaxNode(SyntaxToken ifKeyword, ExpressionSyntaxNode condition, SyntaxList<SyntaxToken> optionalCommas, SyntaxList body, SyntaxList<ElseifClause> elseifClauses, ElseClause? elseClause, SyntaxToken endKeyword): base(TokenKind.IfStatement)
internal IfStatementSyntaxNode(SyntaxToken ifKeyword, ExpressionSyntaxNode condition, SyntaxList<SyntaxToken> optionalCommas, BlockStatementSyntaxNode body, SyntaxList<ElseifClause> 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<SyntaxToken> optionalCommas, SyntaxList body, SyntaxList<ElseifClause> elseifClauses, ElseClause? elseClause, SyntaxToken endKeyword, TokenDiagnostic[] diagnostics): base(TokenKind.IfStatement, diagnostics)
internal IfStatementSyntaxNode(SyntaxToken ifKeyword, ExpressionSyntaxNode condition, SyntaxList<SyntaxToken> optionalCommas, BlockStatementSyntaxNode body, SyntaxList<ElseifClause> 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<SyntaxToken> _optionalCommas;
internal readonly SyntaxList _body;
internal readonly BlockStatementSyntaxNode _body;
internal readonly SyntaxToken _endKeyword;
internal ForStatementSyntaxNode(SyntaxToken forKeyword, AssignmentExpressionSyntaxNode assignment, SyntaxList<SyntaxToken> optionalCommas, SyntaxList body, SyntaxToken endKeyword): base(TokenKind.ForStatement)
internal ForStatementSyntaxNode(SyntaxToken forKeyword, AssignmentExpressionSyntaxNode assignment, SyntaxList<SyntaxToken> 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<SyntaxToken> optionalCommas, SyntaxList body, SyntaxToken endKeyword, TokenDiagnostic[] diagnostics): base(TokenKind.ForStatement, diagnostics)
internal ForStatementSyntaxNode(SyntaxToken forKeyword, AssignmentExpressionSyntaxNode assignment, SyntaxList<SyntaxToken> 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<SyntaxToken> _commas;
internal readonly SyntaxList _body;
internal readonly BlockStatementSyntaxNode _body;
internal readonly EndKeywordSyntaxNode? _endKeyword;
internal ConcreteMethodDeclarationSyntaxNode(SyntaxToken functionKeyword, FunctionOutputDescriptionSyntaxNode? outputDescription, CompoundNameExpressionSyntaxNode name, FunctionInputDescriptionSyntaxNode? inputDescription, SyntaxList<SyntaxToken> commas, SyntaxList body, EndKeywordSyntaxNode? endKeyword): base(TokenKind.ConcreteMethodDeclaration)
internal ConcreteMethodDeclarationSyntaxNode(SyntaxToken functionKeyword, FunctionOutputDescriptionSyntaxNode? outputDescription, CompoundNameExpressionSyntaxNode name, FunctionInputDescriptionSyntaxNode? inputDescription, SyntaxList<SyntaxToken> 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<SyntaxToken> commas, SyntaxList body, EndKeywordSyntaxNode? endKeyword, TokenDiagnostic[] diagnostics): base(TokenKind.ConcreteMethodDeclaration, diagnostics)
internal ConcreteMethodDeclarationSyntaxNode(SyntaxToken functionKeyword, FunctionOutputDescriptionSyntaxNode? outputDescription, CompoundNameExpressionSyntaxNode name, FunctionInputDescriptionSyntaxNode? inputDescription, SyntaxList<SyntaxToken> commas, BlockStatementSyntaxNode body, EndKeywordSyntaxNode? endKeyword, TokenDiagnostic[] diagnostics): base(TokenKind.ConcreteMethodDeclaration, diagnostics)
{
Slots = 7;
this.AdjustWidth(functionKeyword);

View File

@ -4,13 +4,16 @@
<Field Type="SyntaxList" Name="statementList" />
<Field Type="SyntaxToken" Name="endOfFile" />
</Class>
<Class Name="BlockStatementSyntaxNode" BaseClass="StatementSyntaxNode" Kind="BlockStatement">
<Field Type="SyntaxList" Name="statements" />
</Class>
<Class Name="FunctionDeclarationSyntaxNode" BaseClass="StatementSyntaxNode" Kind="FunctionDeclaration">
<Field Type="SyntaxToken" Name="functionKeyword" />
<Field Type="FunctionOutputDescriptionSyntaxNode" Name="outputDescription" Nullable="true" />
<Field Type="SyntaxToken" Name="name" />
<Field Type="FunctionInputDescriptionSyntaxNode" Name="inputDescription" Nullable="true"/>
<Field Type="SyntaxList&lt;SyntaxToken&gt;" Name="commas" />
<Field Type="SyntaxList" Name="body" />
<Field Type="BlockStatementSyntaxNode" Name="body" />
<Field Type="EndKeywordSyntaxNode" Name="endKeyword" Nullable="true"/>
</Class>
<Class Name="FunctionOutputDescriptionSyntaxNode" BaseClass="SyntaxNode" Kind="FunctionOutputDescription">
@ -33,30 +36,30 @@
<Field Type="SyntaxToken" Name="caseKeyword" />
<Field Type="ExpressionSyntaxNode" Name="caseIdentifier" />
<Field Type="SyntaxList&lt;SyntaxToken&gt;" Name="optionalCommas" />
<Field Type="SyntaxList" Name="body" />
<Field Type="BlockStatementSyntaxNode" Name="body" />
</Class>
<Class Name="WhileStatementSyntaxNode" BaseClass="StatementSyntaxNode" Kind="WhileStatement">
<Field Type="SyntaxToken" Name="whileKeyword" />
<Field Type="ExpressionSyntaxNode" Name="condition" />
<Field Type="SyntaxList&lt;SyntaxToken&gt;" Name="optionalCommas" />
<Field Type="SyntaxList" Name="body" />
<Field Type="BlockStatementSyntaxNode" Name="body" />
<Field Type="SyntaxToken" Name="endKeyword" />
</Class>
<Class Name="ElseifClause" BaseClass="SyntaxNode" Kind="ElseifClause">
<Field Type="SyntaxToken" Name="elseifKeyword" />
<Field Type="ExpressionSyntaxNode" Name="condition" />
<Field Type="SyntaxList&lt;SyntaxToken&gt;" Name="optionalCommas" />
<Field Type="SyntaxList" Name="body" />
<Field Type="BlockStatementSyntaxNode" Name="body" />
</Class>
<Class Name="ElseClause" BaseClass="SyntaxNode" Kind="ElseClause">
<Field Type="SyntaxToken" Name="elseKeyword" />
<Field Type="SyntaxList" Name="body" />
<Field Type="BlockStatementSyntaxNode" Name="body" />
</Class>
<Class Name="IfStatementSyntaxNode" BaseClass="StatementSyntaxNode" Kind="IfStatement">
<Field Type="SyntaxToken" Name="ifKeyword" />
<Field Type="ExpressionSyntaxNode" Name="condition" />
<Field Type="SyntaxList&lt;SyntaxToken&gt;" Name="optionalCommas" />
<Field Type="SyntaxList" Name="body" />
<Field Type="BlockStatementSyntaxNode" Name="body" />
<Field Type="SyntaxList&lt;ElseifClause&gt;" Name="elseifClauses" />
<Field Type="ElseClause" Name="elseClause" Nullable="true" />
<Field Type="SyntaxToken" Name="endKeyword" />
@ -65,7 +68,7 @@
<Field Type="SyntaxToken" Name="forKeyword" />
<Field Type="AssignmentExpressionSyntaxNode" Name="assignment" />
<Field Type="SyntaxList&lt;SyntaxToken&gt;" Name="optionalCommas" />
<Field Type="SyntaxList" Name="body" />
<Field Type="BlockStatementSyntaxNode" Name="body" />
<Field Type="SyntaxToken" Name="endKeyword" />
</Class>
<Class Name="AssignmentExpressionSyntaxNode" BaseClass="ExpressionSyntaxNode" Kind="AssignmentExpression">
@ -79,7 +82,7 @@
</Class>
<Class Name="TryCatchStatementSyntaxNode" BaseClass="StatementSyntaxNode" Kind="TryCatchStatement">
<Field Type="SyntaxToken" Name="tryKeyword" />
<Field Type="SyntaxList" Name="tryBody" />
<Field Type="BlockStatementSyntaxNode" Name="tryBody" />
<Field Type="CatchClauseSyntaxNode" Name="catchClause" Nullable="true" />
<Field Type="SyntaxToken" Name="endKeyword" />
</Class>
@ -196,7 +199,7 @@
<Field Type="CompoundNameExpressionSyntaxNode" Name="name" />
<Field Type="FunctionInputDescriptionSyntaxNode" Name="inputDescription" Nullable="true"/>
<Field Type="SyntaxList&lt;SyntaxToken&gt;" Name="commas" />
<Field Type="SyntaxList" Name="body" />
<Field Type="BlockStatementSyntaxNode" Name="body" />
<Field Type="EndKeywordSyntaxNode" Name="endKeyword" Nullable="true" />
</Class>
<Class Name="AbstractMethodDeclarationSyntaxNode" BaseClass="MethodDeclarationSyntaxNode" Kind="AbstractMethodDeclaration">

View File

@ -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;
}
}

View File

@ -8,6 +8,11 @@ namespace Parser
DefaultVisit(node);
}
public virtual void VisitBlockStatement(BlockStatementSyntaxNode node)
{
DefaultVisit(node);
}
public virtual void VisitFunctionDeclaration(FunctionDeclarationSyntaxNode node)
{
DefaultVisit(node);

View File

@ -142,6 +142,10 @@
// result = abstractMethod(object)
AbstractMethodDeclaration,
// statement1
// statement2;
BlockStatement,
// classdef MyClass < BaseClass, AnotherBaseClass
// properties
// y