diff options
| author | Melodi <62381002+Melodi17@users.noreply.github.com> | 2025-08-27 21:22:55 +1000 |
|---|---|---|
| committer | Melodi <62381002+Melodi17@users.noreply.github.com> | 2025-08-27 21:22:55 +1000 |
| commit | 634681ce2bb36cd686943102a0f071cd6a09049f (patch) | |
| tree | 6710047aa231d50f57114bdd54a27c559fb20a73 /Compiler/visitors/Targets.cs | |
| parent | 94ddc02e03ab942d0c881e29053e8df3d2940c30 (diff) | |
fixed bugs and revolutionized the universe
Diffstat (limited to 'Compiler/visitors/Targets.cs')
| -rw-r--r-- | Compiler/visitors/Targets.cs | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/Compiler/visitors/Targets.cs b/Compiler/visitors/Targets.cs new file mode 100644 index 0000000..10d97f4 --- /dev/null +++ b/Compiler/visitors/Targets.cs @@ -0,0 +1,40 @@ +namespace Q1.Compiler.visitors; + +public partial class CCompilerVisitor +{ + private Target VisitTarget(CGrammarParser.TargetContext target) + { + Target? expressionString = this.Visit(target) as Target; + if (expressionString == null) + throw new CompilerException("Target did not return a target"); + + return expressionString; + } + + public override Target VisitVariableTarget(CGrammarParser.VariableTargetContext context) + { + string varName = context.ID().GetText(); + VariableReference reference = this.FindVariable(varName); + + return new Target(reference.Type, $"[${reference.Address:X4}]", $"${reference.Address:X4}"); + } + + public override object? VisitIndexerTarget(CGrammarParser.IndexerTargetContext context) + { + Target obj = this.VisitTarget(context.obj); + if (obj.Type is not CTypePtr ptr) + throw new CompilerException("Indexer target was not a pointer!"); + + this.Instruction($"push {obj.Value}", "store index obj"); + + string indexer = this.VisitExpression(context.indexer); + + this.Instruction($"mov {indexer}, V1", "store indexer"); + this.Instruction($"pop V0", "restore index obj"); + this.Instruction($"mul V1, {ptr.Sub.Size}", $"multiply indexer by {ptr.Sub.Size}"); + this.Instruction($"add AX, V0", "add indexer and index obj"); + this.Instruction($"mov AX, V0", "move to general purpose register"); + + return new Target(ptr.Sub, $"[V0]", $"V0"); + } +}
\ No newline at end of file |
