add: Subprogram declarations and procedure call support.
This commit is contained in:
14
CanonSharp.Pascal/SyntaxTree/Parameter.cs
Normal file
14
CanonSharp.Pascal/SyntaxTree/Parameter.cs
Normal 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;
|
||||
}
|
18
CanonSharp.Pascal/SyntaxTree/ProcedureCallNode.cs
Normal file
18
CanonSharp.Pascal/SyntaxTree/ProcedureCallNode.cs
Normal 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; } = [];
|
||||
}
|
@@ -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;
|
||||
}
|
||||
|
10
CanonSharp.Pascal/SyntaxTree/Subprogram.cs
Normal file
10
CanonSharp.Pascal/SyntaxTree/Subprogram.cs
Normal 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;
|
||||
}
|
12
CanonSharp.Pascal/SyntaxTree/SubprogramBody.cs
Normal file
12
CanonSharp.Pascal/SyntaxTree/SubprogramBody.cs
Normal 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;
|
||||
}
|
28
CanonSharp.Pascal/SyntaxTree/SubprogramHead.cs
Normal file
28
CanonSharp.Pascal/SyntaxTree/SubprogramHead.cs
Normal 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;
|
||||
}
|
||||
|
||||
}
|
@@ -17,6 +17,11 @@ public enum SyntaxNodeType
|
||||
If,
|
||||
While,
|
||||
For,
|
||||
ProcedureCall,
|
||||
Parameter,
|
||||
SubprogramHead,
|
||||
SubprogramBody,
|
||||
SubProgram,
|
||||
ProgramBody,
|
||||
ProgramHead,
|
||||
Program
|
||||
|
Reference in New Issue
Block a user