add: Subprogram declarations and procedure call support.

This commit is contained in:
2024-08-18 11:11:54 +08:00
parent c44b720e09
commit 5acae7d489
12 changed files with 388 additions and 4 deletions

View File

@@ -0,0 +1,14 @@
using CanonSharp.Pascal.Scanner;
namespace CanonSharp.Pascal.SyntaxTree;
public sealed class Parameter(bool isReference, LexicalToken identifier, SyntaxNodeBase typeNode) : SyntaxNodeBase
{
public override SyntaxNodeType NodeType => SyntaxNodeType.Parameter;
public bool IsReference => isReference;
public LexicalToken Identifier => identifier;
public SyntaxNodeBase TypeNode => typeNode;
}

View File

@@ -0,0 +1,18 @@
using CanonSharp.Pascal.Scanner;
namespace CanonSharp.Pascal.SyntaxTree;
public sealed class ProcedureCallNode : SyntaxNodeBase
{
public ProcedureCallNode(LexicalToken identifier, IEnumerable<SyntaxNodeBase> parameters)
{
Identifier = identifier;
Parameters.AddRange(parameters);
}
public override SyntaxNodeType NodeType => SyntaxNodeType.ProcedureCall;
public LexicalToken Identifier { get; }
public List<SyntaxNodeBase> Parameters { get; } = [];
}

View File

@@ -1,6 +1,9 @@
namespace CanonSharp.Pascal.SyntaxTree;
public sealed class ProgramBody(BlockNode constantDeclarations, BlockNode variableDeclarations, BlockNode mainBlock) : SyntaxNodeBase
public sealed class ProgramBody(BlockNode constantDeclarations, BlockNode variableDeclarations,
BlockNode subprograms,
BlockNode mainBlock)
: SyntaxNodeBase
{
public override SyntaxNodeType NodeType => SyntaxNodeType.ProgramBody;
@@ -8,5 +11,7 @@ public sealed class ProgramBody(BlockNode constantDeclarations, BlockNode variab
public BlockNode VariableDeclarations => variableDeclarations;
public BlockNode Subprograms => subprograms;
public BlockNode MainBlock => mainBlock;
}

View File

@@ -0,0 +1,10 @@
namespace CanonSharp.Pascal.SyntaxTree;
public sealed class Subprogram(SubprogramHead subprogramHead, SubprogramBody subprogramBody) : SyntaxNodeBase
{
public override SyntaxNodeType NodeType => SyntaxNodeType.SubProgram;
public SubprogramHead Head => subprogramHead;
public SubprogramBody Body => subprogramBody;
}

View File

@@ -0,0 +1,12 @@
namespace CanonSharp.Pascal.SyntaxTree;
public sealed class SubprogramBody(BlockNode constDeclarations, BlockNode variableDeclarations, BlockNode mainBlock) : SyntaxNodeBase
{
public override SyntaxNodeType NodeType => SyntaxNodeType.SubprogramBody;
public BlockNode ConstDeclarations => constDeclarations;
public BlockNode VariableDeclarations => variableDeclarations;
public BlockNode MainBlock => mainBlock;
}

View File

@@ -0,0 +1,28 @@
using CanonSharp.Pascal.Scanner;
namespace CanonSharp.Pascal.SyntaxTree;
public sealed class SubprogramHead : SyntaxNodeBase
{
public override SyntaxNodeType NodeType => SyntaxNodeType.SubprogramHead;
public LexicalToken Identifier { get; }
public List<Parameter> Parameters { get; } = [];
public SyntaxNodeBase? TypeToken { get; }
public SubprogramHead(LexicalToken identifier, IEnumerable<Parameter> parameters)
{
Identifier = identifier;
Parameters.AddRange(parameters);
TypeToken = null;
}
public SubprogramHead(LexicalToken identifier, IEnumerable<Parameter> parameters, SyntaxNodeBase typeToken) : this(
identifier, parameters)
{
TypeToken = typeToken;
}
}

View File

@@ -17,6 +17,11 @@ public enum SyntaxNodeType
If,
While,
For,
ProcedureCall,
Parameter,
SubprogramHead,
SubprogramBody,
SubProgram,
ProgramBody,
ProgramHead,
Program